mirror of
https://github.com/DrKLO/Telegram.git
synced 2024-12-22 06:25:14 +01:00
update to 10.5.0 (4228)
This commit is contained in:
parent
33a48d8945
commit
a746a072dc
368 changed files with 26674 additions and 3963 deletions
|
@ -46,6 +46,16 @@ dependencies {
|
||||||
implementation 'com.google.code.gson:gson:2.10'
|
implementation 'com.google.code.gson:gson:2.10'
|
||||||
implementation 'com.google.guava:guava:31.1-android'
|
implementation 'com.google.guava:guava:31.1-android'
|
||||||
|
|
||||||
|
implementation 'com.google.android.gms:play-services-mlkit-subject-segmentation:16.0.0-beta1'
|
||||||
|
constraints {
|
||||||
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
|
||||||
|
because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")
|
||||||
|
}
|
||||||
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") {
|
||||||
|
because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +118,7 @@ android {
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
||||||
ndk.debugSymbolLevel = 'FULL'
|
ndk.debugSymbolLevel = 'FULL'
|
||||||
|
buildConfigField "String", "BUILD_VERSION_STRING", "\"" + APP_VERSION_NAME + "\""
|
||||||
buildConfigField "String", "APP_CENTER_HASH", "\"\""
|
buildConfigField "String", "APP_CENTER_HASH", "\"\""
|
||||||
buildConfigField "boolean", "DEBUG_VERSION", "true"
|
buildConfigField "boolean", "DEBUG_VERSION", "true"
|
||||||
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "true"
|
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "true"
|
||||||
|
@ -121,6 +132,7 @@ android {
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
||||||
ndk.debugSymbolLevel = 'FULL'
|
ndk.debugSymbolLevel = 'FULL'
|
||||||
|
buildConfigField "String", "BUILD_VERSION_STRING", "\"" + APP_VERSION_NAME + "\""
|
||||||
buildConfigField "String", "APP_CENTER_HASH", "\"" + getProps("APP_CENTER_HASH_PRIVATE") + "\""
|
buildConfigField "String", "APP_CENTER_HASH", "\"" + getProps("APP_CENTER_HASH_PRIVATE") + "\""
|
||||||
buildConfigField "boolean", "DEBUG_VERSION", "true"
|
buildConfigField "boolean", "DEBUG_VERSION", "true"
|
||||||
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "true"
|
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "true"
|
||||||
|
@ -134,6 +146,7 @@ android {
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
||||||
ndk.debugSymbolLevel = 'FULL'
|
ndk.debugSymbolLevel = 'FULL'
|
||||||
|
buildConfigField "String", "BUILD_VERSION_STRING", "\"" + APP_VERSION_NAME + "\""
|
||||||
buildConfigField "String", "APP_CENTER_HASH", "\"" + getProps("APP_CENTER_HASH_PUBLIC") + "\""
|
buildConfigField "String", "APP_CENTER_HASH", "\"" + getProps("APP_CENTER_HASH_PUBLIC") + "\""
|
||||||
buildConfigField "boolean", "DEBUG_VERSION", "true"
|
buildConfigField "boolean", "DEBUG_VERSION", "true"
|
||||||
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "false"
|
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "false"
|
||||||
|
@ -147,6 +160,7 @@ android {
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
||||||
ndk.debugSymbolLevel = 'FULL'
|
ndk.debugSymbolLevel = 'FULL'
|
||||||
|
buildConfigField "String", "BUILD_VERSION_STRING", "\"" + APP_VERSION_NAME + "\""
|
||||||
buildConfigField "String", "APP_CENTER_HASH", "\"" + getProps("APP_CENTER_HASH_HARDCORE") + "\""
|
buildConfigField "String", "APP_CENTER_HASH", "\"" + getProps("APP_CENTER_HASH_HARDCORE") + "\""
|
||||||
buildConfigField "boolean", "DEBUG_VERSION", "true"
|
buildConfigField "boolean", "DEBUG_VERSION", "true"
|
||||||
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "true"
|
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "true"
|
||||||
|
@ -160,6 +174,7 @@ android {
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
||||||
ndk.debugSymbolLevel = 'FULL'
|
ndk.debugSymbolLevel = 'FULL'
|
||||||
|
buildConfigField "String", "BUILD_VERSION_STRING", "\"" + APP_VERSION_NAME + "\""
|
||||||
buildConfigField "String", "APP_CENTER_HASH", "\"\""
|
buildConfigField "String", "APP_CENTER_HASH", "\"\""
|
||||||
buildConfigField "boolean", "DEBUG_VERSION", "false"
|
buildConfigField "boolean", "DEBUG_VERSION", "false"
|
||||||
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "false"
|
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "false"
|
||||||
|
@ -174,6 +189,7 @@ android {
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../TMessagesProj/proguard-rules.pro'
|
||||||
ndk.debugSymbolLevel = 'FULL'
|
ndk.debugSymbolLevel = 'FULL'
|
||||||
|
buildConfigField "String", "BUILD_VERSION_STRING", "\"" + APP_VERSION_NAME + "\""
|
||||||
buildConfigField "String", "APP_CENTER_HASH", "\"\""
|
buildConfigField "String", "APP_CENTER_HASH", "\"\""
|
||||||
buildConfigField "boolean", "DEBUG_VERSION", "false"
|
buildConfigField "boolean", "DEBUG_VERSION", "false"
|
||||||
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "false"
|
buildConfigField "boolean", "DEBUG_PRIVATE_VERSION", "false"
|
||||||
|
|
|
@ -1186,6 +1186,7 @@ std::vector<std::pair<float, float>> gatherPositions(std::vector<std::pair<float
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_local static float *pixelCache = nullptr;
|
thread_local static float *pixelCache = nullptr;
|
||||||
|
thread_local static int pixelCacheSize = 0;
|
||||||
|
|
||||||
JNIEXPORT void Java_org_telegram_messenger_Utilities_generateGradient(JNIEnv *env, jclass clazz, jobject bitmap, jboolean unpin, jint phase, jfloat progress, jint width, jint height, jint stride, jintArray colors) {
|
JNIEXPORT void Java_org_telegram_messenger_Utilities_generateGradient(JNIEnv *env, jclass clazz, jobject bitmap, jboolean unpin, jint phase, jfloat progress, jint width, jint height, jint stride, jintArray colors) {
|
||||||
if (!bitmap) {
|
if (!bitmap) {
|
||||||
|
@ -1221,6 +1222,13 @@ JNIEXPORT void Java_org_telegram_messenger_Utilities_generateGradient(JNIEnv *en
|
||||||
|
|
||||||
auto colorsArray = (uint8_t *) env->GetIntArrayElements(colors, nullptr);
|
auto colorsArray = (uint8_t *) env->GetIntArrayElements(colors, nullptr);
|
||||||
float *newPixelCache = nullptr;
|
float *newPixelCache = nullptr;
|
||||||
|
|
||||||
|
if (width * height != pixelCacheSize && pixelCache != nullptr) {
|
||||||
|
delete[] pixelCache;
|
||||||
|
pixelCache = nullptr;
|
||||||
|
}
|
||||||
|
pixelCacheSize = width * height;
|
||||||
|
|
||||||
if (pixelCache == nullptr) {
|
if (pixelCache == nullptr) {
|
||||||
newPixelCache = new float[width * height * 2];
|
newPixelCache = new float[width * height * 2];
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,6 +122,7 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
|
||||||
|
|
||||||
buffer->rewind();
|
buffer->rewind();
|
||||||
|
|
||||||
|
NativeByteBuffer *reuseLater = nullptr;
|
||||||
while (buffer->hasRemaining()) {
|
while (buffer->hasRemaining()) {
|
||||||
if (!hasSomeDataSinceLastConnect) {
|
if (!hasSomeDataSinceLastConnect) {
|
||||||
currentDatacenter->storeCurrentAddressAndPortNum();
|
currentDatacenter->storeCurrentAddressAndPortNum();
|
||||||
|
@ -154,14 +155,11 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
|
||||||
if ((fByte & (1 << 7)) != 0) {
|
if ((fByte & (1 << 7)) != 0) {
|
||||||
buffer->position(mark);
|
buffer->position(mark);
|
||||||
if (buffer->remaining() < 4) {
|
if (buffer->remaining() < 4) {
|
||||||
NativeByteBuffer *reuseLater = restOfTheData;
|
reuseLater = restOfTheData;
|
||||||
restOfTheData = BuffersStorage::getInstance().getFreeBuffer(16384);
|
restOfTheData = BuffersStorage::getInstance().getFreeBuffer(16384);
|
||||||
restOfTheData->writeBytes(buffer);
|
restOfTheData->writeBytes(buffer);
|
||||||
restOfTheData->limit(restOfTheData->position());
|
restOfTheData->limit(restOfTheData->position());
|
||||||
lastPacketLength = 0;
|
lastPacketLength = 0;
|
||||||
if (reuseLater != nullptr) {
|
|
||||||
reuseLater->reuse();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int32_t ackId = buffer->readBigInt32(nullptr) & (~(1 << 31));
|
int32_t ackId = buffer->readBigInt32(nullptr) & (~(1 << 31));
|
||||||
|
@ -175,14 +173,11 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
|
||||||
buffer->position(mark);
|
buffer->position(mark);
|
||||||
if (buffer->remaining() < 4) {
|
if (buffer->remaining() < 4) {
|
||||||
if (restOfTheData == nullptr || (restOfTheData != nullptr && restOfTheData->position() != 0)) {
|
if (restOfTheData == nullptr || (restOfTheData != nullptr && restOfTheData->position() != 0)) {
|
||||||
NativeByteBuffer *reuseLater = restOfTheData;
|
reuseLater = restOfTheData;
|
||||||
restOfTheData = BuffersStorage::getInstance().getFreeBuffer(16384);
|
restOfTheData = BuffersStorage::getInstance().getFreeBuffer(16384);
|
||||||
restOfTheData->writeBytes(buffer);
|
restOfTheData->writeBytes(buffer);
|
||||||
restOfTheData->limit(restOfTheData->position());
|
restOfTheData->limit(restOfTheData->position());
|
||||||
lastPacketLength = 0;
|
lastPacketLength = 0;
|
||||||
if (reuseLater != nullptr) {
|
|
||||||
reuseLater->reuse();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
restOfTheData->position(restOfTheData->limit());
|
restOfTheData->position(restOfTheData->limit());
|
||||||
}
|
}
|
||||||
|
@ -195,14 +190,11 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
|
||||||
} else {
|
} else {
|
||||||
if (buffer->remaining() < 4) {
|
if (buffer->remaining() < 4) {
|
||||||
if (restOfTheData == nullptr || (restOfTheData != nullptr && restOfTheData->position() != 0)) {
|
if (restOfTheData == nullptr || (restOfTheData != nullptr && restOfTheData->position() != 0)) {
|
||||||
NativeByteBuffer *reuseLater = restOfTheData;
|
reuseLater = restOfTheData;
|
||||||
restOfTheData = BuffersStorage::getInstance().getFreeBuffer(16384);
|
restOfTheData = BuffersStorage::getInstance().getFreeBuffer(16384);
|
||||||
restOfTheData->writeBytes(buffer);
|
restOfTheData->writeBytes(buffer);
|
||||||
restOfTheData->limit(restOfTheData->position());
|
restOfTheData->limit(restOfTheData->position());
|
||||||
lastPacketLength = 0;
|
lastPacketLength = 0;
|
||||||
if (reuseLater != nullptr) {
|
|
||||||
reuseLater->reuse();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
restOfTheData->position(restOfTheData->limit());
|
restOfTheData->position(restOfTheData->limit());
|
||||||
}
|
}
|
||||||
|
@ -223,7 +215,7 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
|
||||||
if (currentProtocolType != ProtocolTypeDD && currentProtocolType != ProtocolTypeTLS && currentPacketLength % 4 != 0 || currentPacketLength > 2 * 1024 * 1024) {
|
if (currentProtocolType != ProtocolTypeDD && currentProtocolType != ProtocolTypeTLS && currentPacketLength % 4 != 0 || currentPacketLength > 2 * 1024 * 1024) {
|
||||||
if (LOGS_ENABLED) DEBUG_D("connection(%p, account%u, dc%u, type %d) received invalid packet length", this, currentDatacenter->instanceNum, currentDatacenter->getDatacenterId(), connectionType);
|
if (LOGS_ENABLED) DEBUG_D("connection(%p, account%u, dc%u, type %d) received invalid packet length", this, currentDatacenter->instanceNum, currentDatacenter->getDatacenterId(), connectionType);
|
||||||
reconnect();
|
reconnect();
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentPacketLength < buffer->remaining()) {
|
if (currentPacketLength < buffer->remaining()) {
|
||||||
|
@ -233,8 +225,6 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
|
||||||
} else {
|
} else {
|
||||||
if (LOGS_ENABLED) DEBUG_D("connection(%p, account%u, dc%u, type %d) received packet size less(%u) then message size(%u)", this, currentDatacenter->instanceNum, currentDatacenter->getDatacenterId(), connectionType, buffer->remaining(), currentPacketLength);
|
if (LOGS_ENABLED) DEBUG_D("connection(%p, account%u, dc%u, type %d) received packet size less(%u) then message size(%u)", this, currentDatacenter->instanceNum, currentDatacenter->getDatacenterId(), connectionType, buffer->remaining(), currentPacketLength);
|
||||||
|
|
||||||
NativeByteBuffer *reuseLater = nullptr;
|
|
||||||
|
|
||||||
if (restOfTheData != nullptr && restOfTheData->capacity() < len) {
|
if (restOfTheData != nullptr && restOfTheData->capacity() < len) {
|
||||||
reuseLater = restOfTheData;
|
reuseLater = restOfTheData;
|
||||||
restOfTheData = nullptr;
|
restOfTheData = nullptr;
|
||||||
|
@ -248,10 +238,7 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
|
||||||
restOfTheData->limit(len);
|
restOfTheData->limit(len);
|
||||||
}
|
}
|
||||||
lastPacketLength = len;
|
lastPacketLength = len;
|
||||||
if (reuseLater != nullptr) {
|
break;
|
||||||
reuseLater->reuse();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t old = buffer->limit();
|
uint32_t old = buffer->limit();
|
||||||
|
@ -262,7 +249,7 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
|
||||||
|
|
||||||
if (restOfTheData != nullptr) {
|
if (restOfTheData != nullptr) {
|
||||||
if ((lastPacketLength != 0 && restOfTheData->position() == lastPacketLength) || (lastPacketLength == 0 && !restOfTheData->hasRemaining())) {
|
if ((lastPacketLength != 0 && restOfTheData->position() == lastPacketLength) || (lastPacketLength == 0 && !restOfTheData->hasRemaining())) {
|
||||||
restOfTheData->reuse();
|
reuseLater = restOfTheData;
|
||||||
restOfTheData = nullptr;
|
restOfTheData = nullptr;
|
||||||
} else {
|
} else {
|
||||||
restOfTheData->compact();
|
restOfTheData->compact();
|
||||||
|
@ -276,6 +263,9 @@ void Connection::onReceivedData(NativeByteBuffer *buffer) {
|
||||||
parseLaterBuffer = nullptr;
|
parseLaterBuffer = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (reuseLater != nullptr) {
|
||||||
|
reuseLater->reuse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Connection::connect() {
|
void Connection::connect() {
|
||||||
|
|
|
@ -253,6 +253,54 @@ private:
|
||||||
bool _isMuted = true;
|
bool _isMuted = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
class AudioSinkImpl: public webrtc::AudioSinkInterface {
|
||||||
|
public:
|
||||||
|
AudioSinkImpl(std::function<void(float, float)> update) :
|
||||||
|
_update(update) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~AudioSinkImpl() {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void OnData(const Data& audio) override {
|
||||||
|
if (_update && audio.channels == 1) {
|
||||||
|
const int16_t *samples = (const int16_t *)audio.data;
|
||||||
|
int numberOfSamplesInFrame = (int)audio.samples_per_channel;
|
||||||
|
|
||||||
|
int16_t currentPeak = 0;
|
||||||
|
for (int i = 0; i < numberOfSamplesInFrame; i++) {
|
||||||
|
int16_t sample = samples[i];
|
||||||
|
if (sample < 0) {
|
||||||
|
sample = -sample;
|
||||||
|
}
|
||||||
|
if (_peak < sample) {
|
||||||
|
_peak = sample;
|
||||||
|
}
|
||||||
|
if (currentPeak < sample) {
|
||||||
|
currentPeak = sample;
|
||||||
|
}
|
||||||
|
_peakCount += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_peakCount >= 4400) {
|
||||||
|
float level = ((float)(_peak)) / 8000.0f;
|
||||||
|
_peak = 0;
|
||||||
|
_peakCount = 0;
|
||||||
|
_update(0, level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::function<void(float, float)> _update;
|
||||||
|
|
||||||
|
int _peakCount = 0;
|
||||||
|
uint16_t _peak = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
class IncomingV2AudioChannel : public sigslot::has_slots<> {
|
class IncomingV2AudioChannel : public sigslot::has_slots<> {
|
||||||
public:
|
public:
|
||||||
IncomingV2AudioChannel(
|
IncomingV2AudioChannel(
|
||||||
|
@ -261,6 +309,7 @@ public:
|
||||||
webrtc::RtpTransport *rtpTransport,
|
webrtc::RtpTransport *rtpTransport,
|
||||||
rtc::UniqueRandomIdGenerator *randomIdGenerator,
|
rtc::UniqueRandomIdGenerator *randomIdGenerator,
|
||||||
signaling::MediaContent const &mediaContent,
|
signaling::MediaContent const &mediaContent,
|
||||||
|
std::function<void(float, float)> &&onAudioLevelUpdated,
|
||||||
std::shared_ptr<Threads> threads) :
|
std::shared_ptr<Threads> threads) :
|
||||||
_threads(threads),
|
_threads(threads),
|
||||||
_ssrc(mediaContent.ssrc),
|
_ssrc(mediaContent.ssrc),
|
||||||
|
@ -279,8 +328,6 @@ public:
|
||||||
_audioChannel->SetRtpTransport(rtpTransport);
|
_audioChannel->SetRtpTransport(rtpTransport);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<cricket::AudioCodec> codecs;
|
std::vector<cricket::AudioCodec> codecs;
|
||||||
for (const auto &payloadType : mediaContent.payloadTypes) {
|
for (const auto &payloadType : mediaContent.payloadTypes) {
|
||||||
cricket::AudioCodec codec(payloadType.id, payloadType.name, payloadType.clockrate, 0, payloadType.channels);
|
cricket::AudioCodec codec(payloadType.id, payloadType.name, payloadType.clockrate, 0, payloadType.channels);
|
||||||
|
@ -317,11 +364,14 @@ public:
|
||||||
streamParams.set_stream_ids({ streamId });
|
streamParams.set_stream_ids({ streamId });
|
||||||
incomingAudioDescription->AddStream(streamParams);
|
incomingAudioDescription->AddStream(streamParams);
|
||||||
|
|
||||||
threads->getWorkerThread()->BlockingCall([&]() {
|
threads->getWorkerThread()->BlockingCall([this, &outgoingAudioDescription, &incomingAudioDescription, onAudioLevelUpdated = std::move(onAudioLevelUpdated), ssrc = mediaContent.ssrc]() {
|
||||||
_audioChannel->SetPayloadTypeDemuxingEnabled(false);
|
_audioChannel->SetPayloadTypeDemuxingEnabled(false);
|
||||||
std::string errorDesc;
|
std::string errorDesc;
|
||||||
_audioChannel->SetLocalContent(outgoingAudioDescription.get(), webrtc::SdpType::kOffer, errorDesc);
|
_audioChannel->SetLocalContent(outgoingAudioDescription.get(), webrtc::SdpType::kOffer, errorDesc);
|
||||||
_audioChannel->SetRemoteContent(incomingAudioDescription.get(), webrtc::SdpType::kAnswer, errorDesc);
|
_audioChannel->SetRemoteContent(incomingAudioDescription.get(), webrtc::SdpType::kAnswer, errorDesc);
|
||||||
|
|
||||||
|
std::unique_ptr<AudioSinkImpl> audioLevelSink(new AudioSinkImpl(std::move(onAudioLevelUpdated)));
|
||||||
|
_audioChannel->media_channel()->SetRawAudioSink(ssrc, std::move(audioLevelSink));
|
||||||
});
|
});
|
||||||
|
|
||||||
outgoingAudioDescription.reset();
|
outgoingAudioDescription.reset();
|
||||||
|
@ -1468,6 +1518,9 @@ public:
|
||||||
_rtpTransport,
|
_rtpTransport,
|
||||||
_uniqueRandomIdGenerator.get(),
|
_uniqueRandomIdGenerator.get(),
|
||||||
content,
|
content,
|
||||||
|
[audioLevelUpdated = _audioLevelUpdated](float myLvl, float level) {
|
||||||
|
audioLevelUpdated(myLvl, level);
|
||||||
|
},
|
||||||
_threads
|
_threads
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,8 @@
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||||
|
|
||||||
|
<uses-sdk tools:overrideLibrary="com.google.mlkit.vision.segmentation.subject"/>
|
||||||
|
|
||||||
<queries>
|
<queries>
|
||||||
<package android:name="com.google.android.apps.maps"/>
|
<package android:name="com.google.android.apps.maps"/>
|
||||||
<intent>
|
<intent>
|
||||||
|
@ -266,6 +268,9 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<meta-data android:name="android.service.chooser.chooser_target_service" android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
|
<meta-data android:name="android.service.chooser.chooser_target_service" android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
|
||||||
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />
|
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.mlkit.vision.DEPENDENCIES"
|
||||||
|
android:value="subject_segment" />
|
||||||
</activity>
|
</activity>
|
||||||
<activity-alias
|
<activity-alias
|
||||||
android:name="org.telegram.ui.CallsActivity"
|
android:name="org.telegram.ui.CallsActivity"
|
||||||
|
@ -564,8 +569,8 @@
|
||||||
|
|
||||||
<meta-data android:name="com.google.android.gms.wallet.api.enabled" android:value="true" />
|
<meta-data android:name="com.google.android.gms.wallet.api.enabled" android:value="true" />
|
||||||
|
|
||||||
<meta-data android:name="com.google.android.gms.car.notification.SmallIcon" android:resource="@drawable/ic_player" />
|
<!-- <meta-data android:name="com.google.android.gms.car.notification.SmallIcon" android:resource="@drawable/ic_player" />-->
|
||||||
<meta-data android:name="com.google.android.gms.car.application" android:resource="@xml/automotive_app_desc" />
|
<!-- <meta-data android:name="com.google.android.gms.car.application" android:resource="@xml/automotive_app_desc" />-->
|
||||||
|
|
||||||
<meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="face,barcode" />
|
<meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="face,barcode" />
|
||||||
|
|
||||||
|
|
|
@ -429,7 +429,7 @@ chat_searchPanelText=-8796932
|
||||||
chat_inContactIcon=-1
|
chat_inContactIcon=-1
|
||||||
code_comment=-2130706433
|
code_comment=-2130706433
|
||||||
chat_outCodeBackground=857487708
|
chat_outCodeBackground=857487708
|
||||||
chat_inCodeBackground=856033549
|
chat_inCodeBackground=-1
|
||||||
code_keyword=-27776
|
code_keyword=-27776
|
||||||
code_constant=-27776
|
code_constant=-27776
|
||||||
code_function=-27776
|
code_function=-27776
|
||||||
|
|
|
@ -454,7 +454,7 @@ chat_searchPanelText=-10767620
|
||||||
chat_inContactIcon=-1
|
chat_inContactIcon=-1
|
||||||
code_comment=-2130706433
|
code_comment=-2130706433
|
||||||
chat_outCodeBackground=859062986
|
chat_outCodeBackground=859062986
|
||||||
chat_inCodeBackground=855638016
|
chat_inCodeBackground=-1
|
||||||
code_keyword=-27776
|
code_keyword=-27776
|
||||||
code_constant=-27776
|
code_constant=-27776
|
||||||
code_function=-27776
|
code_function=-27776
|
||||||
|
|
|
@ -5,6 +5,7 @@ import android.animation.AnimatorListenerAdapter;
|
||||||
import android.animation.AnimatorSet;
|
import android.animation.AnimatorSet;
|
||||||
import android.animation.ObjectAnimator;
|
import android.animation.ObjectAnimator;
|
||||||
import android.animation.ValueAnimator;
|
import android.animation.ValueAnimator;
|
||||||
|
import android.util.LongSparseArray;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewPropertyAnimator;
|
import android.view.ViewPropertyAnimator;
|
||||||
import android.view.animation.Interpolator;
|
import android.view.animation.Interpolator;
|
||||||
|
@ -14,11 +15,13 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
|
|
||||||
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
import org.telegram.messenger.BuildVars;
|
import org.telegram.messenger.BuildVars;
|
||||||
import org.telegram.messenger.FileLog;
|
import org.telegram.messenger.FileLog;
|
||||||
import org.telegram.messenger.ImageReceiver;
|
import org.telegram.messenger.ImageReceiver;
|
||||||
import org.telegram.messenger.MessageObject;
|
import org.telegram.messenger.MessageObject;
|
||||||
import org.telegram.messenger.SharedConfig;
|
import org.telegram.messenger.SharedConfig;
|
||||||
|
import org.telegram.messenger.Utilities;
|
||||||
import org.telegram.ui.ActionBar.Theme;
|
import org.telegram.ui.ActionBar.Theme;
|
||||||
import org.telegram.ui.Cells.BotHelpCell;
|
import org.telegram.ui.Cells.BotHelpCell;
|
||||||
import org.telegram.ui.Cells.ChatActionCell;
|
import org.telegram.ui.Cells.ChatActionCell;
|
||||||
|
@ -27,6 +30,7 @@ import org.telegram.ui.ChatActivity;
|
||||||
import org.telegram.ui.Components.ChatGreetingsView;
|
import org.telegram.ui.Components.ChatGreetingsView;
|
||||||
import org.telegram.ui.Components.CubicBezierInterpolator;
|
import org.telegram.ui.Components.CubicBezierInterpolator;
|
||||||
import org.telegram.ui.Components.RecyclerListView;
|
import org.telegram.ui.Components.RecyclerListView;
|
||||||
|
import org.telegram.ui.Components.ThanosEffect;
|
||||||
import org.telegram.ui.TextMessageEnterTransition;
|
import org.telegram.ui.TextMessageEnterTransition;
|
||||||
import org.telegram.ui.VoiceMessageEnterTransition;
|
import org.telegram.ui.VoiceMessageEnterTransition;
|
||||||
|
|
||||||
|
@ -125,9 +129,60 @@ public class ChatListItemAnimator extends DefaultItemAnimator {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// First, remove stuff
|
// First, remove stuff
|
||||||
for (RecyclerView.ViewHolder holder : mPendingRemovals) {
|
boolean hadThanos = false;
|
||||||
animateRemoveImpl(holder);
|
final boolean supportsThanos = getThanosEffectContainer != null && supportsThanosEffectContainer != null && supportsThanosEffectContainer.run();
|
||||||
|
if (supportsThanos) {
|
||||||
|
LongSparseArray<ArrayList<RecyclerView.ViewHolder>> groupsToRemoveWithThanos = null;
|
||||||
|
for (int i = 0; i < mPendingRemovals.size(); ++i) {
|
||||||
|
RecyclerView.ViewHolder holder = mPendingRemovals.get(i);
|
||||||
|
if (toBeSnapped.contains(holder) && holder.itemView instanceof ChatMessageCell && ((ChatMessageCell) holder.itemView).getCurrentMessagesGroup() != null) {
|
||||||
|
MessageObject msg = ((ChatMessageCell) holder.itemView).getMessageObject();
|
||||||
|
if (msg != null && msg.getGroupId() != 0) {
|
||||||
|
if (groupsToRemoveWithThanos == null) {
|
||||||
|
groupsToRemoveWithThanos = new LongSparseArray<>();
|
||||||
}
|
}
|
||||||
|
ArrayList<RecyclerView.ViewHolder> holders = groupsToRemoveWithThanos.get(msg.getGroupId());
|
||||||
|
if (holders == null) {
|
||||||
|
groupsToRemoveWithThanos.put(msg.getGroupId(), holders = new ArrayList<>());
|
||||||
|
}
|
||||||
|
toBeSnapped.remove(holder);
|
||||||
|
mPendingRemovals.remove(i);
|
||||||
|
i--;
|
||||||
|
holders.add(holder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (groupsToRemoveWithThanos != null) {
|
||||||
|
for (int i = 0; i < groupsToRemoveWithThanos.size(); ++i) {
|
||||||
|
// check whether we remove the whole group
|
||||||
|
ArrayList<RecyclerView.ViewHolder> holders = groupsToRemoveWithThanos.valueAt(i);
|
||||||
|
if (holders.size() <= 0) continue;
|
||||||
|
boolean wholeGroup = true;
|
||||||
|
RecyclerView.ViewHolder firstHolder = holders.get(0);
|
||||||
|
if (firstHolder.itemView instanceof ChatMessageCell) {
|
||||||
|
MessageObject.GroupedMessages group = ((ChatMessageCell) firstHolder.itemView).getCurrentMessagesGroup();
|
||||||
|
if (group != null) {
|
||||||
|
wholeGroup = group.messages.size() <= holders.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!wholeGroup) {
|
||||||
|
// not whole group, fallback to prev animation
|
||||||
|
mPendingRemovals.addAll(holders);
|
||||||
|
} else {
|
||||||
|
animateRemoveGroupImpl(holders);
|
||||||
|
hadThanos = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (RecyclerView.ViewHolder holder : mPendingRemovals) {
|
||||||
|
boolean thanos = toBeSnapped.remove(holder) && supportsThanos;
|
||||||
|
animateRemoveImpl(holder, thanos);
|
||||||
|
if (thanos) {
|
||||||
|
hadThanos = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final boolean finalThanos = hadThanos;
|
||||||
mPendingRemovals.clear();
|
mPendingRemovals.clear();
|
||||||
// Next, move stuff
|
// Next, move stuff
|
||||||
if (movesPending) {
|
if (movesPending) {
|
||||||
|
@ -139,7 +194,7 @@ public class ChatListItemAnimator extends DefaultItemAnimator {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
for (MoveInfo moveInfo : moves) {
|
for (MoveInfo moveInfo : moves) {
|
||||||
animateMoveImpl(moveInfo.holder, moveInfo);
|
animateMoveImpl(moveInfo.holder, moveInfo, finalThanos);
|
||||||
}
|
}
|
||||||
moves.clear();
|
moves.clear();
|
||||||
mMovesList.remove(moves);
|
mMovesList.remove(moves);
|
||||||
|
@ -147,7 +202,7 @@ public class ChatListItemAnimator extends DefaultItemAnimator {
|
||||||
};
|
};
|
||||||
if (delayAnimations && removalsPending) {
|
if (delayAnimations && removalsPending) {
|
||||||
View view = moves.get(0).holder.itemView;
|
View view = moves.get(0).holder.itemView;
|
||||||
ViewCompat.postOnAnimationDelayed(view, mover, getMoveAnimationDelay());
|
ViewCompat.postOnAnimationDelayed(view, mover, hadThanos ? 0 : getMoveAnimationDelay());
|
||||||
} else {
|
} else {
|
||||||
mover.run();
|
mover.run();
|
||||||
}
|
}
|
||||||
|
@ -661,6 +716,9 @@ public class ChatListItemAnimator extends DefaultItemAnimator {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void animateMoveImpl(RecyclerView.ViewHolder holder, MoveInfo moveInfo) {
|
protected void animateMoveImpl(RecyclerView.ViewHolder holder, MoveInfo moveInfo) {
|
||||||
|
animateMoveImpl(holder, moveInfo, false);
|
||||||
|
}
|
||||||
|
protected void animateMoveImpl(RecyclerView.ViewHolder holder, MoveInfo moveInfo, boolean withThanos) {
|
||||||
int fromX = moveInfo.fromX;
|
int fromX = moveInfo.fromX;
|
||||||
int fromY = moveInfo.fromY;
|
int fromY = moveInfo.fromY;
|
||||||
int toX = moveInfo.toX;
|
int toX = moveInfo.toX;
|
||||||
|
@ -843,10 +901,12 @@ public class ChatListItemAnimator extends DefaultItemAnimator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (translationInterpolator != null) {
|
if (withThanos) {
|
||||||
|
animatorSet.setInterpolator(CubicBezierInterpolator.EASE_OUT);
|
||||||
|
} else if (translationInterpolator != null) {
|
||||||
animatorSet.setInterpolator(translationInterpolator);
|
animatorSet.setInterpolator(translationInterpolator);
|
||||||
}
|
}
|
||||||
animatorSet.setDuration(getMoveDuration());
|
animatorSet.setDuration((long) (getMoveDuration() * (withThanos ? 1.9f : 1f)));
|
||||||
animatorSet.addListener(new AnimatorListenerAdapter() {
|
animatorSet.addListener(new AnimatorListenerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationStart(Animator animator) {
|
public void onAnimationStart(Animator animator) {
|
||||||
|
@ -1372,20 +1432,28 @@ public class ChatListItemAnimator extends DefaultItemAnimator {
|
||||||
animatorSet.start();
|
animatorSet.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void animateRemoveImpl(final RecyclerView.ViewHolder holder) {
|
protected void animateRemoveImpl(final RecyclerView.ViewHolder holder, boolean thanos) {
|
||||||
if (BuildVars.LOGS_ENABLED) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
FileLog.d("animate remove impl");
|
FileLog.d("animate remove impl " + (thanos ? " with thanos" : ""));
|
||||||
}
|
}
|
||||||
final View view = holder.itemView;
|
final View view = holder.itemView;
|
||||||
mRemoveAnimations.add(holder);
|
mRemoveAnimations.add(holder);
|
||||||
ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.ALPHA, view.getAlpha(), 0f);
|
if (thanos && getThanosEffectContainer != null) {
|
||||||
|
ThanosEffect thanosEffect = getThanosEffectContainer.run();
|
||||||
|
dispatchRemoveStarting(holder);
|
||||||
|
thanosEffect.animate(view, () -> {
|
||||||
|
view.setVisibility(View.VISIBLE);
|
||||||
|
if (mRemoveAnimations.remove(holder)) {
|
||||||
|
dispatchRemoveFinished(holder);
|
||||||
|
dispatchFinishedWhenDone();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.ALPHA, view.getAlpha(), 0f);
|
||||||
dispatchRemoveStarting(holder);
|
dispatchRemoveStarting(holder);
|
||||||
|
|
||||||
animator.setDuration(getRemoveDuration());
|
animator.setDuration(getRemoveDuration());
|
||||||
animator.addListener(
|
animator.addListener(
|
||||||
new AnimatorListenerAdapter() {
|
new AnimatorListenerAdapter() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationEnd(Animator animator) {
|
public void onAnimationEnd(Animator animator) {
|
||||||
animator.removeAllListeners();
|
animator.removeAllListeners();
|
||||||
|
@ -1402,6 +1470,34 @@ public class ChatListItemAnimator extends DefaultItemAnimator {
|
||||||
});
|
});
|
||||||
animators.put(holder, animator);
|
animators.put(holder, animator);
|
||||||
animator.start();
|
animator.start();
|
||||||
|
}
|
||||||
|
recyclerListView.stopScroll();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void animateRemoveGroupImpl(final ArrayList<RecyclerView.ViewHolder> holders) {
|
||||||
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
|
FileLog.d("animate remove group impl with thanos");
|
||||||
|
}
|
||||||
|
mRemoveAnimations.addAll(holders);
|
||||||
|
ThanosEffect thanosEffect = getThanosEffectContainer.run();
|
||||||
|
for (int i = 0; i < holders.size(); ++i) {
|
||||||
|
dispatchRemoveStarting(holders.get(i));
|
||||||
|
}
|
||||||
|
final ArrayList<View> views = new ArrayList<>();
|
||||||
|
for (int i = 0; i < holders.size(); ++i) {
|
||||||
|
views.add(holders.get(i).itemView);
|
||||||
|
}
|
||||||
|
thanosEffect.animateGroup(views, () -> {
|
||||||
|
for (int i = 0; i < views.size(); ++i) {
|
||||||
|
views.get(i).setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
if (mRemoveAnimations.removeAll(holders)) {
|
||||||
|
for (int i = 0; i < holders.size(); ++i) {
|
||||||
|
dispatchRemoveFinished(holders.get(i));
|
||||||
|
}
|
||||||
|
dispatchFinishedWhenDone();
|
||||||
|
}
|
||||||
|
});
|
||||||
recyclerListView.stopScroll();
|
recyclerListView.stopScroll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1502,5 +1598,27 @@ public class ChatListItemAnimator extends DefaultItemAnimator {
|
||||||
int captionX;
|
int captionX;
|
||||||
int captionY;
|
int captionY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final ArrayList<RecyclerView.ViewHolder> toBeSnapped = new ArrayList<>();
|
||||||
|
public void prepareThanos(RecyclerView.ViewHolder viewHolder) {
|
||||||
|
if (viewHolder == null) return;
|
||||||
|
toBeSnapped.add(viewHolder);
|
||||||
|
if (viewHolder.itemView instanceof ChatMessageCell) {
|
||||||
|
MessageObject msg = ((ChatMessageCell) viewHolder.itemView).getMessageObject();
|
||||||
|
if (msg != null) {
|
||||||
|
msg.deletedByThanos = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Utilities.Callback0Return<Boolean> supportsThanosEffectContainer;
|
||||||
|
private Utilities.Callback0Return<ThanosEffect> getThanosEffectContainer;
|
||||||
|
public void setOnSnapMessage(
|
||||||
|
Utilities.Callback0Return<Boolean> supportsThanosEffectContainer,
|
||||||
|
Utilities.Callback0Return<ThanosEffect> getThanosEffectContainer
|
||||||
|
) {
|
||||||
|
this.supportsThanosEffectContainer = supportsThanosEffectContainer;
|
||||||
|
this.getThanosEffectContainer = getThanosEffectContainer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4893,6 +4893,10 @@ public class AndroidUtilities {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateViewVisibilityAnimated(View view, boolean show, float scaleFactor, boolean goneOnHide, boolean animated) {
|
public static void updateViewVisibilityAnimated(View view, boolean show, float scaleFactor, boolean goneOnHide, boolean animated) {
|
||||||
|
updateViewVisibilityAnimated(view, show, scaleFactor, goneOnHide, 1f, animated);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateViewVisibilityAnimated(View view, boolean show, float scaleFactor, boolean goneOnHide, float maxAlpha, boolean animated) {
|
||||||
if (view == null) {
|
if (view == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -4904,7 +4908,7 @@ public class AndroidUtilities {
|
||||||
view.animate().setListener(null).cancel();
|
view.animate().setListener(null).cancel();
|
||||||
view.setVisibility(show ? View.VISIBLE : (goneOnHide ? View.GONE : View.INVISIBLE));
|
view.setVisibility(show ? View.VISIBLE : (goneOnHide ? View.GONE : View.INVISIBLE));
|
||||||
view.setTag(show ? 1 : null);
|
view.setTag(show ? 1 : null);
|
||||||
view.setAlpha(1f);
|
view.setAlpha(maxAlpha);
|
||||||
view.setScaleX(1f);
|
view.setScaleX(1f);
|
||||||
view.setScaleY(1f);
|
view.setScaleY(1f);
|
||||||
} else if (show && view.getTag() == null) {
|
} else if (show && view.getTag() == null) {
|
||||||
|
@ -4915,7 +4919,7 @@ public class AndroidUtilities {
|
||||||
view.setScaleX(scaleFactor);
|
view.setScaleX(scaleFactor);
|
||||||
view.setScaleY(scaleFactor);
|
view.setScaleY(scaleFactor);
|
||||||
}
|
}
|
||||||
view.animate().alpha(1f).scaleY(1f).scaleX(1f).setDuration(150).start();
|
view.animate().alpha(maxAlpha).scaleY(1f).scaleX(1f).setDuration(150).start();
|
||||||
view.setTag(1);
|
view.setTag(1);
|
||||||
} else if (!show && view.getTag() != null) {
|
} else if (!show && view.getTag() != null) {
|
||||||
view.animate().setListener(null).cancel();
|
view.animate().setListener(null).cancel();
|
||||||
|
@ -5112,7 +5116,7 @@ public class AndroidUtilities {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CharSequence replaceCharSequence(String what, CharSequence from, CharSequence obj) {
|
public static SpannableStringBuilder replaceCharSequence(String what, CharSequence from, CharSequence obj) {
|
||||||
SpannableStringBuilder spannableStringBuilder;
|
SpannableStringBuilder spannableStringBuilder;
|
||||||
if (from instanceof SpannableStringBuilder) {
|
if (from instanceof SpannableStringBuilder) {
|
||||||
spannableStringBuilder = (SpannableStringBuilder) from;
|
spannableStringBuilder = (SpannableStringBuilder) from;
|
||||||
|
@ -5241,14 +5245,14 @@ public class AndroidUtilities {
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
}
|
}
|
||||||
Utilities.stackBlurBitmap(bitmap, Math.max((int) amount, Math.max(w, h) / 180));
|
Utilities.stackBlurBitmap(bitmap, Math.max((int) amount, Math.max(w, h) / 180));
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
// AndroidUtilities.runOnUIThread(() -> {
|
||||||
onBitmapDone.run(bitmap);
|
onBitmapDone.run(bitmap);
|
||||||
});
|
// });
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
// AndroidUtilities.runOnUIThread(() -> {
|
||||||
onBitmapDone.run(null);
|
onBitmapDone.run(null);
|
||||||
});
|
// });
|
||||||
}
|
}
|
||||||
// });
|
// });
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,8 @@ import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
|
import android.content.pm.PackageInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
|
@ -260,7 +262,11 @@ public class ApplicationLoader extends Application {
|
||||||
|
|
||||||
if (BuildVars.LOGS_ENABLED) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
FileLog.d("app start time = " + (startTime = SystemClock.elapsedRealtime()));
|
FileLog.d("app start time = " + (startTime = SystemClock.elapsedRealtime()));
|
||||||
FileLog.d("buildVersion = " + BuildVars.BUILD_VERSION);
|
try {
|
||||||
|
FileLog.d("buildVersion = " + ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0).versionCode);
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (applicationContext == null) {
|
if (applicationContext == null) {
|
||||||
applicationContext = getApplicationContext();
|
applicationContext = getApplicationContext();
|
||||||
|
@ -350,6 +356,13 @@ public class ApplicationLoader extends Application {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static long lastNetworkCheck = -1;
|
||||||
|
private static void ensureCurrentNetworkGet() {
|
||||||
|
final long now = System.currentTimeMillis();
|
||||||
|
ensureCurrentNetworkGet(now - lastNetworkCheck > 5000);
|
||||||
|
lastNetworkCheck = now;
|
||||||
|
}
|
||||||
|
|
||||||
private static void ensureCurrentNetworkGet(boolean force) {
|
private static void ensureCurrentNetworkGet(boolean force) {
|
||||||
if (force || currentNetworkInfo == null) {
|
if (force || currentNetworkInfo == null) {
|
||||||
try {
|
try {
|
||||||
|
@ -416,6 +429,11 @@ public class ApplicationLoader extends Application {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean useLessData() {
|
||||||
|
ensureCurrentNetworkGet();
|
||||||
|
return BuildVars.DEBUG_PRIVATE_VERSION && (SharedConfig.forceLessData || isConnectionSlow());
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isConnectionSlow() {
|
public static boolean isConnectionSlow() {
|
||||||
try {
|
try {
|
||||||
ensureCurrentNetworkGet(false);
|
ensureCurrentNetworkGet(false);
|
||||||
|
|
|
@ -96,7 +96,7 @@ public class BillingController implements PurchasesUpdatedListener, BillingClien
|
||||||
}
|
}
|
||||||
|
|
||||||
public String formatCurrency(long amount, String currency, int exp, boolean rounded) {
|
public String formatCurrency(long amount, String currency, int exp, boolean rounded) {
|
||||||
if (currency.isEmpty()) {
|
if (currency == null || currency.isEmpty()) {
|
||||||
return String.valueOf(amount);
|
return String.valueOf(amount);
|
||||||
}
|
}
|
||||||
Currency cur = Currency.getInstance(currency);
|
Currency cur = Currency.getInstance(currency);
|
||||||
|
|
|
@ -24,8 +24,7 @@ public class BuildVars {
|
||||||
public static boolean USE_CLOUD_STRINGS = true;
|
public static boolean USE_CLOUD_STRINGS = true;
|
||||||
public static boolean CHECK_UPDATES = true;
|
public static boolean CHECK_UPDATES = true;
|
||||||
public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29;
|
public static boolean NO_SCOPED_STORAGE = Build.VERSION.SDK_INT <= 29;
|
||||||
public static int BUILD_VERSION = 4139;
|
public static String BUILD_VERSION_STRING = BuildConfig.BUILD_VERSION_STRING;
|
||||||
public static String BUILD_VERSION_STRING = "10.3.2";
|
|
||||||
public static int APP_ID = 4;
|
public static int APP_ID = 4;
|
||||||
public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103";
|
public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103";
|
||||||
|
|
||||||
|
|
|
@ -2107,13 +2107,13 @@ public class ChatObject {
|
||||||
|
|
||||||
public static int getProfileColorId(TLRPC.Chat chat) {
|
public static int getProfileColorId(TLRPC.Chat chat) {
|
||||||
if (chat == null) return 0;
|
if (chat == null) return 0;
|
||||||
// if (chat.profile_color != null && (chat.profile_color.flags & 1) != 0) return chat.profile_color.color;
|
if (chat.profile_color != null && (chat.profile_color.flags & 1) != 0) return chat.profile_color.color;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getProfileEmojiId(TLRPC.Chat chat) {
|
public static long getProfileEmojiId(TLRPC.Chat chat) {
|
||||||
// if (chat != null && chat.profile_color != null && (chat.profile_color.flags & 2) != 0) return chat.profile_color.background_emoji_id;
|
if (chat != null && chat.profile_color != null && (chat.profile_color.flags & 2) != 0) return chat.profile_color.background_emoji_id;
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,7 +214,7 @@ public class ChatThemeController extends BaseController {
|
||||||
if (wallPaper.uploadingImage != null) {
|
if (wallPaper.uploadingImage != null) {
|
||||||
return TextUtils.equals(oldWallpaper.uploadingImage, wallPaper.uploadingImage);
|
return TextUtils.equals(oldWallpaper.uploadingImage, wallPaper.uploadingImage);
|
||||||
}
|
}
|
||||||
return wallPaper.id == oldWallpaper.id && TextUtils.equals(ChatBackgroundDrawable.hash(wallPaper.settings), ChatBackgroundDrawable.hash(oldWallpaper.settings));
|
return wallPaper.id == oldWallpaper.id && TextUtils.equals(ChatBackgroundDrawable.hash(wallPaper.settings), ChatBackgroundDrawable.hash(oldWallpaper.settings)) && TextUtils.equals(ChatThemeController.getWallpaperEmoticon(wallPaper), ChatThemeController.getWallpaperEmoticon(oldWallpaper));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -263,6 +263,10 @@ public class ChatThemeController extends BaseController {
|
||||||
emoticon = getEmojiSharedPreferences().getString("chatTheme_" + currentAccount + "_" + dialogId, null);
|
emoticon = getEmojiSharedPreferences().getString("chatTheme_" + currentAccount + "_" + dialogId, null);
|
||||||
dialogEmoticonsMap.put(dialogId, emoticon);
|
dialogEmoticonsMap.put(dialogId, emoticon);
|
||||||
}
|
}
|
||||||
|
return getTheme(emoticon);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EmojiThemes getTheme(String emoticon) {
|
||||||
if (emoticon != null) {
|
if (emoticon != null) {
|
||||||
for (EmojiThemes theme : allChatThemes) {
|
for (EmojiThemes theme : allChatThemes) {
|
||||||
if (emoticon.equals(theme.getEmoticon())) {
|
if (emoticon.equals(theme.getEmoticon())) {
|
||||||
|
@ -274,10 +278,10 @@ public class ChatThemeController extends BaseController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveChatWallpaper(long dialogId, TLRPC.WallPaper wallPaper) {
|
public void saveChatWallpaper(long dialogId, TLRPC.WallPaper wallPaper) {
|
||||||
if (dialogId < 0) {
|
if (wallPaper != null) {
|
||||||
|
if (wallPaper.document == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (wallPaper != null) {
|
|
||||||
SerializedData data = new SerializedData(wallPaper.getObjectSize());
|
SerializedData data = new SerializedData(wallPaper.getObjectSize());
|
||||||
wallPaper.serializeToStream(data);
|
wallPaper.serializeToStream(data);
|
||||||
String wallpaperString = Utilities.bytesToHex(data.toByteArray());
|
String wallpaperString = Utilities.bytesToHex(data.toByteArray());
|
||||||
|
@ -293,13 +297,17 @@ public class ChatThemeController extends BaseController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public TLRPC.WallPaper getDialogWallpaper(long dialogId) {
|
public TLRPC.WallPaper getDialogWallpaper(long dialogId) {
|
||||||
if (dialogId < 0) {
|
if (dialogId >= 0) {
|
||||||
return null;
|
|
||||||
}
|
|
||||||
TLRPC.UserFull userFull = getMessagesController().getUserFull(dialogId);
|
TLRPC.UserFull userFull = getMessagesController().getUserFull(dialogId);
|
||||||
if (userFull != null) {
|
if (userFull != null) {
|
||||||
return userFull.wallpaper;
|
return userFull.wallpaper;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
TLRPC.ChatFull chatFull = getMessagesController().getChatFull(-dialogId);
|
||||||
|
if (chatFull != null) {
|
||||||
|
return chatFull.wallpaper;
|
||||||
|
}
|
||||||
|
}
|
||||||
String wallpaperString = getEmojiSharedPreferences().getString("chatWallpaper_" + currentAccount + "_" + dialogId, null);
|
String wallpaperString = getEmojiSharedPreferences().getString("chatWallpaper_" + currentAccount + "_" + dialogId, null);
|
||||||
if (wallpaperString != null) {
|
if (wallpaperString != null) {
|
||||||
SerializedData serializedData = new SerializedData(Utilities.hexToBytes(wallpaperString));
|
SerializedData serializedData = new SerializedData(Utilities.hexToBytes(wallpaperString));
|
||||||
|
@ -411,30 +419,75 @@ public class ChatThemeController extends BaseController {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final long dialogId = userFull.id;
|
final long dialogId = userFull.id;
|
||||||
|
if ((update.flags & 1) != 0) {
|
||||||
userFull.wallpaper_overridden = update.wallpaper_overridden;
|
userFull.wallpaper_overridden = update.wallpaper_overridden;
|
||||||
userFull.wallpaper = update.wallpaper;
|
userFull.wallpaper = update.wallpaper;
|
||||||
userFull.flags |= 16777216;
|
userFull.flags |= 16777216;
|
||||||
|
} else {
|
||||||
|
userFull.wallpaper_overridden = false;
|
||||||
|
userFull.wallpaper = null;
|
||||||
|
userFull.flags &=~ 16777216;
|
||||||
|
}
|
||||||
getMessagesStorage().updateUserInfo(userFull, false);
|
getMessagesStorage().updateUserInfo(userFull, false);
|
||||||
saveChatWallpaper(dialogId, null);
|
saveChatWallpaper(dialogId, userFull.wallpaper);
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.userInfoDidLoad, dialogId, userFull);
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.userInfoDidLoad, dialogId, userFull);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// todo
|
TLRPC.ChatFull chatFull = getMessagesController().getChatFull(-DialogObject.getPeerDialogId(update.peer));
|
||||||
|
if (chatFull != null) {
|
||||||
|
if (wallpaperEquals(chatFull.wallpaper, update.wallpaper)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final long dialogId = -chatFull.id;
|
||||||
|
if ((update.flags & 1) != 0) {
|
||||||
|
chatFull.wallpaper = update.wallpaper;
|
||||||
|
chatFull.flags2 |= 128;
|
||||||
|
} else {
|
||||||
|
chatFull.wallpaper = null;
|
||||||
|
chatFull.flags2 &=~ 128;
|
||||||
|
}
|
||||||
|
getMessagesStorage().updateChatInfo(chatFull, false);
|
||||||
|
saveChatWallpaper(dialogId, chatFull.wallpaper);
|
||||||
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.chatInfoDidLoad, chatFull, 0, false, false);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean wallpaperEquals(TLRPC.WallPaper a, TLRPC.WallPaper b) {
|
public static boolean wallpaperEquals(TLRPC.WallPaper a, TLRPC.WallPaper b) {
|
||||||
if ((a == null || a instanceof TLRPC.TL_wallPaperNoFile) && (b == null || b instanceof TLRPC.TL_wallPaperNoFile)) {
|
if (a == null && b == null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (a instanceof TLRPC.TL_wallPaper && b instanceof TLRPC.TL_wallPaper) {
|
if (a instanceof TLRPC.TL_wallPaper && b instanceof TLRPC.TL_wallPaper) {
|
||||||
return a.id == b.id;
|
return a.id == b.id;
|
||||||
}
|
}
|
||||||
|
if (a instanceof TLRPC.TL_wallPaperNoFile && b instanceof TLRPC.TL_wallPaperNoFile) {
|
||||||
|
if (a.settings != null && b.settings != null) {
|
||||||
|
return TextUtils.equals(getWallpaperEmoticon(a), getWallpaperEmoticon(b));
|
||||||
|
}
|
||||||
|
return a.id == b.id;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getWallpaperEmoticon(TLRPC.WallPaper a) {
|
||||||
|
if (a != null) {
|
||||||
|
if (a.settings != null && !TextUtils.isEmpty(a.settings.emoticon)) {
|
||||||
|
return a.settings.emoticon;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isNotEmoticonWallpaper(TLRPC.WallPaper a) {
|
||||||
|
String emoticon = getWallpaperEmoticon(a);
|
||||||
|
return emoticon != null && emoticon.length() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
public void clearWallpaper(long dialogId, boolean notify) {
|
public void clearWallpaper(long dialogId, boolean notify) {
|
||||||
clearWallpaper(dialogId, notify, false);
|
clearWallpaper(dialogId, notify, false);
|
||||||
}
|
}
|
||||||
|
@ -460,6 +513,16 @@ public class ChatThemeController extends BaseController {
|
||||||
} else {
|
} else {
|
||||||
TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId);
|
TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId);
|
||||||
req.peer = MessagesController.getInputPeer(chat);
|
req.peer = MessagesController.getInputPeer(chat);
|
||||||
|
TLRPC.ChatFull chatFull = getMessagesController().getChatFull(-dialogId);
|
||||||
|
if (chatFull != null) {
|
||||||
|
chatFull.wallpaper = null;
|
||||||
|
chatFull.flags2 &= ~128;
|
||||||
|
getMessagesStorage().updateChatInfo(chatFull, false);
|
||||||
|
}
|
||||||
|
saveChatWallpaper(dialogId, null);
|
||||||
|
if (notify) {
|
||||||
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.chatInfoDidLoad, chatFull, 0, false, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getConnectionsManager().sendRequest(req, (response, error) -> {
|
getConnectionsManager().sendRequest(req, (response, error) -> {
|
||||||
|
@ -467,13 +530,12 @@ public class ChatThemeController extends BaseController {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public int setWallpaperToUser(long dialogId, String wallpaperLocalPath, Theme.OverrideWallpaperInfo wallpaperInfo, MessageObject serverWallpaper, Runnable callback) {
|
public int setWallpaperToPeer(long dialogId, String wallpaperLocalPath, Theme.OverrideWallpaperInfo wallpaperInfo, MessageObject serverWallpaper, Runnable callback) {
|
||||||
TLRPC.TL_messages_setChatWallPaper req = new TLRPC.TL_messages_setChatWallPaper();
|
TLRPC.TL_messages_setChatWallPaper req = new TLRPC.TL_messages_setChatWallPaper();
|
||||||
if (dialogId > 0) {
|
if (dialogId >= 0) {
|
||||||
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(dialogId);
|
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(dialogId);
|
||||||
req.peer = MessagesController.getInputPeer(user);
|
req.peer = MessagesController.getInputPeer(user);
|
||||||
} else {
|
} else {
|
||||||
//chat not supported yet
|
|
||||||
TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId);
|
TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId);
|
||||||
req.peer = MessagesController.getInputPeer(chat);
|
req.peer = MessagesController.getInputPeer(chat);
|
||||||
}
|
}
|
||||||
|
@ -484,8 +546,14 @@ public class ChatThemeController extends BaseController {
|
||||||
req.flags |= 2;
|
req.flags |= 2;
|
||||||
req.id = serverWallpaper.getId();
|
req.id = serverWallpaper.getId();
|
||||||
|
|
||||||
TLRPC.UserFull userFull = MessagesController.getInstance(currentAccount).getUserFull(dialogId);
|
TLRPC.UserFull userFull = null;
|
||||||
if (userFull != null) {
|
TLRPC.ChatFull chatFull = null;
|
||||||
|
if (dialogId >= 0) {
|
||||||
|
userFull = MessagesController.getInstance(currentAccount).getUserFull(dialogId);
|
||||||
|
} else {
|
||||||
|
chatFull = MessagesController.getInstance(currentAccount).getChatFull(-dialogId);
|
||||||
|
}
|
||||||
|
|
||||||
TLRPC.TL_messageActionSetChatWallPaper action = (TLRPC.TL_messageActionSetChatWallPaper) serverWallpaper.messageOwner.action;
|
TLRPC.TL_messageActionSetChatWallPaper action = (TLRPC.TL_messageActionSetChatWallPaper) serverWallpaper.messageOwner.action;
|
||||||
TLRPC.WallPaper wallPaper = new TLRPC.TL_wallPaper();
|
TLRPC.WallPaper wallPaper = new TLRPC.TL_wallPaper();
|
||||||
wallPaper.id = action.wallpaper.id;
|
wallPaper.id = action.wallpaper.id;
|
||||||
|
@ -500,8 +568,14 @@ public class ChatThemeController extends BaseController {
|
||||||
wallPaper.settings.fourth_background_color = wallpaperInfo.gradientColor3;
|
wallPaper.settings.fourth_background_color = wallpaperInfo.gradientColor3;
|
||||||
wallPaper.settings.rotation = wallpaperInfo.rotation;
|
wallPaper.settings.rotation = wallpaperInfo.rotation;
|
||||||
wallPaper.uploadingImage = wallpaperLocalPath;
|
wallPaper.uploadingImage = wallpaperLocalPath;
|
||||||
if (userFull.wallpaper != null && userFull.wallpaper.uploadingImage != null && userFull.wallpaper.uploadingImage.equals(wallPaper.uploadingImage)) {
|
TLRPC.WallPaper pastWallpaper = null;
|
||||||
wallPaper.stripedThumb = userFull.wallpaper.stripedThumb;
|
if (userFull != null) {
|
||||||
|
pastWallpaper = userFull.wallpaper;
|
||||||
|
} else if (chatFull != null) {
|
||||||
|
pastWallpaper = chatFull.wallpaper;
|
||||||
|
}
|
||||||
|
if (pastWallpaper != null && pastWallpaper.uploadingImage != null && pastWallpaper.uploadingImage.equals(wallPaper.uploadingImage)) {
|
||||||
|
wallPaper.stripedThumb = pastWallpaper.stripedThumb;
|
||||||
}
|
}
|
||||||
|
|
||||||
wallPaper.settings.flags |= 1;
|
wallPaper.settings.flags |= 1;
|
||||||
|
@ -510,27 +584,34 @@ public class ChatThemeController extends BaseController {
|
||||||
wallPaper.settings.flags |= 32;
|
wallPaper.settings.flags |= 32;
|
||||||
wallPaper.settings.flags |= 64;
|
wallPaper.settings.flags |= 64;
|
||||||
|
|
||||||
userFull.wallpaper = new TLRPC.TL_wallPaper();
|
TLRPC.TL_wallPaper wallpaper = new TLRPC.TL_wallPaper();
|
||||||
userFull.wallpaper.pattern = action.wallpaper.pattern;
|
wallpaper.pattern = action.wallpaper.pattern;
|
||||||
userFull.wallpaper.id = action.wallpaper.id;
|
wallpaper.id = action.wallpaper.id;
|
||||||
userFull.wallpaper.document = action.wallpaper.document;
|
wallpaper.document = action.wallpaper.document;
|
||||||
userFull.wallpaper.flags = action.wallpaper.flags;
|
wallpaper.flags = action.wallpaper.flags;
|
||||||
userFull.wallpaper.creator = action.wallpaper.creator;
|
wallpaper.creator = action.wallpaper.creator;
|
||||||
userFull.wallpaper.dark = action.wallpaper.dark;
|
wallpaper.dark = action.wallpaper.dark;
|
||||||
userFull.wallpaper.isDefault = action.wallpaper.isDefault;
|
wallpaper.isDefault = action.wallpaper.isDefault;
|
||||||
userFull.wallpaper.slug = action.wallpaper.slug;
|
wallpaper.slug = action.wallpaper.slug;
|
||||||
userFull.wallpaper.access_hash = action.wallpaper.access_hash;
|
wallpaper.access_hash = action.wallpaper.access_hash;
|
||||||
userFull.wallpaper.stripedThumb = action.wallpaper.stripedThumb;
|
wallpaper.stripedThumb = action.wallpaper.stripedThumb;
|
||||||
userFull.wallpaper.settings = wallPaper.settings;
|
wallpaper.settings = wallPaper.settings;
|
||||||
userFull.wallpaper.flags |= 4;
|
wallpaper.flags |= 4;
|
||||||
|
if (userFull != null) {
|
||||||
|
userFull.wallpaper = wallpaper;
|
||||||
userFull.flags |= 16777216;
|
userFull.flags |= 16777216;
|
||||||
|
|
||||||
getMessagesStorage().updateUserInfo(userFull, false);
|
getMessagesStorage().updateUserInfo(userFull, false);
|
||||||
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.userInfoDidLoad, dialogId, userFull);
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.userInfoDidLoad, dialogId, userFull);
|
||||||
|
} else if (chatFull != null) {
|
||||||
|
chatFull.wallpaper = wallpaper;
|
||||||
|
chatFull.flags2 |= 128;
|
||||||
|
getMessagesStorage().updateChatInfo(chatFull, false);
|
||||||
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.chatInfoDidLoad, chatFull, 0, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback.run();
|
callback.run();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
req.flags |= 1;
|
req.flags |= 1;
|
||||||
req.wallpaper = MessagesController.getInputWallpaper(wallpaperInfo);
|
req.wallpaper = MessagesController.getInputWallpaper(wallpaperInfo);
|
||||||
|
@ -543,8 +624,19 @@ public class ChatThemeController extends BaseController {
|
||||||
return ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
|
return ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
|
||||||
if (response instanceof TLRPC.Updates) {
|
if (response instanceof TLRPC.Updates) {
|
||||||
TLRPC.Updates res = (TLRPC.Updates) response;
|
TLRPC.Updates res = (TLRPC.Updates) response;
|
||||||
TLRPC.UserFull userFull = MessagesController.getInstance(currentAccount).getUserFull(dialogId);
|
TLRPC.UserFull userFull = null;
|
||||||
|
TLRPC.ChatFull chatFull = null;
|
||||||
|
if (dialogId >= 0) {
|
||||||
|
userFull = MessagesController.getInstance(currentAccount).getUserFull(dialogId);
|
||||||
|
} else {
|
||||||
|
chatFull = MessagesController.getInstance(currentAccount).getChatFull(-dialogId);
|
||||||
|
}
|
||||||
|
TLRPC.WallPaper pastWallpaper = null;
|
||||||
if (userFull != null) {
|
if (userFull != null) {
|
||||||
|
pastWallpaper = userFull.wallpaper;
|
||||||
|
} else if (chatFull != null) {
|
||||||
|
pastWallpaper = chatFull.wallpaper;
|
||||||
|
}
|
||||||
for (int i = 0; i < res.updates.size(); i++) {
|
for (int i = 0; i < res.updates.size(); i++) {
|
||||||
if (res.updates.get(i) instanceof TLRPC.TL_updateNewMessage) {
|
if (res.updates.get(i) instanceof TLRPC.TL_updateNewMessage) {
|
||||||
TLRPC.Message message = ((TLRPC.TL_updateNewMessage) res.updates.get(i)).message;
|
TLRPC.Message message = ((TLRPC.TL_updateNewMessage) res.updates.get(i)).message;
|
||||||
|
@ -552,21 +644,27 @@ public class ChatThemeController extends BaseController {
|
||||||
if (finalApplyOnRequest) {
|
if (finalApplyOnRequest) {
|
||||||
TLRPC.TL_messageActionSetChatWallPaper actionSetChatWallPaper = (TLRPC.TL_messageActionSetChatWallPaper) message.action;
|
TLRPC.TL_messageActionSetChatWallPaper actionSetChatWallPaper = (TLRPC.TL_messageActionSetChatWallPaper) message.action;
|
||||||
actionSetChatWallPaper.wallpaper.uploadingImage = wallpaperLocalPath;
|
actionSetChatWallPaper.wallpaper.uploadingImage = wallpaperLocalPath;
|
||||||
if (userFull.wallpaper != null && userFull.wallpaper.uploadingImage != null && userFull.wallpaper.uploadingImage.equals(actionSetChatWallPaper.wallpaper.uploadingImage)) {
|
if (pastWallpaper != null && pastWallpaper.uploadingImage != null && pastWallpaper.uploadingImage.equals(actionSetChatWallPaper.wallpaper.uploadingImage)) {
|
||||||
actionSetChatWallPaper.wallpaper.stripedThumb = userFull.wallpaper.stripedThumb;
|
actionSetChatWallPaper.wallpaper.stripedThumb = pastWallpaper.stripedThumb;
|
||||||
}
|
}
|
||||||
|
if (userFull != null) {
|
||||||
userFull.wallpaper = actionSetChatWallPaper.wallpaper;
|
userFull.wallpaper = actionSetChatWallPaper.wallpaper;
|
||||||
userFull.flags |= 16777216;
|
userFull.flags |= 16777216;
|
||||||
|
|
||||||
saveChatWallpaper(dialogId, userFull.wallpaper);
|
saveChatWallpaper(dialogId, userFull.wallpaper);
|
||||||
getMessagesStorage().updateUserInfo(userFull, false);
|
getMessagesStorage().updateUserInfo(userFull, false);
|
||||||
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.userInfoDidLoad, dialogId, userFull);
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.userInfoDidLoad, dialogId, userFull);
|
||||||
|
} else if (chatFull != null) {
|
||||||
|
chatFull.wallpaper = actionSetChatWallPaper.wallpaper;
|
||||||
|
chatFull.flags2 |= 128;
|
||||||
|
saveChatWallpaper(dialogId, chatFull.wallpaper);
|
||||||
|
getMessagesStorage().updateChatInfo(chatFull, false);
|
||||||
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.chatInfoDidLoad, chatFull, 0, false, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
MessagesController.getInstance(currentAccount).processUpdateArray(res.updates, res.users, res.chats, false, res.date);
|
MessagesController.getInstance(currentAccount).processUpdateArray(res.updates, res.users, res.chats, false, res.date);
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback.run();
|
callback.run();
|
||||||
|
|
|
@ -163,4 +163,26 @@ public class DialogObject {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long getEmojiStatusDocumentId(TLRPC.EmojiStatus emojiStatus) {
|
||||||
|
if (emojiStatus instanceof TLRPC.TL_emojiStatus) {
|
||||||
|
return ((TLRPC.TL_emojiStatus) emojiStatus).document_id;
|
||||||
|
} else if (emojiStatus instanceof TLRPC.TL_emojiStatusUntil && ((TLRPC.TL_emojiStatusUntil) emojiStatus).until > (int) (System.currentTimeMillis() / 1000)) {
|
||||||
|
return ((TLRPC.TL_emojiStatusUntil) emojiStatus).document_id;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getEmojiStatusUntil(TLRPC.EmojiStatus emojiStatus) {
|
||||||
|
if (emojiStatus instanceof TLRPC.TL_emojiStatusUntil && ((TLRPC.TL_emojiStatusUntil) emojiStatus).until > (int) (System.currentTimeMillis() / 1000)) {
|
||||||
|
return ((TLRPC.TL_emojiStatusUntil) emojiStatus).until;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean emojiStatusesEqual(TLRPC.EmojiStatus a, TLRPC.EmojiStatus b) {
|
||||||
|
return getEmojiStatusDocumentId(a) == getEmojiStatusDocumentId(b) && getEmojiStatusUntil(a) == getEmojiStatusUntil(b);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2102,7 +2102,7 @@ public class FileLoadOperation {
|
||||||
requestingReference = true;
|
requestingReference = true;
|
||||||
if (parentObject instanceof MessageObject) {
|
if (parentObject instanceof MessageObject) {
|
||||||
MessageObject messageObject = (MessageObject) parentObject;
|
MessageObject messageObject = (MessageObject) parentObject;
|
||||||
if (messageObject.getId() < 0 && messageObject.messageOwner.media.webpage != null) {
|
if (messageObject.getId() < 0 && messageObject.messageOwner != null && messageObject.messageOwner.media != null && messageObject.messageOwner.media.webpage != null) {
|
||||||
parentObject = messageObject.messageOwner.media.webpage;
|
parentObject = messageObject.messageOwner.media.webpage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -887,7 +887,7 @@ public class FileLoader extends BaseController {
|
||||||
} else {
|
} else {
|
||||||
storeDir = getDirectory(type);
|
storeDir = getDirectory(type);
|
||||||
}
|
}
|
||||||
} else if (cacheType == 2) {
|
} else if (cacheType == ImageLoader.CACHE_TYPE_ENCRYPTED) {
|
||||||
operation.setEncryptFile(true);
|
operation.setEncryptFile(true);
|
||||||
}
|
}
|
||||||
operation.setPaths(currentAccount, fileName, loaderQueue, storeDir, tempDir, storeFileName);
|
operation.setPaths(currentAccount, fileName, loaderQueue, storeDir, tempDir, storeFileName);
|
||||||
|
|
|
@ -248,7 +248,7 @@ public class FileRefController extends BaseController {
|
||||||
}
|
}
|
||||||
if (parentObject instanceof MessageObject) {
|
if (parentObject instanceof MessageObject) {
|
||||||
MessageObject messageObject = (MessageObject) parentObject;
|
MessageObject messageObject = (MessageObject) parentObject;
|
||||||
if (messageObject.getRealId() < 0 && messageObject.messageOwner.media.webpage != null) {
|
if (messageObject.getRealId() < 0 && messageObject.messageOwner != null && messageObject.messageOwner.media != null && messageObject.messageOwner.media.webpage != null) {
|
||||||
parentObject = messageObject.messageOwner.media.webpage;
|
parentObject = messageObject.messageOwner.media.webpage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1087,6 +1087,9 @@ public class FileRefController extends BaseController {
|
||||||
if (storyItem.media.document != null) {
|
if (storyItem.media.document != null) {
|
||||||
result = getFileReference(storyItem.media.document, requester.location, needReplacement, locationReplacement);
|
result = getFileReference(storyItem.media.document, requester.location, needReplacement, locationReplacement);
|
||||||
}
|
}
|
||||||
|
if (storyItem.media.alt_document != null) {
|
||||||
|
result = getFileReference(storyItem.media.alt_document, requester.location, needReplacement, locationReplacement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Object arg = requester.args[1];
|
Object arg = requester.args[1];
|
||||||
|
|
|
@ -103,6 +103,10 @@ import java.util.zip.GZIPInputStream;
|
||||||
*/
|
*/
|
||||||
public class ImageLoader {
|
public class ImageLoader {
|
||||||
|
|
||||||
|
public static final int CACHE_TYPE_NONE = 0;
|
||||||
|
public static final int CACHE_TYPE_CACHE = 1;
|
||||||
|
public static final int CACHE_TYPE_ENCRYPTED = 2;
|
||||||
|
|
||||||
private static final boolean DEBUG_MODE = false;
|
private static final boolean DEBUG_MODE = false;
|
||||||
|
|
||||||
private HashMap<String, Integer> bitmapUseCounts = new HashMap<>();
|
private HashMap<String, Integer> bitmapUseCounts = new HashMap<>();
|
||||||
|
@ -4225,7 +4229,7 @@ public class ImageLoader {
|
||||||
} else {
|
} else {
|
||||||
File file = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(photoSize, true);
|
File file = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(photoSize, true);
|
||||||
boolean isEncrypted = false;
|
boolean isEncrypted = false;
|
||||||
if (MessageObject.shouldEncryptPhotoOrVideo(message)) {
|
if (MessageObject.shouldEncryptPhotoOrVideo(UserConfig.selectedAccount, message)) {
|
||||||
file = new File(file.getAbsolutePath() + ".enc");
|
file = new File(file.getAbsolutePath() + ".enc");
|
||||||
isEncrypted = true;
|
isEncrypted = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1017,7 +1017,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg
|
||||||
} else if (bitmapDrawable instanceof AnimatedFileDrawable) {
|
} else if (bitmapDrawable instanceof AnimatedFileDrawable) {
|
||||||
AnimatedFileDrawable animatedFileDrawable = (AnimatedFileDrawable) drawable;
|
AnimatedFileDrawable animatedFileDrawable = (AnimatedFileDrawable) drawable;
|
||||||
animatedFileDrawable.setRoundRadius(roundRadius);
|
animatedFileDrawable.setRoundRadius(roundRadius);
|
||||||
} else if (bitmapDrawable.getBitmap() != null) {
|
} else if (bitmapDrawable.getBitmap() != null && !bitmapDrawable.getBitmap().isRecycled()) {
|
||||||
setDrawableShader(drawable, new BitmapShader(bitmapDrawable.getBitmap(), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
|
setDrawableShader(drawable, new BitmapShader(bitmapDrawable.getBitmap(), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,8 @@ public class LiteMode {
|
||||||
public static final int FLAG_CHAT_SPOILER = 128;
|
public static final int FLAG_CHAT_SPOILER = 128;
|
||||||
public static final int FLAG_CHAT_BLUR = 256;
|
public static final int FLAG_CHAT_BLUR = 256;
|
||||||
public static final int FLAG_CHAT_SCALE = 32768;
|
public static final int FLAG_CHAT_SCALE = 32768;
|
||||||
public static final int FLAGS_CHAT = FLAG_CHAT_BACKGROUND | FLAG_CHAT_FORUM_TWOCOLUMN | FLAG_CHAT_SPOILER | FLAG_CHAT_BLUR | FLAG_CHAT_SCALE;
|
public static final int FLAG_CHAT_THANOS = 65536;
|
||||||
|
public static final int FLAGS_CHAT = FLAG_CHAT_BACKGROUND | FLAG_CHAT_FORUM_TWOCOLUMN | FLAG_CHAT_SPOILER | FLAG_CHAT_BLUR | FLAG_CHAT_SCALE | FLAG_CHAT_THANOS;
|
||||||
|
|
||||||
public static final int FLAG_CALLS_ANIMATIONS = 512;
|
public static final int FLAG_CALLS_ANIMATIONS = 512;
|
||||||
public static final int FLAG_AUTOPLAY_VIDEOS = 1024;
|
public static final int FLAG_AUTOPLAY_VIDEOS = 1024;
|
||||||
|
@ -49,8 +50,9 @@ public class LiteMode {
|
||||||
FLAG_ANIMATED_EMOJI_CHAT_PREMIUM |
|
FLAG_ANIMATED_EMOJI_CHAT_PREMIUM |
|
||||||
FLAG_ANIMATED_EMOJI_KEYBOARD_PREMIUM |
|
FLAG_ANIMATED_EMOJI_KEYBOARD_PREMIUM |
|
||||||
FLAG_ANIMATED_EMOJI_REACTIONS_PREMIUM |
|
FLAG_ANIMATED_EMOJI_REACTIONS_PREMIUM |
|
||||||
FLAG_AUTOPLAY_GIFS
|
FLAG_AUTOPLAY_GIFS |
|
||||||
); // 2076
|
FLAG_CHAT_THANOS
|
||||||
|
); // 67612
|
||||||
public static int PRESET_MEDIUM = (
|
public static int PRESET_MEDIUM = (
|
||||||
FLAGS_ANIMATED_STICKERS |
|
FLAGS_ANIMATED_STICKERS |
|
||||||
FLAG_ANIMATED_EMOJI_KEYBOARD_PREMIUM |
|
FLAG_ANIMATED_EMOJI_KEYBOARD_PREMIUM |
|
||||||
|
@ -59,16 +61,18 @@ public class LiteMode {
|
||||||
FLAG_CHAT_FORUM_TWOCOLUMN |
|
FLAG_CHAT_FORUM_TWOCOLUMN |
|
||||||
FLAG_CALLS_ANIMATIONS |
|
FLAG_CALLS_ANIMATIONS |
|
||||||
FLAG_AUTOPLAY_VIDEOS |
|
FLAG_AUTOPLAY_VIDEOS |
|
||||||
FLAG_AUTOPLAY_GIFS
|
FLAG_AUTOPLAY_GIFS |
|
||||||
); // 7775
|
FLAG_CHAT_THANOS
|
||||||
|
); // 73311
|
||||||
public static int PRESET_HIGH = (
|
public static int PRESET_HIGH = (
|
||||||
FLAGS_ANIMATED_STICKERS |
|
FLAGS_ANIMATED_STICKERS |
|
||||||
FLAGS_ANIMATED_EMOJI |
|
FLAGS_ANIMATED_EMOJI |
|
||||||
FLAGS_CHAT |
|
FLAGS_CHAT |
|
||||||
FLAG_CALLS_ANIMATIONS |
|
FLAG_CALLS_ANIMATIONS |
|
||||||
FLAG_AUTOPLAY_VIDEOS |
|
FLAG_AUTOPLAY_VIDEOS |
|
||||||
FLAG_AUTOPLAY_GIFS
|
FLAG_AUTOPLAY_GIFS |
|
||||||
); // 65535
|
FLAG_CHAT_THANOS
|
||||||
|
); // 131071
|
||||||
public static int PRESET_POWER_SAVER = 0;
|
public static int PRESET_POWER_SAVER = 0;
|
||||||
|
|
||||||
private static int BATTERY_LOW = 10;
|
private static int BATTERY_LOW = 10;
|
||||||
|
@ -196,8 +200,12 @@ public class LiteMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
final SharedPreferences preferences = MessagesController.getGlobalMainSettings();
|
final SharedPreferences preferences = MessagesController.getGlobalMainSettings();
|
||||||
if (!preferences.contains("lite_mode2")) {
|
if (!preferences.contains("lite_mode3")) {
|
||||||
if (preferences.contains("lite_mode")) {
|
if (preferences.contains("lite_mode2")) {
|
||||||
|
defaultValue = preferences.getInt("lite_mode2", defaultValue);
|
||||||
|
defaultValue |= FLAG_CHAT_THANOS;
|
||||||
|
preferences.edit().putInt("lite_mode3", defaultValue).apply();
|
||||||
|
} else if (preferences.contains("lite_mode")) {
|
||||||
defaultValue = preferences.getInt("lite_mode", defaultValue);
|
defaultValue = preferences.getInt("lite_mode", defaultValue);
|
||||||
if (defaultValue == 4095) {
|
if (defaultValue == 4095) {
|
||||||
defaultValue = PRESET_HIGH;
|
defaultValue = PRESET_HIGH;
|
||||||
|
@ -248,7 +256,7 @@ public class LiteMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
int prevValue = value;
|
int prevValue = value;
|
||||||
value = preferences.getInt("lite_mode2", defaultValue);
|
value = preferences.getInt("lite_mode3", defaultValue);
|
||||||
if (loaded) {
|
if (loaded) {
|
||||||
onFlagsUpdate(prevValue, value);
|
onFlagsUpdate(prevValue, value);
|
||||||
}
|
}
|
||||||
|
@ -257,7 +265,7 @@ public class LiteMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void savePreference() {
|
public static void savePreference() {
|
||||||
MessagesController.getGlobalMainSettings().edit().putInt("lite_mode2", value).putInt("lite_mode_battery_level", powerSaverLevel).apply();
|
MessagesController.getGlobalMainSettings().edit().putInt("lite_mode3", value).putInt("lite_mode_battery_level", powerSaverLevel).apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getPowerSaverLevel() {
|
public static int getPowerSaverLevel() {
|
||||||
|
|
|
@ -1061,10 +1061,10 @@ public class LocaleController {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getStringInternal(String key, int res) {
|
private String getStringInternal(String key, int res) {
|
||||||
return getStringInternal(key, null, res);
|
return getStringInternal(key, null, 0, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getStringInternal(String key, String fallback, int res) {
|
private String getStringInternal(String key, String fallback, int fallbackRes, int res) {
|
||||||
String value = BuildVars.USE_CLOUD_STRINGS ? localeValues.get(key) : null;
|
String value = BuildVars.USE_CLOUD_STRINGS ? localeValues.get(key) : null;
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
if (BuildVars.USE_CLOUD_STRINGS && fallback != null) {
|
if (BuildVars.USE_CLOUD_STRINGS && fallback != null) {
|
||||||
|
@ -1074,6 +1074,11 @@ public class LocaleController {
|
||||||
try {
|
try {
|
||||||
value = ApplicationLoader.applicationContext.getString(res);
|
value = ApplicationLoader.applicationContext.getString(res);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
if (fallbackRes != 0) {
|
||||||
|
try {
|
||||||
|
value = ApplicationLoader.applicationContext.getString(fallbackRes);
|
||||||
|
} catch (Exception ignored) {}
|
||||||
|
}
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1107,8 +1112,12 @@ public class LocaleController {
|
||||||
return getInstance().getStringInternal(key, res);
|
return getInstance().getStringInternal(key, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getString(String key, String fallback, int fallbackRes, int res) {
|
||||||
|
return getInstance().getStringInternal(key, fallback, fallbackRes, res);
|
||||||
|
}
|
||||||
|
|
||||||
public static String getString(String key, String fallback, int res) {
|
public static String getString(String key, String fallback, int res) {
|
||||||
return getInstance().getStringInternal(key, fallback, res);
|
return getInstance().getStringInternal(key, fallback, 0, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getString(String key) {
|
public static String getString(String key) {
|
||||||
|
@ -1129,7 +1138,8 @@ public class LocaleController {
|
||||||
String param = getInstance().stringForQuantity(getInstance().currentPluralRules.quantityForNumber(plural));
|
String param = getInstance().stringForQuantity(getInstance().currentPluralRules.quantityForNumber(plural));
|
||||||
param = key + "_" + param;
|
param = key + "_" + param;
|
||||||
int resourceId = ApplicationLoader.applicationContext.getResources().getIdentifier(param, "string", ApplicationLoader.applicationContext.getPackageName());
|
int resourceId = ApplicationLoader.applicationContext.getResources().getIdentifier(param, "string", ApplicationLoader.applicationContext.getPackageName());
|
||||||
return getString(param, key + "_other", resourceId);
|
int fallbackResourceId = ApplicationLoader.applicationContext.getResources().getIdentifier(key + "_other", "string", ApplicationLoader.applicationContext.getPackageName());
|
||||||
|
return getString(param, key + "_other", resourceId, fallbackResourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String formatPluralString(String key, int plural, Object... args) {
|
public static String formatPluralString(String key, int plural, Object... args) {
|
||||||
|
@ -1146,6 +1156,10 @@ public class LocaleController {
|
||||||
return formatString(param, key + "_other", resourceId, fallbackResourceId, argsWithPlural);
|
return formatString(param, key + "_other", resourceId, fallbackResourceId, argsWithPlural);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getStringParamForNumber(int number) {
|
||||||
|
return getInstance().stringForQuantity(getInstance().currentPluralRules.quantityForNumber(number));
|
||||||
|
}
|
||||||
|
|
||||||
public static String formatPluralStringComma(String key, int plural) {
|
public static String formatPluralStringComma(String key, int plural) {
|
||||||
return formatPluralStringComma(key, plural, ',');
|
return formatPluralStringComma(key, plural, ',');
|
||||||
}
|
}
|
||||||
|
@ -1611,6 +1625,24 @@ public class LocaleController {
|
||||||
return "LOC_ERR: formatDateChat";
|
return "LOC_ERR: formatDateChat";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String formatSmallDateChat(long date) {
|
||||||
|
try {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTimeInMillis(System.currentTimeMillis());
|
||||||
|
int currentYear = calendar.get(Calendar.YEAR);
|
||||||
|
date *= 1000;
|
||||||
|
|
||||||
|
calendar.setTimeInMillis(date);
|
||||||
|
if (currentYear == calendar.get(Calendar.YEAR)) {
|
||||||
|
return getInstance().formatterDayMonth.format(date);
|
||||||
|
}
|
||||||
|
return getInstance().formatterDayMonth.format(date) + ", " + calendar.get(Calendar.YEAR);
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
}
|
||||||
|
return "LOC_ERR: formatDateChat";
|
||||||
|
}
|
||||||
|
|
||||||
public static String formatDate(long date) {
|
public static String formatDate(long date) {
|
||||||
try {
|
try {
|
||||||
date *= 1000;
|
date *= 1000;
|
||||||
|
|
|
@ -779,6 +779,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
private int sendAfterDone;
|
private int sendAfterDone;
|
||||||
private boolean sendAfterDoneNotify;
|
private boolean sendAfterDoneNotify;
|
||||||
private int sendAfterDoneScheduleDate;
|
private int sendAfterDoneScheduleDate;
|
||||||
|
private boolean sendAfterDoneOnce;
|
||||||
|
|
||||||
private Runnable recordStartRunnable;
|
private Runnable recordStartRunnable;
|
||||||
private DispatchQueue recordQueue;
|
private DispatchQueue recordQueue;
|
||||||
|
@ -867,7 +868,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
} else {
|
} else {
|
||||||
recordBuffers.add(buffer);
|
recordBuffers.add(buffer);
|
||||||
if (sendAfterDone != 3) {
|
if (sendAfterDone != 3) {
|
||||||
stopRecordingInternal(sendAfterDone, sendAfterDoneNotify, sendAfterDoneScheduleDate);
|
stopRecordingInternal(sendAfterDone, sendAfterDoneNotify, sendAfterDoneScheduleDate, sendAfterDoneOnce);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1133,7 +1134,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
if (isPlayingMessage(playingMessageObject) && !isMessagePaused()) {
|
if (isPlayingMessage(playingMessageObject) && !isMessagePaused()) {
|
||||||
pauseMessage(playingMessageObject);
|
pauseMessage(playingMessageObject);
|
||||||
} else if (recordStartRunnable != null || recordingAudio != null) {
|
} else if (recordStartRunnable != null || recordingAudio != null) {
|
||||||
stopRecording(2, false, 0);
|
stopRecording(2, false, 0, false);
|
||||||
}
|
}
|
||||||
EmbedBottomSheet embedBottomSheet = EmbedBottomSheet.getInstance();
|
EmbedBottomSheet embedBottomSheet = EmbedBottomSheet.getInstance();
|
||||||
if (embedBottomSheet != null) {
|
if (embedBottomSheet != null) {
|
||||||
|
@ -1585,6 +1586,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
int addedCount = 0;
|
int addedCount = 0;
|
||||||
for (int a = 0; a < arr.size(); a++) {
|
for (int a = 0; a < arr.size(); a++) {
|
||||||
MessageObject message = arr.get(a);
|
MessageObject message = arr.get(a);
|
||||||
|
if (message.isVoiceOnce()) continue;
|
||||||
if (playlistMap.containsKey(message.getId())) {
|
if (playlistMap.containsKey(message.getId())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1618,7 +1620,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
ArrayList<MessageObject> arr = (ArrayList<MessageObject>) args[1];
|
ArrayList<MessageObject> arr = (ArrayList<MessageObject>) args[1];
|
||||||
for (int a = 0; a < arr.size(); a++) {
|
for (int a = 0; a < arr.size(); a++) {
|
||||||
messageObject = arr.get(a);
|
messageObject = arr.get(a);
|
||||||
if ((messageObject.isVoice() || messageObject.isRoundVideo()) && (!voiceMessagesPlaylistUnread || messageObject.isContentUnread() && !messageObject.isOut())) {
|
if ((messageObject.isVoice() || messageObject.isRoundVideo()) && !messageObject.isVoiceOnce() && !messageObject.isRoundOnce() && (!voiceMessagesPlaylistUnread || messageObject.isContentUnread() && !messageObject.isOut())) {
|
||||||
voiceMessagesPlaylist.add(messageObject);
|
voiceMessagesPlaylist.add(messageObject);
|
||||||
voiceMessagesPlaylistMap.put(messageObject.getId(), messageObject);
|
voiceMessagesPlaylistMap.put(messageObject.getId(), messageObject);
|
||||||
}
|
}
|
||||||
|
@ -1913,7 +1915,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
if (BuildVars.LOGS_ENABLED) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
FileLog.d("stop record");
|
FileLog.d("stop record");
|
||||||
}
|
}
|
||||||
stopRecording(2, false, 0);
|
stopRecording(2, false, 0, false);
|
||||||
raiseToEarRecord = false;
|
raiseToEarRecord = false;
|
||||||
ignoreOnPause = false;
|
ignoreOnPause = false;
|
||||||
// if (!ignoreAccelerometerGestures() && proximityHasDifferentValues && proximityWakeLock != null && proximityWakeLock.isHeld()) {
|
// if (!ignoreAccelerometerGestures() && proximityHasDifferentValues && proximityWakeLock != null && proximityWakeLock.isHeld()) {
|
||||||
|
@ -2051,7 +2053,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (stopRecording) {
|
if (stopRecording) {
|
||||||
stopRecording(fromChat ? 2 : 0, false, 0);
|
stopRecording(fromChat ? 2 : 0, false, 0, false);
|
||||||
}
|
}
|
||||||
if (!sensorsStarted || ignoreOnPause || accelerometerSensor == null && (gravitySensor == null || linearAcceleration == null) || proximitySensor == null || raiseChat != chatActivity) {
|
if (!sensorsStarted || ignoreOnPause || accelerometerSensor == null && (gravitySensor == null || linearAcceleration == null) || proximitySensor == null || raiseChat != chatActivity) {
|
||||||
return;
|
return;
|
||||||
|
@ -2361,6 +2363,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
int addedCount = 0;
|
int addedCount = 0;
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
MessageObject messageObject = new MessageObject(currentAccount, res.messages.get(i), false, true);
|
MessageObject messageObject = new MessageObject(currentAccount, res.messages.get(i), false, true);
|
||||||
|
if (messageObject.isVoiceOnce()) continue;
|
||||||
if (playlistMap.containsKey(messageObject.getId())) {
|
if (playlistMap.containsKey(messageObject.getId())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -3761,6 +3764,9 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPlayingMessage(MessageObject messageObject) {
|
public boolean isPlayingMessage(MessageObject messageObject) {
|
||||||
|
if (messageObject != null && messageObject.isRepostPreview) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (audioPlayer == null && videoPlayer == null || messageObject == null || playingMessageObject == null) {
|
if (audioPlayer == null && videoPlayer == null || messageObject == null || playingMessageObject == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -3954,7 +3960,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void stopRecordingInternal(final int send, boolean notify, int scheduleDate) {
|
private void stopRecordingInternal(final int send, boolean notify, int scheduleDate, boolean once) {
|
||||||
if (send != 0) {
|
if (send != 0) {
|
||||||
final TLRPC.TL_document audioToSend = recordingAudio;
|
final TLRPC.TL_document audioToSend = recordingAudio;
|
||||||
final File recordingAudioFileToSend = recordingAudioFile;
|
final File recordingAudioFileToSend = recordingAudioFile;
|
||||||
|
@ -3987,7 +3993,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
audioToSend.attributes.add(attributeAudio);
|
audioToSend.attributes.add(attributeAudio);
|
||||||
if (duration > 700) {
|
if (duration > 700) {
|
||||||
if (send == 1) {
|
if (send == 1) {
|
||||||
SendMessagesHelper.SendMessageParams params = SendMessagesHelper.SendMessageParams.of(audioToSend, null, recordingAudioFileToSend.getAbsolutePath(), recordDialogId, recordReplyingMsg, recordReplyingTopMsg, null, null, null, null, notify, scheduleDate, 0, null, null, false);
|
SendMessagesHelper.SendMessageParams params = SendMessagesHelper.SendMessageParams.of(audioToSend, null, recordingAudioFileToSend.getAbsolutePath(), recordDialogId, recordReplyingMsg, recordReplyingTopMsg, null, null, null, null, notify, scheduleDate, once ? 0x7FFFFFFF : 0, null, null, false);
|
||||||
params.replyToStoryItem = recordReplyingStory;
|
params.replyToStoryItem = recordReplyingStory;
|
||||||
SendMessagesHelper.getInstance(recordingCurrentAccount).sendMessage(params);
|
SendMessagesHelper.getInstance(recordingCurrentAccount).sendMessage(params);
|
||||||
}
|
}
|
||||||
|
@ -4020,7 +4026,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
manualRecording = false;
|
manualRecording = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stopRecording(final int send, boolean notify, int scheduleDate) {
|
public void stopRecording(final int send, boolean notify, int scheduleDate, boolean once) {
|
||||||
if (recordStartRunnable != null) {
|
if (recordStartRunnable != null) {
|
||||||
recordQueue.cancelRunnable(recordStartRunnable);
|
recordQueue.cancelRunnable(recordStartRunnable);
|
||||||
recordStartRunnable = null;
|
recordStartRunnable = null;
|
||||||
|
@ -4028,7 +4034,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
recordQueue.postRunnable(() -> {
|
recordQueue.postRunnable(() -> {
|
||||||
if (sendAfterDone == 3) {
|
if (sendAfterDone == 3) {
|
||||||
sendAfterDone = 0;
|
sendAfterDone = 0;
|
||||||
stopRecordingInternal(send, notify, scheduleDate);
|
stopRecordingInternal(send, notify, scheduleDate, once);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (audioRecorder == null) {
|
if (audioRecorder == null) {
|
||||||
|
@ -4038,6 +4044,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
sendAfterDone = send;
|
sendAfterDone = send;
|
||||||
sendAfterDoneNotify = notify;
|
sendAfterDoneNotify = notify;
|
||||||
sendAfterDoneScheduleDate = scheduleDate;
|
sendAfterDoneScheduleDate = scheduleDate;
|
||||||
|
sendAfterDoneOnce = once;
|
||||||
audioRecorder.stop();
|
audioRecorder.stop();
|
||||||
setBluetoothScoOn(false);
|
setBluetoothScoOn(false);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -4050,7 +4057,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (send == 0) {
|
if (send == 0) {
|
||||||
stopRecordingInternal(0, false, 0);
|
stopRecordingInternal(0, false, 0, false);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
feedbackView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
|
feedbackView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
|
||||||
|
@ -5018,12 +5025,13 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
thread.start();
|
thread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean forceBroadcastNewPhotos;
|
||||||
private static void broadcastNewPhotos(final int guid, final ArrayList<AlbumEntry> mediaAlbumsSorted, final ArrayList<AlbumEntry> photoAlbumsSorted, final Integer cameraAlbumIdFinal, final AlbumEntry allMediaAlbumFinal, final AlbumEntry allPhotosAlbumFinal, final AlbumEntry allVideosAlbumFinal, int delay) {
|
private static void broadcastNewPhotos(final int guid, final ArrayList<AlbumEntry> mediaAlbumsSorted, final ArrayList<AlbumEntry> photoAlbumsSorted, final Integer cameraAlbumIdFinal, final AlbumEntry allMediaAlbumFinal, final AlbumEntry allPhotosAlbumFinal, final AlbumEntry allVideosAlbumFinal, int delay) {
|
||||||
if (broadcastPhotosRunnable != null) {
|
if (broadcastPhotosRunnable != null) {
|
||||||
AndroidUtilities.cancelRunOnUIThread(broadcastPhotosRunnable);
|
AndroidUtilities.cancelRunOnUIThread(broadcastPhotosRunnable);
|
||||||
}
|
}
|
||||||
AndroidUtilities.runOnUIThread(broadcastPhotosRunnable = () -> {
|
AndroidUtilities.runOnUIThread(broadcastPhotosRunnable = () -> {
|
||||||
if (PhotoViewer.getInstance().isVisible()) {
|
if (PhotoViewer.getInstance().isVisible() && !forceBroadcastNewPhotos) {
|
||||||
broadcastNewPhotos(guid, mediaAlbumsSorted, photoAlbumsSorted, cameraAlbumIdFinal, allMediaAlbumFinal, allPhotosAlbumFinal, allVideosAlbumFinal, 1000);
|
broadcastNewPhotos(guid, mediaAlbumsSorted, photoAlbumsSorted, cameraAlbumIdFinal, allMediaAlbumFinal, allPhotosAlbumFinal, allVideosAlbumFinal, 1000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -5376,20 +5384,8 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
|
||||||
framerate, bitrate, originalBitrate,
|
framerate, bitrate, originalBitrate,
|
||||||
startTime, endTime, avatarStartTime,
|
startTime, endTime, avatarStartTime,
|
||||||
needCompress, duration,
|
needCompress, duration,
|
||||||
info.filterState,
|
|
||||||
info.paintPath,
|
|
||||||
info.blurPath,
|
|
||||||
info.mediaEntities,
|
|
||||||
info.isPhoto,
|
|
||||||
info.cropState,
|
|
||||||
info.roundVideo,
|
|
||||||
callback,
|
callback,
|
||||||
info.gradientTopColor,
|
info);
|
||||||
info.gradientBottomColor,
|
|
||||||
info.muted,
|
|
||||||
info.isStory,
|
|
||||||
info.hdrInfo,
|
|
||||||
info.parts);
|
|
||||||
convertVideoParams.soundInfos.addAll(info.mixedSoundInfos);
|
convertVideoParams.soundInfos.addAll(info.mixedSoundInfos);
|
||||||
boolean error = videoConvertor.convertVideo(convertVideoParams);
|
boolean error = videoConvertor.convertVideo(convertVideoParams);
|
||||||
|
|
||||||
|
|
|
@ -260,6 +260,7 @@ public class MediaDataController extends BaseController {
|
||||||
private LongSparseArray<TLRPC.TL_messages_stickerSet> groupStickerSets = new LongSparseArray<>();
|
private LongSparseArray<TLRPC.TL_messages_stickerSet> groupStickerSets = new LongSparseArray<>();
|
||||||
private ConcurrentHashMap<String, TLRPC.TL_messages_stickerSet> stickerSetsByName = new ConcurrentHashMap<>(100, 1.0f, 1);
|
private ConcurrentHashMap<String, TLRPC.TL_messages_stickerSet> stickerSetsByName = new ConcurrentHashMap<>(100, 1.0f, 1);
|
||||||
private TLRPC.TL_messages_stickerSet stickerSetDefaultStatuses = null;
|
private TLRPC.TL_messages_stickerSet stickerSetDefaultStatuses = null;
|
||||||
|
private TLRPC.TL_messages_stickerSet stickerSetDefaultChannelStatuses = null;
|
||||||
private HashMap<String, TLRPC.TL_messages_stickerSet> diceStickerSetsByEmoji = new HashMap<>();
|
private HashMap<String, TLRPC.TL_messages_stickerSet> diceStickerSetsByEmoji = new HashMap<>();
|
||||||
private LongSparseArray<String> diceEmojiStickerSetsById = new LongSparseArray<>();
|
private LongSparseArray<String> diceEmojiStickerSetsById = new LongSparseArray<>();
|
||||||
private HashSet<String> loadingDiceStickerSets = new HashSet<>();
|
private HashSet<String> loadingDiceStickerSets = new HashSet<>();
|
||||||
|
@ -317,11 +318,11 @@ public class MediaDataController extends BaseController {
|
||||||
public final ArrayList<TLRPC.Document> premiumPreviewStickers = new ArrayList<>();
|
public final ArrayList<TLRPC.Document> premiumPreviewStickers = new ArrayList<>();
|
||||||
boolean previewStickersLoading;
|
boolean previewStickersLoading;
|
||||||
|
|
||||||
private long[] emojiStatusesHash = new long[2];
|
private long[] emojiStatusesHash = new long[4];
|
||||||
private ArrayList<TLRPC.EmojiStatus>[] emojiStatuses = new ArrayList[2];
|
private ArrayList<TLRPC.EmojiStatus>[] emojiStatuses = new ArrayList[4];
|
||||||
private Long[] emojiStatusesFetchDate = new Long[2];
|
private Long[] emojiStatusesFetchDate = new Long[4];
|
||||||
private boolean[] emojiStatusesFromCacheFetched = new boolean[2];
|
private boolean[] emojiStatusesFromCacheFetched = new boolean[4];
|
||||||
private boolean[] emojiStatusesFetching = new boolean[2];
|
private boolean[] emojiStatusesFetching = new boolean[4];
|
||||||
|
|
||||||
public void cleanup() {
|
public void cleanup() {
|
||||||
for (int a = 0; a < recentStickers.length; a++) {
|
for (int a = 0; a < recentStickers.length; a++) {
|
||||||
|
@ -1217,6 +1218,8 @@ public class MediaDataController extends BaseController {
|
||||||
cacheSet = stickerSetsByName.get(inputStickerSet.short_name.toLowerCase());
|
cacheSet = stickerSetsByName.get(inputStickerSet.short_name.toLowerCase());
|
||||||
} else if (inputStickerSet instanceof TLRPC.TL_inputStickerSetEmojiDefaultStatuses && stickerSetDefaultStatuses != null) {
|
} else if (inputStickerSet instanceof TLRPC.TL_inputStickerSetEmojiDefaultStatuses && stickerSetDefaultStatuses != null) {
|
||||||
cacheSet = stickerSetDefaultStatuses;
|
cacheSet = stickerSetDefaultStatuses;
|
||||||
|
} else if (inputStickerSet instanceof TLRPC.TL_inputStickerSetEmojiChannelDefaultStatuses && stickerSetDefaultChannelStatuses != null) {
|
||||||
|
cacheSet = stickerSetDefaultChannelStatuses;
|
||||||
}
|
}
|
||||||
if (cacheSet != null) {
|
if (cacheSet != null) {
|
||||||
if (onResponse != null) {
|
if (onResponse != null) {
|
||||||
|
@ -1264,6 +1267,9 @@ public class MediaDataController extends BaseController {
|
||||||
if (inputStickerSet instanceof TLRPC.TL_inputStickerSetEmojiDefaultStatuses) {
|
if (inputStickerSet instanceof TLRPC.TL_inputStickerSetEmojiDefaultStatuses) {
|
||||||
stickerSetDefaultStatuses = set;
|
stickerSetDefaultStatuses = set;
|
||||||
}
|
}
|
||||||
|
if (inputStickerSet instanceof TLRPC.TL_inputStickerSetEmojiDefaultStatuses) {
|
||||||
|
stickerSetDefaultChannelStatuses = set;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
saveStickerSetIntoCache(set);
|
saveStickerSetIntoCache(set);
|
||||||
getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, set.set.id, set);
|
getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, set.set.id, set);
|
||||||
|
@ -5567,6 +5573,13 @@ public class MediaDataController extends BaseController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (channelId != 0 && messageObject.getDialogId() != -channelId) {
|
||||||
|
TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(channelId);
|
||||||
|
if (chat != null && !ChatObject.isPublic(chat)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SparseArray<ArrayList<MessageObject>> sparseArray = replyMessageOwners.get(dialogId);
|
SparseArray<ArrayList<MessageObject>> sparseArray = replyMessageOwners.get(dialogId);
|
||||||
ArrayList<Integer> ids = dialogReplyMessagesIds.get(channelId);
|
ArrayList<Integer> ids = dialogReplyMessagesIds.get(channelId);
|
||||||
if (sparseArray == null) {
|
if (sparseArray == null) {
|
||||||
|
@ -8180,6 +8193,16 @@ public class MediaDataController extends BaseController {
|
||||||
return emojiStatuses[type];
|
return emojiStatuses[type];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ArrayList<TLRPC.EmojiStatus> getDefaultChannelEmojiStatuses() {
|
||||||
|
final int type = 2; // default channel
|
||||||
|
if (!emojiStatusesFromCacheFetched[type]) {
|
||||||
|
fetchEmojiStatuses(type, true);
|
||||||
|
} else if (emojiStatuses[type] == null || emojiStatusesFetchDate[type] != null && (System.currentTimeMillis() / 1000 - emojiStatusesFetchDate[type]) > 60 * 30) {
|
||||||
|
fetchEmojiStatuses(type, false);
|
||||||
|
}
|
||||||
|
return emojiStatuses[type];
|
||||||
|
}
|
||||||
|
|
||||||
public ArrayList<TLRPC.EmojiStatus> getRecentEmojiStatuses() {
|
public ArrayList<TLRPC.EmojiStatus> getRecentEmojiStatuses() {
|
||||||
final int type = 0; // recent
|
final int type = 0; // recent
|
||||||
if (!emojiStatusesFromCacheFetched[type]) {
|
if (!emojiStatusesFromCacheFetched[type]) {
|
||||||
|
@ -8271,10 +8294,14 @@ public class MediaDataController extends BaseController {
|
||||||
TLRPC.TL_account_getRecentEmojiStatuses recentReq = new TLRPC.TL_account_getRecentEmojiStatuses();
|
TLRPC.TL_account_getRecentEmojiStatuses recentReq = new TLRPC.TL_account_getRecentEmojiStatuses();
|
||||||
recentReq.hash = emojiStatusesHash[type];
|
recentReq.hash = emojiStatusesHash[type];
|
||||||
req = recentReq;
|
req = recentReq;
|
||||||
} else {
|
} else if (type == 1) {
|
||||||
TLRPC.TL_account_getDefaultEmojiStatuses defaultReq = new TLRPC.TL_account_getDefaultEmojiStatuses();
|
TLRPC.TL_account_getDefaultEmojiStatuses defaultReq = new TLRPC.TL_account_getDefaultEmojiStatuses();
|
||||||
defaultReq.hash = emojiStatusesHash[type];
|
defaultReq.hash = emojiStatusesHash[type];
|
||||||
req = defaultReq;
|
req = defaultReq;
|
||||||
|
} else {
|
||||||
|
TLRPC.TL_account_getChannelDefaultEmojiStatuses defaultReq = new TLRPC.TL_account_getChannelDefaultEmojiStatuses();
|
||||||
|
defaultReq.hash = emojiStatusesHash[type];
|
||||||
|
req = defaultReq;
|
||||||
}
|
}
|
||||||
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> {
|
ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> {
|
||||||
emojiStatusesFetchDate[type] = System.currentTimeMillis() / 1000;
|
emojiStatusesFetchDate[type] = System.currentTimeMillis() / 1000;
|
||||||
|
@ -8518,4 +8545,42 @@ public class MediaDataController extends BaseController {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TLRPC.TL_emojiList restrictedStatusEmojis;
|
||||||
|
public void loadRestrictedStatusEmojis() {
|
||||||
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("restrictedstatuses_" + currentAccount, Context.MODE_PRIVATE);
|
||||||
|
|
||||||
|
String value = preferences.getString("restrictedstatuses", null);
|
||||||
|
long lastCheckTime = preferences.getLong("restrictedstatuses_last_check", 0);
|
||||||
|
|
||||||
|
TLRPC.TL_emojiList emojiList = null;
|
||||||
|
if (value != null) {
|
||||||
|
SerializedData serializedData = new SerializedData(Utilities.hexToBytes(value));
|
||||||
|
try {
|
||||||
|
emojiList = (TLRPC.TL_emojiList) TLRPC.TL_emojiList.TLdeserialize(serializedData, serializedData.readInt32(true), true);
|
||||||
|
restrictedStatusEmojis = emojiList;
|
||||||
|
} catch (Throwable e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (emojiList == null || (System.currentTimeMillis() - lastCheckTime) > 24 * 60 * 60 * 1000) {
|
||||||
|
TLRPC.TL_account_getChannelRestrictedStatusEmojis req = new TLRPC.TL_account_getChannelRestrictedStatusEmojis();
|
||||||
|
if (emojiList != null) {
|
||||||
|
req.hash = emojiList.hash;
|
||||||
|
}
|
||||||
|
getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
if (response instanceof TLRPC.TL_emojiList) {
|
||||||
|
SerializedData data = new SerializedData(response.getObjectSize());
|
||||||
|
response.serializeToStream(data);
|
||||||
|
SharedPreferences.Editor editor = preferences.edit();
|
||||||
|
restrictedStatusEmojis = (TLRPC.TL_emojiList) response;
|
||||||
|
editor.putString("restrictedstatuses", Utilities.bytesToHex(data.toByteArray()));
|
||||||
|
editor.putLong("restrictedstatuses_last_check", System.currentTimeMillis());
|
||||||
|
|
||||||
|
editor.apply();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,6 +69,7 @@ import org.telegram.ui.Components.URLSpanNoUnderlineBold;
|
||||||
import org.telegram.ui.Components.URLSpanReplacement;
|
import org.telegram.ui.Components.URLSpanReplacement;
|
||||||
import org.telegram.ui.Components.URLSpanUserMention;
|
import org.telegram.ui.Components.URLSpanUserMention;
|
||||||
import org.telegram.ui.Components.spoilers.SpoilerEffect;
|
import org.telegram.ui.Components.spoilers.SpoilerEffect;
|
||||||
|
import org.telegram.ui.PeerColorActivity;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -122,6 +123,7 @@ public class MessageObject {
|
||||||
public static final int TYPE_GIFT_PREMIUM_CHANNEL = 25;
|
public static final int TYPE_GIFT_PREMIUM_CHANNEL = 25;
|
||||||
public static final int TYPE_GIVEAWAY = 26;
|
public static final int TYPE_GIVEAWAY = 26;
|
||||||
public static final int TYPE_JOINED_CHANNEL = 27; // recommendations list
|
public static final int TYPE_JOINED_CHANNEL = 27; // recommendations list
|
||||||
|
public static final int TYPE_GIVEAWAY_RESULTS = 28;
|
||||||
|
|
||||||
public int localType;
|
public int localType;
|
||||||
public String localName;
|
public String localName;
|
||||||
|
@ -165,6 +167,7 @@ public class MessageObject {
|
||||||
public String dateKey;
|
public String dateKey;
|
||||||
public String monthKey;
|
public String monthKey;
|
||||||
public boolean deleted;
|
public boolean deleted;
|
||||||
|
public boolean deletedByThanos;
|
||||||
public float audioProgress;
|
public float audioProgress;
|
||||||
public float forceSeekTo = -1;
|
public float forceSeekTo = -1;
|
||||||
public int audioProgressMs;
|
public int audioProgressMs;
|
||||||
|
@ -212,7 +215,6 @@ public class MessageObject {
|
||||||
public boolean replyTextRevealed;
|
public boolean replyTextRevealed;
|
||||||
public int overrideLinkColor = -1;
|
public int overrideLinkColor = -1;
|
||||||
public long overrideLinkEmoji = -1;
|
public long overrideLinkEmoji = -1;
|
||||||
public MessagesController.PeerColor overrideProfilePeerColor;
|
|
||||||
private boolean channelJoined;
|
private boolean channelJoined;
|
||||||
public boolean channelJoinedExpanded;
|
public boolean channelJoinedExpanded;
|
||||||
|
|
||||||
|
@ -305,6 +307,8 @@ public class MessageObject {
|
||||||
" & ",
|
" & ",
|
||||||
" . "
|
" . "
|
||||||
};
|
};
|
||||||
|
public boolean isRepostPreview;
|
||||||
|
public boolean isRepostVideoPreview;
|
||||||
public boolean forceAvatar;
|
public boolean forceAvatar;
|
||||||
public Drawable customAvatarDrawable;
|
public Drawable customAvatarDrawable;
|
||||||
|
|
||||||
|
@ -441,7 +445,14 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasMediaSpoilers() {
|
public boolean hasMediaSpoilers() {
|
||||||
return messageOwner.media != null && messageOwner.media.spoiler || needDrawBluredPreview();
|
return !isRepostPreview && (messageOwner.media != null && messageOwner.media.spoiler || needDrawBluredPreview());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean shouldDrawReactions() {
|
||||||
|
if (isRepostPreview) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean shouldDrawReactionsInLayout() {
|
public boolean shouldDrawReactionsInLayout() {
|
||||||
|
@ -1487,8 +1498,15 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public MessageObject(int accountNum, TLRPC.Message message, MessageObject replyToMessage, AbstractMap<Long, TLRPC.User> users, AbstractMap<Long, TLRPC.Chat> chats, LongSparseArray<TLRPC.User> sUsers, LongSparseArray<TLRPC.Chat> sChats, boolean generateLayout, boolean checkMediaExists, long eid) {
|
public MessageObject(int accountNum, TLRPC.Message message, MessageObject replyToMessage, AbstractMap<Long, TLRPC.User> users, AbstractMap<Long, TLRPC.Chat> chats, LongSparseArray<TLRPC.User> sUsers, LongSparseArray<TLRPC.Chat> sChats, boolean generateLayout, boolean checkMediaExists, long eid) {
|
||||||
|
this(accountNum, message, replyToMessage, users, chats, sUsers, sChats, generateLayout, checkMediaExists, eid, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageObject(int accountNum, TLRPC.Message message, MessageObject replyToMessage, AbstractMap<Long, TLRPC.User> users, AbstractMap<Long, TLRPC.Chat> chats, LongSparseArray<TLRPC.User> sUsers, LongSparseArray<TLRPC.Chat> sChats, boolean generateLayout, boolean checkMediaExists, long eid, boolean isRepostPreview, boolean isRepostVideoPreview) {
|
||||||
Theme.createCommonMessageResources();
|
Theme.createCommonMessageResources();
|
||||||
|
|
||||||
|
this.isRepostPreview = isRepostPreview;
|
||||||
|
this.isRepostVideoPreview = isRepostVideoPreview;
|
||||||
|
|
||||||
currentAccount = accountNum;
|
currentAccount = accountNum;
|
||||||
messageOwner = message;
|
messageOwner = message;
|
||||||
replyMessageObject = replyToMessage;
|
replyMessageObject = replyToMessage;
|
||||||
|
@ -2696,6 +2714,133 @@ public class MessageObject {
|
||||||
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeColor) {
|
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeColor) {
|
||||||
TLRPC.TL_channelAdminLogEventActionChangeColor action = (TLRPC.TL_channelAdminLogEventActionChangeColor) event.action;
|
TLRPC.TL_channelAdminLogEventActionChangeColor action = (TLRPC.TL_channelAdminLogEventActionChangeColor) event.action;
|
||||||
messageText = replaceWithLink(LocaleController.formatString(R.string.EventLogChangedColor, AvatarDrawable.colorName(action.prev_value).toLowerCase(), AvatarDrawable.colorName(action.new_value).toLowerCase()), "un1", fromUser);
|
messageText = replaceWithLink(LocaleController.formatString(R.string.EventLogChangedColor, AvatarDrawable.colorName(action.prev_value).toLowerCase(), AvatarDrawable.colorName(action.new_value).toLowerCase()), "un1", fromUser);
|
||||||
|
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangePeerColor) {
|
||||||
|
TLRPC.TL_channelAdminLogEventActionChangePeerColor action = (TLRPC.TL_channelAdminLogEventActionChangePeerColor) event.action;
|
||||||
|
SpannableStringBuilder ssb = new SpannableStringBuilder(LocaleController.getString(R.string.EventLogChangedPeerColorIcon));
|
||||||
|
|
||||||
|
SpannableStringBuilder prev = new SpannableStringBuilder();
|
||||||
|
if ((action.prev_value.flags & 1) != 0) {
|
||||||
|
prev.append("c");
|
||||||
|
prev.setSpan(new PeerColorActivity.PeerColorSpan(false, currentAccount, action.prev_value.color).setSize(dp(18)), prev.length() - 1, prev.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
if ((action.prev_value.flags & 2) != 0) {
|
||||||
|
if (prev.length() > 0)
|
||||||
|
prev.append(", ");
|
||||||
|
prev.append("e");
|
||||||
|
prev.setSpan(new AnimatedEmojiSpan(action.prev_value.background_emoji_id, Theme.chat_actionTextPaint.getFontMetricsInt()), prev.length() - 1, prev.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
if (prev.length() == 0) {
|
||||||
|
prev.append(LocaleController.getString(R.string.EventLogEmojiNone));
|
||||||
|
}
|
||||||
|
|
||||||
|
SpannableStringBuilder next = new SpannableStringBuilder();
|
||||||
|
if ((action.new_value.flags & 1) != 0) {
|
||||||
|
next.append("c");
|
||||||
|
next.setSpan(new PeerColorActivity.PeerColorSpan(false, currentAccount, action.new_value.color).setSize(dp(18)), next.length() - 1, next.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
if ((action.new_value.flags & 2) != 0) {
|
||||||
|
if (next.length() > 0)
|
||||||
|
next.append(", ");
|
||||||
|
next.append("e");
|
||||||
|
next.setSpan(new AnimatedEmojiSpan(action.new_value.background_emoji_id, Theme.chat_actionTextPaint.getFontMetricsInt()), next.length() - 1, next.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
if (next.length() == 0) {
|
||||||
|
next.append(LocaleController.getString(R.string.EventLogEmojiNone));
|
||||||
|
}
|
||||||
|
|
||||||
|
ssb = AndroidUtilities.replaceCharSequence("%1$s", ssb, prev);
|
||||||
|
ssb = AndroidUtilities.replaceCharSequence("%2$s", ssb, next);
|
||||||
|
|
||||||
|
messageText = replaceWithLink(ssb, "un1", fromUser);
|
||||||
|
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeProfilePeerColor) {
|
||||||
|
TLRPC.TL_channelAdminLogEventActionChangeProfilePeerColor action = (TLRPC.TL_channelAdminLogEventActionChangeProfilePeerColor) event.action;
|
||||||
|
SpannableStringBuilder ssb = new SpannableStringBuilder(LocaleController.getString(R.string.EventLogChangedProfileColorIcon));
|
||||||
|
|
||||||
|
SpannableStringBuilder prev = new SpannableStringBuilder();
|
||||||
|
if ((action.prev_value.flags & 1) != 0) {
|
||||||
|
prev.append("c");
|
||||||
|
prev.setSpan(new PeerColorActivity.PeerColorSpan(true, currentAccount, action.prev_value.color).setSize(dp(18)), prev.length() - 1, prev.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
if ((action.prev_value.flags & 2) != 0) {
|
||||||
|
if (prev.length() > 0)
|
||||||
|
prev.append(", ");
|
||||||
|
prev.append("e");
|
||||||
|
prev.setSpan(new AnimatedEmojiSpan(action.prev_value.background_emoji_id, Theme.chat_actionTextPaint.getFontMetricsInt()), prev.length() - 1, prev.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
if (prev.length() == 0) {
|
||||||
|
prev.append(LocaleController.getString(R.string.EventLogEmojiNone));
|
||||||
|
}
|
||||||
|
|
||||||
|
SpannableStringBuilder next = new SpannableStringBuilder();
|
||||||
|
if ((action.new_value.flags & 1) != 0) {
|
||||||
|
next.append("c");
|
||||||
|
next.setSpan(new PeerColorActivity.PeerColorSpan(true, currentAccount, action.new_value.color).setSize(dp(18)), next.length() - 1, next.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
if ((action.new_value.flags & 2) != 0) {
|
||||||
|
if (next.length() > 0)
|
||||||
|
next.append(", ");
|
||||||
|
next.append("e");
|
||||||
|
next.setSpan(new AnimatedEmojiSpan(action.new_value.background_emoji_id, Theme.chat_actionTextPaint.getFontMetricsInt()), next.length() - 1, next.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
if (next.length() == 0) {
|
||||||
|
next.append(LocaleController.getString(R.string.EventLogEmojiNone));
|
||||||
|
}
|
||||||
|
|
||||||
|
ssb = AndroidUtilities.replaceCharSequence("%1$s", ssb, prev);
|
||||||
|
ssb = AndroidUtilities.replaceCharSequence("%2$s", ssb, next);
|
||||||
|
|
||||||
|
messageText = replaceWithLink(ssb, "un1", fromUser);
|
||||||
|
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeEmojiStatus) {
|
||||||
|
TLRPC.TL_channelAdminLogEventActionChangeEmojiStatus action = (TLRPC.TL_channelAdminLogEventActionChangeEmojiStatus) event.action;
|
||||||
|
|
||||||
|
boolean prevNone = false;
|
||||||
|
SpannableString prev;
|
||||||
|
if (action.prev_value instanceof TLRPC.TL_emojiStatusEmpty) {
|
||||||
|
prev = new SpannableString(LocaleController.getString(R.string.EventLogEmojiNone));
|
||||||
|
prevNone = true;
|
||||||
|
} else {
|
||||||
|
prev = new SpannableString("e");
|
||||||
|
prev.setSpan(new AnimatedEmojiSpan(DialogObject.getEmojiStatusDocumentId(action.prev_value), Theme.chat_actionTextPaint.getFontMetricsInt()), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean hasUntil = action.new_value instanceof TLRPC.TL_emojiStatusUntil;
|
||||||
|
|
||||||
|
SpannableString next;
|
||||||
|
if (action.new_value instanceof TLRPC.TL_emojiStatusEmpty) {
|
||||||
|
next = new SpannableString(LocaleController.getString(R.string.EventLogEmojiNone));
|
||||||
|
} else {
|
||||||
|
next = new SpannableString("e");
|
||||||
|
next.setSpan(new AnimatedEmojiSpan(DialogObject.getEmojiStatusDocumentId(action.new_value), Theme.chat_actionTextPaint.getFontMetricsInt()), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
SpannableStringBuilder ssb = new SpannableStringBuilder(LocaleController.getString(
|
||||||
|
prevNone ? (
|
||||||
|
hasUntil ? R.string.EventLogChangedEmojiStatusFor : R.string.EventLogChangedEmojiStatus
|
||||||
|
) : (
|
||||||
|
hasUntil ? R.string.EventLogChangedEmojiStatusFromFor : R.string.EventLogChangedEmojiStatusFrom
|
||||||
|
)
|
||||||
|
));
|
||||||
|
|
||||||
|
ssb = AndroidUtilities.replaceCharSequence("%1$s", ssb, prev);
|
||||||
|
ssb = AndroidUtilities.replaceCharSequence("%2$s", ssb, next);
|
||||||
|
if (hasUntil) {
|
||||||
|
String until = LocaleController.formatTTLString((int) ((DialogObject.getEmojiStatusUntil(action.new_value) - event.date) * 1.05f));
|
||||||
|
ssb = AndroidUtilities.replaceCharSequence("%3$s", ssb, until);
|
||||||
|
}
|
||||||
|
|
||||||
|
messageText = replaceWithLink(ssb, "un1", fromUser);
|
||||||
|
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeWallpaper) {
|
||||||
|
TLRPC.TL_channelAdminLogEventActionChangeWallpaper action = (TLRPC.TL_channelAdminLogEventActionChangeWallpaper) event.action;
|
||||||
|
if (action.new_value instanceof TLRPC.TL_wallPaperNoFile && action.new_value.id == 0 && action.new_value.settings == null) {
|
||||||
|
messageText = replaceWithLink(LocaleController.getString(R.string.EventLogRemovedWallpaper), "un1", fromUser);
|
||||||
|
} else {
|
||||||
|
photoThumbs = new ArrayList<>();
|
||||||
|
if (action.new_value.document != null) {
|
||||||
|
photoThumbs.addAll(action.new_value.document.thumbs);
|
||||||
|
photoThumbsObject = action.new_value.document;
|
||||||
|
}
|
||||||
|
messageText = replaceWithLink(LocaleController.getString(R.string.EventLogChangedWallpaper), "un1", fromUser);
|
||||||
|
}
|
||||||
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeBackgroundEmoji) {
|
} else if (event.action instanceof TLRPC.TL_channelAdminLogEventActionChangeBackgroundEmoji) {
|
||||||
TLRPC.TL_channelAdminLogEventActionChangeBackgroundEmoji action = (TLRPC.TL_channelAdminLogEventActionChangeBackgroundEmoji) event.action;
|
TLRPC.TL_channelAdminLogEventActionChangeBackgroundEmoji action = (TLRPC.TL_channelAdminLogEventActionChangeBackgroundEmoji) event.action;
|
||||||
messageText = replaceWithLink(LocaleController.getString(R.string.EventLogChangedEmoji), "un1", fromUser);
|
messageText = replaceWithLink(LocaleController.getString(R.string.EventLogChangedEmoji), "un1", fromUser);
|
||||||
|
@ -3441,7 +3586,7 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasInlineBotButtons() {
|
public boolean hasInlineBotButtons() {
|
||||||
return !isRestrictedMessage && messageOwner != null && messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup && !messageOwner.reply_markup.rows.isEmpty();
|
return !isRestrictedMessage && !isRepostPreview && messageOwner != null && messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup && !messageOwner.reply_markup.rows.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void measureInlineBotButtons() {
|
public void measureInlineBotButtons() {
|
||||||
|
@ -3555,6 +3700,8 @@ public class MessageObject {
|
||||||
} else {
|
} else {
|
||||||
messageText = LocaleController.formatString(R.string.ActionSetSameWallpaperForThisChat, user.first_name);
|
messageText = LocaleController.formatString(R.string.ActionSetSameWallpaperForThisChat, user.first_name);
|
||||||
}
|
}
|
||||||
|
} else if (fromChat != null) {
|
||||||
|
messageText = LocaleController.getString(R.string.ActionSetWallpaperForThisChannel);
|
||||||
}
|
}
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionSetChatWallPaper) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionSetChatWallPaper) {
|
||||||
contentType = 1;
|
contentType = 1;
|
||||||
|
@ -3593,6 +3740,8 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
messageText = AndroidUtilities.replaceCharSequence("%s", messageText, userName);
|
messageText = AndroidUtilities.replaceCharSequence("%s", messageText, userName);
|
||||||
}
|
}
|
||||||
|
} else if (fromChat != null) {
|
||||||
|
messageText = LocaleController.getString(R.string.ActionSetWallpaperForThisChannel);
|
||||||
}
|
}
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGroupCallScheduled) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGroupCallScheduled) {
|
||||||
TLRPC.TL_messageActionGroupCallScheduled action = (TLRPC.TL_messageActionGroupCallScheduled) messageOwner.action;
|
TLRPC.TL_messageActionGroupCallScheduled action = (TLRPC.TL_messageActionGroupCallScheduled) messageOwner.action;
|
||||||
|
@ -3790,9 +3939,9 @@ public class MessageObject {
|
||||||
stringBuilder.append(LocaleController.formatPluralString("BoostingGiveawayServiceUndistributed", giveawayResults.unclaimed_count));
|
stringBuilder.append(LocaleController.formatPluralString("BoostingGiveawayServiceUndistributed", giveawayResults.unclaimed_count));
|
||||||
}
|
}
|
||||||
messageText = stringBuilder;
|
messageText = stringBuilder;
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftCode) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftCode && ((TLRPC.TL_messageActionGiftCode) messageOwner.action).boost_peer != null) {
|
||||||
messageText = LocaleController.getString("BoostingReceivedGiftNoName", R.string.BoostingReceivedGiftNoName);
|
messageText = LocaleController.getString("BoostingReceivedGiftNoName", R.string.BoostingReceivedGiftNoName);
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftPremium) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftPremium || messageOwner.action instanceof TLRPC.TL_messageActionGiftCode) {
|
||||||
if (fromObject instanceof TLRPC.User && ((TLRPC.User) fromObject).self) {
|
if (fromObject instanceof TLRPC.User && ((TLRPC.User) fromObject).self) {
|
||||||
TLRPC.User user = getUser(users, sUsers, messageOwner.peer_id.user_id);
|
TLRPC.User user = getUser(users, sUsers, messageOwner.peer_id.user_id);
|
||||||
messageText = replaceWithLink(AndroidUtilities.replaceTags(LocaleController.getString(R.string.ActionGiftOutbound)), "un1", user);
|
messageText = replaceWithLink(AndroidUtilities.replaceTags(LocaleController.getString(R.string.ActionGiftOutbound)), "un1", user);
|
||||||
|
@ -3874,7 +4023,12 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionRequestedPeer) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionRequestedPeer) {
|
||||||
TLRPC.Peer peer = ((TLRPC.TL_messageActionRequestedPeer) messageOwner.action).peer;
|
List<TLObject> peerObjects = new ArrayList<>();
|
||||||
|
int sharedUsers = 0;
|
||||||
|
int sharedChannels = 0;
|
||||||
|
int sharedChats = 0;
|
||||||
|
List<TLRPC.Peer> peers = ((TLRPC.TL_messageActionRequestedPeer) messageOwner.action).peers;
|
||||||
|
for (TLRPC.Peer peer : peers) {
|
||||||
TLObject peerObject = null;
|
TLObject peerObject = null;
|
||||||
if (peer instanceof TLRPC.TL_peerUser) {
|
if (peer instanceof TLRPC.TL_peerUser) {
|
||||||
peerObject = MessagesController.getInstance(currentAccount).getUser(peer.user_id);
|
peerObject = MessagesController.getInstance(currentAccount).getUser(peer.user_id);
|
||||||
|
@ -3892,21 +4046,38 @@ public class MessageObject {
|
||||||
peerObject = getChat(chats, sChats, peer.channel_id);
|
peerObject = getChat(chats, sChats, peer.channel_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (peer instanceof TLRPC.TL_peerUser) {
|
||||||
|
sharedUsers++;
|
||||||
|
} else if (peer instanceof TLRPC.TL_peerChat) {
|
||||||
|
sharedChats++;
|
||||||
|
} else {
|
||||||
|
sharedChannels++;
|
||||||
|
}
|
||||||
|
if (peerObject != null) {
|
||||||
|
peerObjects.add(peerObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sharedUsers > 0 && sharedUsers != peerObjects.size()) {
|
||||||
|
messageText = LocaleController.getPluralString("ActionRequestedPeerUserPlural", sharedUsers);
|
||||||
|
} else if (sharedChannels > 0 && sharedChannels != peerObjects.size()) {
|
||||||
|
messageText = LocaleController.getPluralString("ActionRequestedPeerChannelPlural", sharedChannels);
|
||||||
|
} else if (sharedChats > 0 && sharedChats != peerObjects.size()) {
|
||||||
|
messageText = LocaleController.getPluralString("ActionRequestedPeerChatPlural", sharedChats);
|
||||||
|
} else {
|
||||||
|
String separator = ", ";
|
||||||
|
SpannableStringBuilder names = new SpannableStringBuilder();
|
||||||
|
for (int i = 0; i < peerObjects.size(); i++) {
|
||||||
|
names.append(replaceWithLink("un1", "un1", peerObjects.get(i)));
|
||||||
|
if (i < peerObjects.size() - 1) {
|
||||||
|
names.append(separator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
messageText = AndroidUtilities.replaceCharSequence("un1", LocaleController.getString(R.string.ActionRequestedPeer), names);
|
||||||
|
}
|
||||||
TLRPC.User bot = MessagesController.getInstance(currentAccount).getUser(getDialogId());
|
TLRPC.User bot = MessagesController.getInstance(currentAccount).getUser(getDialogId());
|
||||||
if (bot == null) {
|
if (bot == null) {
|
||||||
bot = getUser(users, sUsers, getDialogId());
|
bot = getUser(users, sUsers, getDialogId());
|
||||||
}
|
}
|
||||||
if (peerObject == null) {
|
|
||||||
if (peer instanceof TLRPC.TL_peerUser) {
|
|
||||||
messageText = LocaleController.getString(R.string.ActionRequestedPeerUser);
|
|
||||||
} else if (peer instanceof TLRPC.TL_peerChat) {
|
|
||||||
messageText = LocaleController.getString(R.string.ActionRequestedPeerChat);
|
|
||||||
} else {
|
|
||||||
messageText = LocaleController.getString(R.string.ActionRequestedPeerChannel);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
messageText = replaceWithLink(LocaleController.getString(R.string.ActionRequestedPeer), "un1", peerObject);
|
|
||||||
}
|
|
||||||
messageText = replaceWithLink(messageText, "un2", bot);
|
messageText = replaceWithLink(messageText, "un2", bot);
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionSetMessagesTTL) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionSetMessagesTTL) {
|
||||||
TLRPC.TL_messageActionSetMessagesTTL action = (TLRPC.TL_messageActionSetMessagesTTL) messageOwner.action;
|
TLRPC.TL_messageActionSetMessagesTTL action = (TLRPC.TL_messageActionSetMessagesTTL) messageOwner.action;
|
||||||
|
@ -4241,15 +4412,19 @@ public class MessageObject {
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionSetChatTheme) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionSetChatTheme) {
|
||||||
String emoticon = ((TLRPC.TL_messageActionSetChatTheme) messageOwner.action).emoticon;
|
String emoticon = ((TLRPC.TL_messageActionSetChatTheme) messageOwner.action).emoticon;
|
||||||
String userName = UserObject.getFirstName(fromUser);
|
String userName = UserObject.getFirstName(fromUser);
|
||||||
|
boolean isChannel = fromUser == null && fromChat != null;
|
||||||
|
if (isChannel) {
|
||||||
|
userName = fromChat.title;
|
||||||
|
}
|
||||||
boolean isUserSelf = UserObject.isUserSelf(fromUser);
|
boolean isUserSelf = UserObject.isUserSelf(fromUser);
|
||||||
if (TextUtils.isEmpty(emoticon)) {
|
if (TextUtils.isEmpty(emoticon)) {
|
||||||
messageText = isUserSelf
|
messageText = isUserSelf
|
||||||
? LocaleController.formatString("ChatThemeDisabledYou", R.string.ChatThemeDisabledYou)
|
? LocaleController.formatString("ChatThemeDisabledYou", R.string.ChatThemeDisabledYou)
|
||||||
: LocaleController.formatString("ChatThemeDisabled", R.string.ChatThemeDisabled, userName, emoticon);
|
: LocaleController.formatString(isChannel ? R.string.ChannelThemeDisabled : R.string.ChatThemeDisabled, userName, emoticon);
|
||||||
} else {
|
} else {
|
||||||
messageText = isUserSelf
|
messageText = isUserSelf
|
||||||
? LocaleController.formatString("ChatThemeChangedYou", R.string.ChatThemeChangedYou, emoticon)
|
? LocaleController.formatString("ChatThemeChangedYou", R.string.ChatThemeChangedYou, emoticon)
|
||||||
: LocaleController.formatString("ChatThemeChangedTo", R.string.ChatThemeChangedTo, userName, emoticon);
|
: LocaleController.formatString(isChannel ? R.string.ChannelThemeChangedTo : R.string.ChatThemeChangedTo, userName, emoticon);
|
||||||
}
|
}
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByRequest) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionChatJoinedByRequest) {
|
||||||
if (UserObject.isUserSelf(fromUser)) {
|
if (UserObject.isUserSelf(fromUser)) {
|
||||||
|
@ -4272,6 +4447,8 @@ public class MessageObject {
|
||||||
// messageText = getMediaTitle(getMedia(messageOwner)); // I'm afraid doing this
|
// messageText = getMediaTitle(getMedia(messageOwner)); // I'm afraid doing this
|
||||||
if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaGiveaway) {
|
if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaGiveaway) {
|
||||||
messageText = LocaleController.getString("BoostingGiveawayChannelStarted", R.string.BoostingGiveawayChannelStarted);
|
messageText = LocaleController.getString("BoostingGiveawayChannelStarted", R.string.BoostingGiveawayChannelStarted);
|
||||||
|
} else if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaGiveawayResults) {
|
||||||
|
messageText = LocaleController.getString("BoostingGiveawayResults", R.string.BoostingGiveawayResults);
|
||||||
} else if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaStory) {
|
} else if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaStory) {
|
||||||
if (getMedia(messageOwner).via_mention) {
|
if (getMedia(messageOwner).via_mention) {
|
||||||
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(getMedia(messageOwner).user_id);
|
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(getMedia(messageOwner).user_id);
|
||||||
|
@ -4375,6 +4552,8 @@ public class MessageObject {
|
||||||
public CharSequence getMediaTitle(TLRPC.MessageMedia media) {
|
public CharSequence getMediaTitle(TLRPC.MessageMedia media) {
|
||||||
if (media instanceof TLRPC.TL_messageMediaGiveaway) {
|
if (media instanceof TLRPC.TL_messageMediaGiveaway) {
|
||||||
return LocaleController.getString("BoostingGiveaway", R.string.BoostingGiveaway);
|
return LocaleController.getString("BoostingGiveaway", R.string.BoostingGiveaway);
|
||||||
|
} else if (media instanceof TLRPC.TL_messageMediaGiveawayResults) {
|
||||||
|
return LocaleController.getString("BoostingGiveawayResults", R.string.BoostingGiveawayResults);
|
||||||
} else if (media instanceof TLRPC.TL_messageMediaStory) {
|
} else if (media instanceof TLRPC.TL_messageMediaStory) {
|
||||||
if (media.via_mention) {
|
if (media.via_mention) {
|
||||||
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(media.user_id);
|
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(media.user_id);
|
||||||
|
@ -4522,6 +4701,8 @@ public class MessageObject {
|
||||||
type = TYPE_DATE;
|
type = TYPE_DATE;
|
||||||
} else if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaGiveaway) {
|
} else if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaGiveaway) {
|
||||||
type = TYPE_GIVEAWAY;
|
type = TYPE_GIVEAWAY;
|
||||||
|
} else if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaGiveawayResults) {
|
||||||
|
type = TYPE_GIVEAWAY_RESULTS;
|
||||||
} else if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaDice) {
|
} else if (getMedia(messageOwner) instanceof TLRPC.TL_messageMediaDice) {
|
||||||
type = TYPE_ANIMATED_STICKER;
|
type = TYPE_ANIMATED_STICKER;
|
||||||
if (getMedia(messageOwner).document == null) {
|
if (getMedia(messageOwner).document == null) {
|
||||||
|
@ -4579,6 +4760,19 @@ public class MessageObject {
|
||||||
contentType = 1;
|
contentType = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (currentEvent != null && currentEvent.action instanceof TLRPC.TL_channelAdminLogEventActionChangeWallpaper) {
|
||||||
|
TLRPC.TL_channelAdminLogEventActionChangeWallpaper wallPaper = (TLRPC.TL_channelAdminLogEventActionChangeWallpaper) currentEvent.action;
|
||||||
|
contentType = 1;
|
||||||
|
if (wallPaper.new_value instanceof TLRPC.TL_wallPaperNoFile && wallPaper.new_value.id == 0 && wallPaper.new_value.settings == null) {
|
||||||
|
type = TYPE_DATE;
|
||||||
|
} else {
|
||||||
|
type = TYPE_ACTION_WALLPAPER;
|
||||||
|
photoThumbs = new ArrayList<>();
|
||||||
|
if (wallPaper.new_value.document != null) {
|
||||||
|
photoThumbs.addAll(wallPaper.new_value.document.thumbs);
|
||||||
|
photoThumbsObject = wallPaper.new_value.document;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (messageOwner instanceof TLRPC.TL_messageService) {
|
} else if (messageOwner instanceof TLRPC.TL_messageService) {
|
||||||
if (messageOwner.action instanceof TLRPC.TL_messageActionSetSameChatWallPaper) {
|
if (messageOwner.action instanceof TLRPC.TL_messageActionSetSameChatWallPaper) {
|
||||||
contentType = 1;
|
contentType = 1;
|
||||||
|
@ -4600,10 +4794,10 @@ public class MessageObject {
|
||||||
photoThumbsObject = messageOwner.action.photo;
|
photoThumbsObject = messageOwner.action.photo;
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionLoginUnknownLocation) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionLoginUnknownLocation) {
|
||||||
type = TYPE_TEXT;
|
type = TYPE_TEXT;
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftCode) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftCode && ((TLRPC.TL_messageActionGiftCode) messageOwner.action).boost_peer != null) {
|
||||||
contentType = 1;
|
contentType = 1;
|
||||||
type = TYPE_GIFT_PREMIUM_CHANNEL;
|
type = TYPE_GIFT_PREMIUM_CHANNEL;
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftPremium) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionGiftPremium || messageOwner.action instanceof TLRPC.TL_messageActionGiftCode) {
|
||||||
contentType = 1;
|
contentType = 1;
|
||||||
type = TYPE_GIFT_PREMIUM;
|
type = TYPE_GIFT_PREMIUM;
|
||||||
} else if (messageOwner.action instanceof TLRPC.TL_messageActionChatEditPhoto || messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) {
|
} else if (messageOwner.action instanceof TLRPC.TL_messageActionChatEditPhoto || messageOwner.action instanceof TLRPC.TL_messageActionUserUpdatedPhoto) {
|
||||||
|
@ -5937,6 +6131,9 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean needDrawShareButton() {
|
public boolean needDrawShareButton() {
|
||||||
|
if (isRepostPreview) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (type == TYPE_JOINED_CHANNEL) {
|
if (type == TYPE_JOINED_CHANNEL) {
|
||||||
return false;
|
return false;
|
||||||
} else if (isSponsored()) {
|
} else if (isSponsored()) {
|
||||||
|
@ -6158,10 +6355,11 @@ public class MessageObject {
|
||||||
final float lineSpacing = 1f;
|
final float lineSpacing = 1f;
|
||||||
final float lineAdd = totalAnimatedEmojiCount >= 4 ? -1 : 0;
|
final float lineAdd = totalAnimatedEmojiCount >= 4 ? -1 : 0;
|
||||||
Layout.Alignment align = Layout.Alignment.ALIGN_NORMAL; //type == TYPE_EMOJIS && isOut() ? Layout.Alignment.ALIGN_OPPOSITE : Layout.Alignment.ALIGN_NORMAL;
|
Layout.Alignment align = Layout.Alignment.ALIGN_NORMAL; //type == TYPE_EMOJIS && isOut() ? Layout.Alignment.ALIGN_OPPOSITE : Layout.Alignment.ALIGN_NORMAL;
|
||||||
|
CharSequence text = messageText;
|
||||||
try {
|
try {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
StaticLayout.Builder builder =
|
StaticLayout.Builder builder =
|
||||||
StaticLayout.Builder.obtain(messageText, 0, messageText.length(), paint, maxWidth)
|
StaticLayout.Builder.obtain(text, 0, text.length(), paint, maxWidth)
|
||||||
.setLineSpacing(lineAdd, lineSpacing)
|
.setLineSpacing(lineAdd, lineSpacing)
|
||||||
.setBreakStrategy(StaticLayout.BREAK_STRATEGY_HIGH_QUALITY)
|
.setBreakStrategy(StaticLayout.BREAK_STRATEGY_HIGH_QUALITY)
|
||||||
.setHyphenationFrequency(StaticLayout.HYPHENATION_FREQUENCY_NONE)
|
.setHyphenationFrequency(StaticLayout.HYPHENATION_FREQUENCY_NONE)
|
||||||
|
@ -6174,13 +6372,76 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
textLayout = builder.build();
|
textLayout = builder.build();
|
||||||
} else {
|
} else {
|
||||||
textLayout = new StaticLayout(messageText, paint, maxWidth, align, lineSpacing, lineAdd, false);
|
textLayout = new StaticLayout(text, paint, maxWidth, align, lineSpacing, lineAdd, false);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isRepostPreview) {
|
||||||
|
int maxLines = 22;
|
||||||
|
if (type != MessageObject.TYPE_TEXT) {
|
||||||
|
maxLines = hasValidGroupId() ? 7 : 12;
|
||||||
|
}
|
||||||
|
if (isWebpage()) {
|
||||||
|
maxLines -= 8;
|
||||||
|
}
|
||||||
|
if (textLayout.getLineCount() > maxLines) {
|
||||||
|
String readMore = LocaleController.getString(R.string.ReadMore);
|
||||||
|
int readMoreWidth = (int) Math.ceil(paint.measureText("… " + readMore) + AndroidUtilities.dp(1));
|
||||||
|
|
||||||
|
float maxRight = 0;
|
||||||
|
for (int i = 0; i < maxLines; ++i) {
|
||||||
|
maxRight = Math.max(maxRight, textLayout.getLineRight(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
int start = textLayout.getLineStart(maxLines - 1);
|
||||||
|
int end = textLayout.getLineEnd(maxLines - 1) - 1;
|
||||||
|
int offset = end;
|
||||||
|
for (; offset >= start; --offset) {
|
||||||
|
if (textLayout.getPrimaryHorizontal(offset) < maxRight - readMoreWidth) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (; offset >= start; --offset) {
|
||||||
|
if (Character.isWhitespace(text.charAt(offset))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
text = new SpannableStringBuilder(text.subSequence(0, offset)).append("… ").append(readMore);
|
||||||
|
((SpannableStringBuilder) text).setSpan(new CharacterStyle() {
|
||||||
|
@Override
|
||||||
|
public void updateDrawState(TextPaint tp) {
|
||||||
|
tp.setColor(Theme.chat_msgTextPaint.linkColor);
|
||||||
|
}
|
||||||
|
}, text.length() - readMore.length(), text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
StaticLayout.Builder builder =
|
||||||
|
StaticLayout.Builder.obtain(text, 0, text.length(), paint, maxWidth)
|
||||||
|
.setLineSpacing(lineAdd, lineSpacing)
|
||||||
|
.setBreakStrategy(StaticLayout.BREAK_STRATEGY_HIGH_QUALITY)
|
||||||
|
.setHyphenationFrequency(StaticLayout.HYPHENATION_FREQUENCY_NONE)
|
||||||
|
.setAlignment(align);
|
||||||
|
if (emojiOnlyCount > 0) {
|
||||||
|
builder.setIncludePad(false);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
|
builder.setUseLineSpacingFromFallbacks(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
textLayout = builder.build();
|
||||||
|
} else {
|
||||||
|
textLayout = new StaticLayout(text, paint, maxWidth, align, lineSpacing, lineAdd, false);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (hasSingleQuote) {
|
if (hasSingleQuote) {
|
||||||
maxWidth += AndroidUtilities.dp(32);
|
maxWidth += AndroidUtilities.dp(32);
|
||||||
} else if (hasSingleCode) {
|
} else if (hasSingleCode) {
|
||||||
|
@ -6202,9 +6463,9 @@ public class MessageObject {
|
||||||
float prevOffset = 0;
|
float prevOffset = 0;
|
||||||
|
|
||||||
ArrayList<TextRange> textRanges = new ArrayList<>();
|
ArrayList<TextRange> textRanges = new ArrayList<>();
|
||||||
if (messageText instanceof Spanned && (hasQuote || hasCode)) {
|
if (text instanceof Spanned && (hasQuote || hasCode)) {
|
||||||
singleLayout = false;
|
singleLayout = false;
|
||||||
cutIntoRanges(messageText, textRanges);
|
cutIntoRanges(text, textRanges);
|
||||||
} else if (singleLayout || blocksCount == 1) {
|
} else if (singleLayout || blocksCount == 1) {
|
||||||
textRanges.add(new TextRange(0, textLayout.getText().length()));
|
textRanges.add(new TextRange(0, textLayout.getText().length()));
|
||||||
} else {
|
} else {
|
||||||
|
@ -6281,7 +6542,7 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CharSequence blockText = messageText.subSequence(range.start, range.end);
|
CharSequence blockText = text.subSequence(range.start, range.end);
|
||||||
int blockMaxWidth = maxWidth;
|
int blockMaxWidth = maxWidth;
|
||||||
if (block.quote) {
|
if (block.quote) {
|
||||||
blockMaxWidth -= dp(24);
|
blockMaxWidth -= dp(24);
|
||||||
|
@ -6506,6 +6767,9 @@ public class MessageObject {
|
||||||
|
|
||||||
textWidth = Math.max(textWidth, Math.min(maxWidth, linesMaxWidth));
|
textWidth = Math.max(textWidth, Math.min(maxWidth, linesMaxWidth));
|
||||||
}
|
}
|
||||||
|
if (block.languageLayout != null) {
|
||||||
|
textWidth = (int) Math.max(textWidth, Math.min(block.languageLayout.getCurrentWidth() + dp(15), block.textLayout == null ? 0 : block.textLayout.getWidth()));
|
||||||
|
}
|
||||||
|
|
||||||
linesOffset += currentBlockLinesCount;
|
linesOffset += currentBlockLinesCount;
|
||||||
|
|
||||||
|
@ -6589,6 +6853,62 @@ public class MessageObject {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (messageObject != null && messageObject.isRepostPreview) {
|
||||||
|
int maxLines = 22;
|
||||||
|
if (messageObject.type != MessageObject.TYPE_TEXT) {
|
||||||
|
maxLines = messageObject.hasValidGroupId() ? 7 : 12;
|
||||||
|
}
|
||||||
|
if (messageObject.isWebpage()) {
|
||||||
|
maxLines -= 8;
|
||||||
|
}
|
||||||
|
if (textLayout.getLineCount() > maxLines) {
|
||||||
|
String readMore = LocaleController.getString(R.string.ReadMore);
|
||||||
|
int readMoreWidth = (int) Math.ceil(textPaint.measureText("… " + readMore) + AndroidUtilities.dp(1));
|
||||||
|
|
||||||
|
float maxRight = 0;
|
||||||
|
for (int i = 0; i < maxLines; ++i) {
|
||||||
|
maxRight = Math.max(maxRight, textLayout.getLineRight(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
int start = textLayout.getLineStart(maxLines - 1);
|
||||||
|
int end = textLayout.getLineEnd(maxLines - 1) - 1;
|
||||||
|
int offset = end;
|
||||||
|
for (; offset >= start; --offset) {
|
||||||
|
if (textLayout.getPrimaryHorizontal(offset) < maxRight - readMoreWidth) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (; offset >= start; --offset) {
|
||||||
|
if (Character.isWhitespace(text.charAt(offset))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
text = new SpannableStringBuilder(text.subSequence(0, offset)).append("… ").append(readMore);
|
||||||
|
((SpannableStringBuilder) text).setSpan(new CharacterStyle() {
|
||||||
|
@Override
|
||||||
|
public void updateDrawState(TextPaint tp) {
|
||||||
|
tp.setColor(Theme.chat_msgTextPaint.linkColor);
|
||||||
|
}
|
||||||
|
}, text.length() - readMore.length(), text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
StaticLayout.Builder builder =
|
||||||
|
StaticLayout.Builder.obtain(text, 0, text.length(), textPaint, width)
|
||||||
|
.setLineSpacing(lineAdd, lineSpacing)
|
||||||
|
.setBreakStrategy(StaticLayout.BREAK_STRATEGY_HIGH_QUALITY)
|
||||||
|
.setHyphenationFrequency(StaticLayout.HYPHENATION_FREQUENCY_NONE)
|
||||||
|
.setAlignment(align);
|
||||||
|
textLayout = builder.build();
|
||||||
|
} else {
|
||||||
|
textLayout = new StaticLayout(text, textPaint, width, align, lineSpacing, lineAdd, false);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (hasSingleQuote) {
|
if (hasSingleQuote) {
|
||||||
width += AndroidUtilities.dp(32);
|
width += AndroidUtilities.dp(32);
|
||||||
|
@ -6874,6 +7194,9 @@ public class MessageObject {
|
||||||
|
|
||||||
textWidth = Math.max(textWidth, Math.min(width, linesMaxWidth));
|
textWidth = Math.max(textWidth, Math.min(width, linesMaxWidth));
|
||||||
}
|
}
|
||||||
|
if (block.languageLayout != null) {
|
||||||
|
textWidth = (int) Math.max(textWidth, Math.min(block.languageLayout.getCurrentWidth() + dp(15), block.textLayout == null ? 0 : block.textLayout.getWidth()));
|
||||||
|
}
|
||||||
|
|
||||||
linesOffset += currentBlockLinesCount;
|
linesOffset += currentBlockLinesCount;
|
||||||
if (messageObject != null && !messageObject.isSpoilersRevealed && !messageObject.spoiledLoginCode) {
|
if (messageObject != null && !messageObject.isSpoilersRevealed && !messageObject.spoiledLoginCode) {
|
||||||
|
@ -6918,6 +7241,9 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean needDrawAvatar() {
|
public boolean needDrawAvatar() {
|
||||||
|
if (isRepostPreview) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (forceAvatar || customAvatarDrawable != null) {
|
if (forceAvatar || customAvatarDrawable != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -6925,6 +7251,9 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean needDrawAvatarInternal() {
|
private boolean needDrawAvatarInternal() {
|
||||||
|
if (isRepostPreview) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (forceAvatar || customAvatarDrawable != null) {
|
if (forceAvatar || customAvatarDrawable != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -7199,7 +7528,22 @@ public class MessageObject {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean shouldEncryptPhotoOrVideo(TLRPC.Message message) {
|
public static long getChatId(TLRPC.Message message) {
|
||||||
|
if (message == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (message.peer_id instanceof TLRPC.TL_peerChat) {
|
||||||
|
return message.peer_id.chat_id;
|
||||||
|
} else if (message.peer_id instanceof TLRPC.TL_peerChannel) {
|
||||||
|
return message.peer_id.channel_id;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean shouldEncryptPhotoOrVideo(int currentAccount, TLRPC.Message message) {
|
||||||
|
if (MessagesController.getInstance(currentAccount).isChatNoForwards(getChatId(message)) || message != null && message.noforwards) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (message instanceof TLRPC.TL_message_secret) {
|
if (message instanceof TLRPC.TL_message_secret) {
|
||||||
return (getMedia(message) instanceof TLRPC.TL_messageMediaPhoto || isVideoMessage(message)) && message.ttl > 0 && message.ttl <= 60;
|
return (getMedia(message) instanceof TLRPC.TL_messageMediaPhoto || isVideoMessage(message)) && message.ttl > 0 && message.ttl <= 60;
|
||||||
} else {
|
} else {
|
||||||
|
@ -7208,7 +7552,7 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean shouldEncryptPhotoOrVideo() {
|
public boolean shouldEncryptPhotoOrVideo() {
|
||||||
return shouldEncryptPhotoOrVideo(messageOwner);
|
return shouldEncryptPhotoOrVideo(currentAccount, messageOwner);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isSecretPhotoOrVideo(TLRPC.Message message) {
|
public static boolean isSecretPhotoOrVideo(TLRPC.Message message) {
|
||||||
|
@ -7230,6 +7574,9 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean needDrawBluredPreview() {
|
public boolean needDrawBluredPreview() {
|
||||||
|
if (isRepostPreview) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (hasExtendedMediaPreview()) {
|
if (hasExtendedMediaPreview()) {
|
||||||
return true;
|
return true;
|
||||||
} else if (messageOwner instanceof TLRPC.TL_message_secret) {
|
} else if (messageOwner instanceof TLRPC.TL_message_secret) {
|
||||||
|
@ -8063,6 +8410,14 @@ public class MessageObject {
|
||||||
return isVoiceMessage(messageOwner);
|
return isVoiceMessage(messageOwner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isVoiceOnce() {
|
||||||
|
return isVoice() && messageOwner != null && messageOwner.media != null && messageOwner.media.ttl_seconds == 0x7FFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRoundOnce() {
|
||||||
|
return isRoundVideo() && messageOwner != null && messageOwner.media != null && messageOwner.media.ttl_seconds == 0x7FFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isVideo() {
|
public boolean isVideo() {
|
||||||
return isVideoMessage(messageOwner);
|
return isVideoMessage(messageOwner);
|
||||||
}
|
}
|
||||||
|
@ -9095,6 +9450,7 @@ public class MessageObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean probablyRingtone() {
|
public boolean probablyRingtone() {
|
||||||
|
if (isVoiceOnce()) return false;
|
||||||
if (getDocument() != null && RingtoneDataStore.ringtoneSupportedMimeType.contains(getDocument().mime_type) && getDocument().size < MessagesController.getInstance(currentAccount).ringtoneSizeMax * 2) {
|
if (getDocument() != null && RingtoneDataStore.ringtoneSupportedMimeType.contains(getDocument().mime_type) && getDocument().size < MessagesController.getInstance(currentAccount).ringtoneSizeMax * 2) {
|
||||||
for (int a = 0; a < getDocument().attributes.size(); a++) {
|
for (int a = 0; a < getDocument().attributes.size(); a++) {
|
||||||
TLRPC.DocumentAttribute attribute = getDocument().attributes.get(a);
|
TLRPC.DocumentAttribute attribute = getDocument().attributes.get(a);
|
||||||
|
@ -9166,6 +9522,14 @@ public class MessageObject {
|
||||||
return type == MessageObject.TYPE_GIVEAWAY;
|
return type == MessageObject.TYPE_GIVEAWAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isGiveawayOrGiveawayResults() {
|
||||||
|
return isGiveaway() || isGiveawayResults();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isGiveawayResults() {
|
||||||
|
return type == MessageObject.TYPE_GIVEAWAY_RESULTS;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isAnyGift() {
|
public boolean isAnyGift() {
|
||||||
return type == MessageObject.TYPE_GIFT_PREMIUM || type == MessageObject.TYPE_GIFT_PREMIUM_CHANNEL;
|
return type == MessageObject.TYPE_GIFT_PREMIUM || type == MessageObject.TYPE_GIFT_PREMIUM_CHANNEL;
|
||||||
}
|
}
|
||||||
|
@ -9332,7 +9696,7 @@ public class MessageObject {
|
||||||
final boolean hasLinkPreview = !isRestrictedMessage && MessageObject.getMedia(messageOwner) instanceof TLRPC.TL_messageMediaWebPage && MessageObject.getMedia(messageOwner).webpage instanceof TLRPC.TL_webPage;
|
final boolean hasLinkPreview = !isRestrictedMessage && MessageObject.getMedia(messageOwner) instanceof TLRPC.TL_messageMediaWebPage && MessageObject.getMedia(messageOwner).webpage instanceof TLRPC.TL_webPage;
|
||||||
final TLRPC.WebPage webpage = hasLinkPreview ? MessageObject.getMedia(messageOwner).webpage : null;
|
final TLRPC.WebPage webpage = hasLinkPreview ? MessageObject.getMedia(messageOwner).webpage : null;
|
||||||
final String webpageType = webpage != null ? webpage.type : null;
|
final String webpageType = webpage != null ? webpage.type : null;
|
||||||
return hasLinkPreview && !isGiveaway() &&
|
return hasLinkPreview && !isGiveawayOrGiveawayResults() &&
|
||||||
webpage != null && (webpage.photo != null || isVideoDocument(webpage.document)) &&
|
webpage != null && (webpage.photo != null || isVideoDocument(webpage.document)) &&
|
||||||
!(webpage != null && TextUtils.isEmpty(webpage.description) && TextUtils.isEmpty(webpage.title)) &&
|
!(webpage != null && TextUtils.isEmpty(webpage.description) && TextUtils.isEmpty(webpage.title)) &&
|
||||||
!(isSponsored() && sponsoredWebPage == null && sponsoredChannelPost == 0) && // drawInstantViewType = 1
|
!(isSponsored() && sponsoredWebPage == null && sponsoredChannelPost == 0) && // drawInstantViewType = 1
|
||||||
|
|
|
@ -196,6 +196,7 @@ public class MessagePreviewParams {
|
||||||
public boolean webpagePhoto;
|
public boolean webpagePhoto;
|
||||||
|
|
||||||
public boolean noforwards;
|
public boolean noforwards;
|
||||||
|
public boolean hasSecretMessages;
|
||||||
|
|
||||||
public TLRPC.WebPage webpage;
|
public TLRPC.WebPage webpage;
|
||||||
public CharacterStyle currentLink;
|
public CharacterStyle currentLink;
|
||||||
|
@ -206,10 +207,13 @@ public class MessagePreviewParams {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateReply(MessageObject replyMessageObject, MessageObject.GroupedMessages group, long dialogId, ChatActivity.ReplyQuote replyQuote) {
|
public void updateReply(MessageObject replyMessageObject, MessageObject.GroupedMessages group, long dialogId, ChatActivity.ReplyQuote replyQuote) {
|
||||||
if (isSecret || replyMessageObject == null || replyMessageObject.type == MessageObject.TYPE_DATE || replyMessageObject.type == MessageObject.TYPE_ACTION_PHOTO || replyMessageObject.type == MessageObject.TYPE_ACTION_WALLPAPER || replyMessageObject.type == MessageObject.TYPE_SUGGEST_PHOTO) {
|
if (isSecret || replyMessageObject == null || replyMessageObject.type == MessageObject.TYPE_DATE || replyMessageObject.type == MessageObject.TYPE_ACTION_PHOTO
|
||||||
|
|| replyMessageObject.type == MessageObject.TYPE_ACTION_WALLPAPER || replyMessageObject.type == MessageObject.TYPE_SUGGEST_PHOTO
|
||||||
|
|| replyMessageObject.type == MessageObject.TYPE_GIFT_PREMIUM || replyMessageObject.type == MessageObject.TYPE_GIFT_PREMIUM_CHANNEL || replyMessageObject.type == MessageObject.TYPE_PHONE_CALL) {
|
||||||
replyMessageObject = null;
|
replyMessageObject = null;
|
||||||
replyQuote = null;
|
replyQuote = null;
|
||||||
}
|
}
|
||||||
|
hasSecretMessages = replyMessageObject != null && (replyMessageObject.isVoiceOnce() || replyMessageObject.isRoundOnce());
|
||||||
if (replyMessageObject != null || replyQuote != null) {
|
if (replyMessageObject != null || replyQuote != null) {
|
||||||
if (group != null) {
|
if (group != null) {
|
||||||
replyMessage = new Messages(null, 1, group.messages, dialogId, null);
|
replyMessage = new Messages(null, 1, group.messages, dialogId, null);
|
||||||
|
@ -341,11 +345,12 @@ public class MessagePreviewParams {
|
||||||
|
|
||||||
public boolean hasLink(CharSequence text, String url) {
|
public boolean hasLink(CharSequence text, String url) {
|
||||||
if (url != null) {
|
if (url != null) {
|
||||||
|
try {
|
||||||
Spannable spanned = SpannableString.valueOf(text);
|
Spannable spanned = SpannableString.valueOf(text);
|
||||||
try {
|
try {
|
||||||
AndroidUtilities.addLinks(spanned, Linkify.WEB_URLS);
|
AndroidUtilities.addLinks(spanned, Linkify.WEB_URLS);
|
||||||
} catch (Exception e) {
|
} catch (Exception e2) {
|
||||||
FileLog.e(e);
|
FileLog.e(e2);
|
||||||
}
|
}
|
||||||
URLSpan[] urlSpans = spanned.getSpans(0, spanned.length(), URLSpan.class);
|
URLSpan[] urlSpans = spanned.getSpans(0, spanned.length(), URLSpan.class);
|
||||||
|
|
||||||
|
@ -354,6 +359,9 @@ public class MessagePreviewParams {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -449,6 +457,10 @@ public class MessagePreviewParams {
|
||||||
}
|
}
|
||||||
|
|
||||||
message.out = out == null ? messageObject.messageOwner.out : out;
|
message.out = out == null ? messageObject.messageOwner.out : out;
|
||||||
|
if (message.out) {
|
||||||
|
message.from_id = new TLRPC.TL_peerUser();
|
||||||
|
message.from_id.user_id = UserConfig.getInstance(messageObject.currentAccount).getClientUserId();
|
||||||
|
}
|
||||||
message.unread = false;
|
message.unread = false;
|
||||||
message.via_bot_id = messageObject.messageOwner.via_bot_id;
|
message.via_bot_id = messageObject.messageOwner.via_bot_id;
|
||||||
message.reply_markup = messageObject.messageOwner.reply_markup;
|
message.reply_markup = messageObject.messageOwner.reply_markup;
|
||||||
|
@ -464,7 +476,7 @@ public class MessagePreviewParams {
|
||||||
|
|
||||||
if (msgtype == 0) {
|
if (msgtype == 0) {
|
||||||
TLRPC.MessageFwdHeader header = null;
|
TLRPC.MessageFwdHeader header = null;
|
||||||
long clientUserId = UserConfig.getInstance(messageObject.currentAccount).clientUserId;
|
long clientUserId = UserConfig.getInstance(messageObject.currentAccount).getClientUserId();
|
||||||
if (!isSecret) {
|
if (!isSecret) {
|
||||||
if (messageObject.messageOwner.fwd_from != null) {
|
if (messageObject.messageOwner.fwd_from != null) {
|
||||||
header = messageObject.messageOwner.fwd_from;
|
header = messageObject.messageOwner.fwd_from;
|
||||||
|
|
|
@ -515,7 +515,6 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
public int ringtoneSizeMax;
|
public int ringtoneSizeMax;
|
||||||
public boolean storiesExportNopublicLink;
|
public boolean storiesExportNopublicLink;
|
||||||
public int authorizationAutoconfirmPeriod;
|
public int authorizationAutoconfirmPeriod;
|
||||||
public int channelColorLevelMin;
|
|
||||||
public int quoteLengthMax;
|
public int quoteLengthMax;
|
||||||
public boolean giveawayGiftsPurchaseAvailable;
|
public boolean giveawayGiftsPurchaseAvailable;
|
||||||
public PeerColors peerColors;
|
public PeerColors peerColors;
|
||||||
|
@ -565,6 +564,13 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
public int storiesSentWeeklyLimitPremium;
|
public int storiesSentWeeklyLimitPremium;
|
||||||
public int storiesSentMonthlyLimitDefault;
|
public int storiesSentMonthlyLimitDefault;
|
||||||
public int storiesSentMonthlyLimitPremium;
|
public int storiesSentMonthlyLimitPremium;
|
||||||
|
public int storiesSuggestedReactionsLimitDefault;
|
||||||
|
public int storiesSuggestedReactionsLimitPremium;
|
||||||
|
public int channelBgIconLevelMin;
|
||||||
|
public int channelProfileIconLevelMin;
|
||||||
|
public int channelEmojiStatusLevelMin;
|
||||||
|
public int channelWallpaperLevelMin;
|
||||||
|
public int channelCustomWallpaperLevelMin;
|
||||||
|
|
||||||
public int uploadMaxFileParts;
|
public int uploadMaxFileParts;
|
||||||
public int uploadMaxFilePartsPremium;
|
public int uploadMaxFilePartsPremium;
|
||||||
|
@ -580,6 +586,13 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
public boolean premiumLocked;
|
public boolean premiumLocked;
|
||||||
public int transcribeButtonPressed;
|
public int transcribeButtonPressed;
|
||||||
|
|
||||||
|
public boolean premiumFeaturesBlocked() {
|
||||||
|
return premiumLocked && !getUserConfig().isPremium();
|
||||||
|
}
|
||||||
|
public boolean premiumPurchaseBlocked() {
|
||||||
|
return premiumLocked;
|
||||||
|
}
|
||||||
|
|
||||||
public List<String> directPaymentsCurrency = new ArrayList<>();
|
public List<String> directPaymentsCurrency = new ArrayList<>();
|
||||||
|
|
||||||
public NewMessageCallback newMessageCallback;
|
public NewMessageCallback newMessageCallback;
|
||||||
|
@ -715,7 +728,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPremiumUser(TLRPC.User currentUser) {
|
public boolean isPremiumUser(TLRPC.User currentUser) {
|
||||||
return !premiumLocked && currentUser.premium;
|
return !premiumFeaturesBlocked() && currentUser.premium;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean didPressTranscribeButtonEnough() {
|
public boolean didPressTranscribeButtonEnough() {
|
||||||
|
@ -733,7 +746,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
|
|
||||||
|
|
||||||
public ArrayList<TLRPC.TL_messages_stickerSet> filterPremiumStickers(ArrayList<TLRPC.TL_messages_stickerSet> stickerSets) {
|
public ArrayList<TLRPC.TL_messages_stickerSet> filterPremiumStickers(ArrayList<TLRPC.TL_messages_stickerSet> stickerSets) {
|
||||||
if (!premiumLocked) {
|
if (!premiumFeaturesBlocked()) {
|
||||||
return stickerSets;
|
return stickerSets;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < stickerSets.size(); i++) {
|
for (int i = 0; i < stickerSets.size(); i++) {
|
||||||
|
@ -749,7 +762,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
|
|
||||||
public TLRPC.TL_messages_stickerSet filterPremiumStickers(TLRPC.TL_messages_stickerSet stickerSet) {
|
public TLRPC.TL_messages_stickerSet filterPremiumStickers(TLRPC.TL_messages_stickerSet stickerSet) {
|
||||||
if (!premiumLocked || stickerSet == null) {
|
if (!premiumFeaturesBlocked() || stickerSet == null) {
|
||||||
return stickerSet;
|
return stickerSet;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -1416,9 +1429,16 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
storyExpiringLimitDefault = mainPreferences.getInt("storyExpiringLimitDefault", 50);
|
storyExpiringLimitDefault = mainPreferences.getInt("storyExpiringLimitDefault", 50);
|
||||||
storyExpiringLimitPremium = mainPreferences.getInt("storyExpiringLimitPremium", 100);
|
storyExpiringLimitPremium = mainPreferences.getInt("storyExpiringLimitPremium", 100);
|
||||||
storiesSentWeeklyLimitDefault = mainPreferences.getInt("storiesSentWeeklyLimitDefault", 7);
|
storiesSentWeeklyLimitDefault = mainPreferences.getInt("storiesSentWeeklyLimitDefault", 7);
|
||||||
|
storiesSuggestedReactionsLimitDefault = mainPreferences.getInt("storiesSuggestedReactionsLimitDefault", 1);
|
||||||
|
storiesSuggestedReactionsLimitPremium = mainPreferences.getInt("storiesSuggestedReactionsLimitPremium", 5);
|
||||||
storiesSentWeeklyLimitPremium = mainPreferences.getInt("storiesSentWeeklyLimitPremium", 70);
|
storiesSentWeeklyLimitPremium = mainPreferences.getInt("storiesSentWeeklyLimitPremium", 70);
|
||||||
storiesSentMonthlyLimitDefault = mainPreferences.getInt("storiesSentMonthlyLimitDefault", 30);
|
storiesSentMonthlyLimitDefault = mainPreferences.getInt("storiesSentMonthlyLimitDefault", 30);
|
||||||
storiesSentMonthlyLimitPremium = mainPreferences.getInt("storiesSentMonthlyLimitPremium", 300);
|
storiesSentMonthlyLimitPremium = mainPreferences.getInt("storiesSentMonthlyLimitPremium", 300);
|
||||||
|
channelBgIconLevelMin = mainPreferences.getInt("channelBgIconLevelMin", 1);
|
||||||
|
channelProfileIconLevelMin = mainPreferences.getInt("channelProfileIconLevelMin", 1);
|
||||||
|
channelEmojiStatusLevelMin = mainPreferences.getInt("channelEmojiStatusLevelMin", 1);
|
||||||
|
channelWallpaperLevelMin = mainPreferences.getInt("channelWallpaperLevelMin", 1);
|
||||||
|
channelCustomWallpaperLevelMin = mainPreferences.getInt("channelCustomWallpaperLevelMin", 1);
|
||||||
chatlistInvitesLimitPremium = mainPreferences.getInt("chatlistInvitesLimitPremium", isTest ? 5 : 20);
|
chatlistInvitesLimitPremium = mainPreferences.getInt("chatlistInvitesLimitPremium", isTest ? 5 : 20);
|
||||||
chatlistJoinedLimitDefault = mainPreferences.getInt("chatlistJoinedLimitDefault", 2);
|
chatlistJoinedLimitDefault = mainPreferences.getInt("chatlistJoinedLimitDefault", 2);
|
||||||
chatlistJoinedLimitPremium = mainPreferences.getInt("chatlistJoinedLimitPremium", isTest ? 5 : 20);
|
chatlistJoinedLimitPremium = mainPreferences.getInt("chatlistJoinedLimitPremium", isTest ? 5 : 20);
|
||||||
|
@ -1426,7 +1446,6 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
storiesEntities = mainPreferences.getString("storiesEntities", "premium");
|
storiesEntities = mainPreferences.getString("storiesEntities", "premium");
|
||||||
storiesExportNopublicLink = mainPreferences.getBoolean("storiesExportNopublicLink", false);
|
storiesExportNopublicLink = mainPreferences.getBoolean("storiesExportNopublicLink", false);
|
||||||
authorizationAutoconfirmPeriod = mainPreferences.getInt("authorization_autoconfirm_period", 604800);
|
authorizationAutoconfirmPeriod = mainPreferences.getInt("authorization_autoconfirm_period", 604800);
|
||||||
channelColorLevelMin = mainPreferences.getInt("channelColorLevelMin", 1);
|
|
||||||
quoteLengthMax = mainPreferences.getInt("quoteLengthMax", 1024);
|
quoteLengthMax = mainPreferences.getInt("quoteLengthMax", 1024);
|
||||||
giveawayGiftsPurchaseAvailable = mainPreferences.getBoolean("giveawayGiftsPurchaseAvailable", false);
|
giveawayGiftsPurchaseAvailable = mainPreferences.getBoolean("giveawayGiftsPurchaseAvailable", false);
|
||||||
peerColors = PeerColors.fromString(PeerColors.TYPE_NAME, mainPreferences.getString("peerColors", ""));
|
peerColors = PeerColors.fromString(PeerColors.TYPE_NAME, mainPreferences.getString("peerColors", ""));
|
||||||
|
@ -3348,6 +3367,28 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "stories_suggested_reactions_limit_default": {
|
||||||
|
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
||||||
|
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
||||||
|
if (num.value != storiesSuggestedReactionsLimitDefault) {
|
||||||
|
storiesSuggestedReactionsLimitDefault = (int) num.value;
|
||||||
|
editor.putInt("storiesSuggestedReactionsLimitDefault", storiesSuggestedReactionsLimitDefault);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "stories_suggested_reactions_limit_premium": {
|
||||||
|
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
||||||
|
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
||||||
|
if (num.value != storiesSuggestedReactionsLimitPremium) {
|
||||||
|
storiesSuggestedReactionsLimitPremium = (int) num.value;
|
||||||
|
editor.putInt("storiesSuggestedReactionsLimitPremium", storiesSuggestedReactionsLimitPremium);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "stories_sent_weekly_limit_default": {
|
case "stories_sent_weekly_limit_default": {
|
||||||
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
||||||
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
||||||
|
@ -3480,17 +3521,6 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "channel_color_level_min": {
|
|
||||||
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
|
||||||
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
|
||||||
if (channelColorLevelMin != num.value) {
|
|
||||||
channelColorLevelMin = (int) num.value;
|
|
||||||
editor.putInt("channelColorLevelMin", channelColorLevelMin);
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "quote_length_max": {
|
case "quote_length_max": {
|
||||||
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
||||||
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
||||||
|
@ -3570,6 +3600,61 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "channel_bg_icon_level_min": {
|
||||||
|
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
||||||
|
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
||||||
|
if (num.value != channelBgIconLevelMin) {
|
||||||
|
channelBgIconLevelMin = (int) num.value;
|
||||||
|
editor.putInt("channelBgIconLevelMin", channelBgIconLevelMin);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "channel_profile_bg_icon_level_min": {
|
||||||
|
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
||||||
|
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
||||||
|
if (num.value != channelProfileIconLevelMin) {
|
||||||
|
channelProfileIconLevelMin = (int) num.value;
|
||||||
|
editor.putInt("channelProfileIconLevelMin", channelProfileIconLevelMin);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "channel_emoji_status_level_min": {
|
||||||
|
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
||||||
|
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
||||||
|
if (num.value != channelEmojiStatusLevelMin) {
|
||||||
|
channelEmojiStatusLevelMin = (int) num.value;
|
||||||
|
editor.putInt("channelEmojiStatusLevelMin", channelEmojiStatusLevelMin);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "channel_wallpaper_level_min": {
|
||||||
|
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
||||||
|
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
||||||
|
if (num.value != channelWallpaperLevelMin) {
|
||||||
|
channelWallpaperLevelMin = (int) num.value;
|
||||||
|
editor.putInt("channelWallpaperLevelMin", channelWallpaperLevelMin);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "channel_custom_wallpaper_level_min": {
|
||||||
|
if (value.value instanceof TLRPC.TL_jsonNumber) {
|
||||||
|
TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value;
|
||||||
|
if (num.value != channelCustomWallpaperLevelMin) {
|
||||||
|
channelCustomWallpaperLevelMin = (int) num.value;
|
||||||
|
editor.putInt("channelCustomWallpaperLevelMin", channelCustomWallpaperLevelMin);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3652,6 +3737,50 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
public final ArrayList<PeerColor> colors = new ArrayList<>();
|
public final ArrayList<PeerColor> colors = new ArrayList<>();
|
||||||
private final LongSparseArray<PeerColor> colorsById = new LongSparseArray<>();
|
private final LongSparseArray<PeerColor> colorsById = new LongSparseArray<>();
|
||||||
|
|
||||||
|
public boolean needUpdate() {
|
||||||
|
boolean noLevels = true;
|
||||||
|
boolean hasStandardColors = false;
|
||||||
|
for (int i = 0; i < colors.size(); ++i) {
|
||||||
|
if (colors.get(i).lvl > 0) {
|
||||||
|
noLevels = false;
|
||||||
|
}
|
||||||
|
if (colors.get(i).id < 7) {
|
||||||
|
hasStandardColors = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return noLevels || type == TYPE_NAME && !hasStandardColors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int colorsAvailable(int lvl) {
|
||||||
|
int count = 0;
|
||||||
|
for (int i = 0; i < colors.size(); ++i) {
|
||||||
|
if (!colors.get(i).hidden && lvl >= colors.get(i).lvl) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int maxLevel() {
|
||||||
|
int maxLvl = 0;
|
||||||
|
for (int i = 0; i < colors.size(); ++i) {
|
||||||
|
if (!colors.get(i).hidden) {
|
||||||
|
maxLvl = Math.max(maxLvl, colors.get(i).lvl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxLvl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int minLevel() {
|
||||||
|
int minLvl = maxLevel();
|
||||||
|
for (int i = 0; i < colors.size(); ++i) {
|
||||||
|
if (!colors.get(i).hidden) {
|
||||||
|
minLvl = Math.min(minLvl, colors.get(i).lvl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minLvl;
|
||||||
|
}
|
||||||
|
|
||||||
private PeerColors(int type, int hash) {
|
private PeerColors(int type, int hash) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.hash = hash;
|
this.hash = hash;
|
||||||
|
@ -3692,6 +3821,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
PeerColor peerColor = PeerColor.fromString(colorParts[i]);
|
PeerColor peerColor = PeerColor.fromString(colorParts[i]);
|
||||||
if (peerColor == null)
|
if (peerColor == null)
|
||||||
continue;
|
continue;
|
||||||
|
peerColor.isDefaultName = peerColor.id < 7 && type == TYPE_NAME;
|
||||||
if (!peerColor.hidden)
|
if (!peerColor.hidden)
|
||||||
peerColors.colors.add(peerColor);
|
peerColors.colors.add(peerColor);
|
||||||
peerColors.colorsById.put(peerColor.id, peerColor);
|
peerColors.colorsById.put(peerColor.id, peerColor);
|
||||||
|
@ -3710,7 +3840,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
for (int i = 0; i < tl.colors.size(); ++i) {
|
for (int i = 0; i < tl.colors.size(); ++i) {
|
||||||
PeerColor peerColor = PeerColor.fromTL(tl.colors.get(i));
|
PeerColor peerColor = PeerColor.fromTL(tl.colors.get(i));
|
||||||
if (peerColor == null) continue;
|
if (peerColor == null) continue;
|
||||||
if (peerColor.id < 7 && type == TYPE_NAME) continue;
|
peerColor.isDefaultName = peerColor.id < 7 && type == TYPE_NAME;
|
||||||
if (!peerColor.hidden)
|
if (!peerColor.hidden)
|
||||||
peerColors.colors.add(peerColor);
|
peerColors.colors.add(peerColor);
|
||||||
peerColors.colorsById.put(peerColor.id, peerColor);
|
peerColors.colorsById.put(peerColor.id, peerColor);
|
||||||
|
@ -3748,7 +3878,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
FileLog.e(e2);
|
FileLog.e(e2);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (type == TYPE_NAME && peerColor.id < 7) continue;
|
peerColor.isDefaultName = peerColor.id < 7 && type == TYPE_NAME;
|
||||||
peerColors.colorsById.put(id, peerColor);
|
peerColors.colorsById.put(id, peerColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3794,10 +3924,20 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class PeerColor {
|
public static class PeerColor {
|
||||||
|
public boolean isDefaultName;
|
||||||
public int id;
|
public int id;
|
||||||
public boolean hidden;
|
public boolean hidden;
|
||||||
|
public int lvl;
|
||||||
private final int[] colors = new int[6];
|
private final int[] colors = new int[6];
|
||||||
private final int[] darkColors = new int[6];
|
private final int[] darkColors = new int[6];
|
||||||
|
public int getColor(int i, Theme.ResourcesProvider resourcesProvider) {
|
||||||
|
if (i < 0 || i > 5) return 0;
|
||||||
|
if (isDefaultName && id >= 0 && id < 7) {
|
||||||
|
return Theme.getColor(Theme.keys_avatar_nameInMessage[id], resourcesProvider);
|
||||||
|
}
|
||||||
|
final boolean isDark = resourcesProvider != null ? resourcesProvider.isDark() : Theme.isCurrentThemeDark();
|
||||||
|
return (isDark ? darkColors : colors)[i];
|
||||||
|
}
|
||||||
public int getColor1(boolean isDark) {
|
public int getColor1(boolean isDark) {
|
||||||
return (isDark ? darkColors : colors)[0];
|
return (isDark ? darkColors : colors)[0];
|
||||||
}
|
}
|
||||||
|
@ -3831,9 +3971,6 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
public int getColor5() {
|
public int getColor5() {
|
||||||
return (Theme.isCurrentThemeDark() ? darkColors : colors)[4];
|
return (Theme.isCurrentThemeDark() ? darkColors : colors)[4];
|
||||||
}
|
}
|
||||||
public int getColor6() {
|
|
||||||
return (Theme.isCurrentThemeDark() ? darkColors : colors)[5];
|
|
||||||
}
|
|
||||||
public boolean hasColor2() {
|
public boolean hasColor2() {
|
||||||
return getColor2() != getColor1();
|
return getColor2() != getColor1();
|
||||||
}
|
}
|
||||||
|
@ -3870,6 +4007,9 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
public void appendString(StringBuilder sb) {
|
public void appendString(StringBuilder sb) {
|
||||||
sb.append("#");
|
sb.append("#");
|
||||||
if (hidden) sb.append("H");
|
if (hidden) sb.append("H");
|
||||||
|
if (lvl > 0) {
|
||||||
|
sb.append("[").append(lvl).append("]");
|
||||||
|
}
|
||||||
sb.append(id);
|
sb.append(id);
|
||||||
sb.append("{");
|
sb.append("{");
|
||||||
sb.append(colors[0]);
|
sb.append(colors[0]);
|
||||||
|
@ -3918,6 +4058,9 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
final PeerColor peerColor = new PeerColor();
|
final PeerColor peerColor = new PeerColor();
|
||||||
peerColor.id = tl.color_id;
|
peerColor.id = tl.color_id;
|
||||||
peerColor.hidden = tl.hidden;
|
peerColor.hidden = tl.hidden;
|
||||||
|
if ((tl.flags & 8) != 0) {
|
||||||
|
peerColor.lvl = tl.channel_min_level;
|
||||||
|
}
|
||||||
|
|
||||||
System.arraycopy(optionToColors(tl.colors), 0, peerColor.colors, 0, 6);
|
System.arraycopy(optionToColors(tl.colors), 0, peerColor.colors, 0, 6);
|
||||||
System.arraycopy(optionToColors(tl.dark_colors), 0, peerColor.darkColors, 0, 6);
|
System.arraycopy(optionToColors(tl.dark_colors), 0, peerColor.darkColors, 0, 6);
|
||||||
|
@ -3962,16 +4105,25 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
if (string == null || string.isEmpty() || string.charAt(0) != '#')
|
if (string == null || string.isEmpty() || string.charAt(0) != '#')
|
||||||
return null;
|
return null;
|
||||||
int startIndex = 1;
|
int startIndex = 1;
|
||||||
boolean hidden = string.length() > 1 && string.charAt(1) == 'H';
|
boolean hidden = string.length() > 1 && string.charAt(startIndex) == 'H';
|
||||||
if (hidden) {
|
if (hidden) {
|
||||||
startIndex++;
|
startIndex++;
|
||||||
}
|
}
|
||||||
|
int lvl = 0;
|
||||||
|
if (string.length() > startIndex && string.charAt(startIndex) == '[') {
|
||||||
|
int eindex = string.indexOf(']');
|
||||||
|
if (eindex > startIndex) {
|
||||||
|
lvl = Utilities.parseInt(string.substring(startIndex + 1, eindex));
|
||||||
|
startIndex = eindex + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
int index = string.indexOf('{');
|
int index = string.indexOf('{');
|
||||||
if (index < 0) return null;
|
if (index < 0) return null;
|
||||||
try {
|
try {
|
||||||
final PeerColor peerColor = new PeerColor();
|
final PeerColor peerColor = new PeerColor();
|
||||||
peerColor.id = Utilities.parseInt(string.substring(startIndex, index));
|
peerColor.id = Utilities.parseInt(string.substring(startIndex, index));
|
||||||
peerColor.hidden = hidden;
|
peerColor.hidden = hidden;
|
||||||
|
peerColor.lvl = lvl;
|
||||||
final String[] parts = string.substring(index + 1, string.length() - 1).split("@");
|
final String[] parts = string.substring(index + 1, string.length() - 1).split("@");
|
||||||
String[] colorsString = parts[0].split(",");
|
String[] colorsString = parts[0].split(",");
|
||||||
for (int i = 0; i < 6; ++i)
|
for (int i = 0; i < 6; ++i)
|
||||||
|
@ -4458,7 +4610,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.wallpapersNeedReload, wallPaper.slug);
|
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.wallpapersNeedReload, wallPaper.slug);
|
||||||
if (uploadingWallpaperInfo.requestIds != null && overrideWallpaperInfo.dialogId != 0) {
|
if (uploadingWallpaperInfo.requestIds != null && overrideWallpaperInfo.dialogId != 0) {
|
||||||
uploadingWallpaperInfo.requestIds.add(ChatThemeController.getInstance(currentAccount).setWallpaperToUser(overrideWallpaperInfo.dialogId, uploadingWallpaperFinal, overrideWallpaperInfo, null, null));
|
uploadingWallpaperInfo.requestIds.add(ChatThemeController.getInstance(currentAccount).setWallpaperToPeer(overrideWallpaperInfo.dialogId, uploadingWallpaperFinal, overrideWallpaperInfo, null, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -4853,7 +5005,6 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
loadingSuggestedFilters = false;
|
loadingSuggestedFilters = false;
|
||||||
loadingRemoteFilters = false;
|
loadingRemoteFilters = false;
|
||||||
suggestedFilters.clear();
|
suggestedFilters.clear();
|
||||||
gettingAppChangelog = false;
|
|
||||||
dialogFiltersLoaded = false;
|
dialogFiltersLoaded = false;
|
||||||
ignoreSetOnline = false;
|
ignoreSetOnline = false;
|
||||||
|
|
||||||
|
@ -5230,6 +5381,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
updateEmojiStatusUntilUpdate(-chat.id, chat.emoji_status);
|
||||||
if (chat.min) {
|
if (chat.min) {
|
||||||
if (oldChat != null) {
|
if (oldChat != null) {
|
||||||
if (!fromCache) {
|
if (!fromCache) {
|
||||||
|
@ -5311,7 +5463,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
} else {
|
} else {
|
||||||
oldChat.flags |= 16384;
|
oldChat.flags |= 16384;
|
||||||
}
|
}
|
||||||
if (!chat.stories_hidden_min) {
|
if (chat.stories_hidden_min) {
|
||||||
chat.stories_hidden = oldChat.stories_hidden;
|
chat.stories_hidden = oldChat.stories_hidden;
|
||||||
}
|
}
|
||||||
if (oldFlags != newFlags || oldFlags2 != newFlags2) {
|
if (oldFlags != newFlags || oldFlags2 != newFlags2) {
|
||||||
|
@ -5699,6 +5851,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
getMessagesStorage().putUsersAndChats(res.users, res.chats, true, true);
|
getMessagesStorage().putUsersAndChats(res.users, res.chats, true, true);
|
||||||
getMessagesStorage().updateChatInfo(res.full_chat, false);
|
getMessagesStorage().updateChatInfo(res.full_chat, false);
|
||||||
getStoriesController().updateStoriesFromFullPeer(dialogId, res.full_chat.stories);
|
getStoriesController().updateStoriesFromFullPeer(dialogId, res.full_chat.stories);
|
||||||
|
ChatThemeController.getInstance(currentAccount).saveChatWallpaper(-chatId, res.full_chat.wallpaper);
|
||||||
if (ChatObject.isChannel(chat)) {
|
if (ChatObject.isChannel(chat)) {
|
||||||
Integer value = dialogs_read_inbox_max.get(dialogId);
|
Integer value = dialogs_read_inbox_max.get(dialogId);
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
|
@ -5780,7 +5933,10 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
dialog.ttl_period = res.full_chat.ttl_period;
|
dialog.ttl_period = res.full_chat.ttl_period;
|
||||||
getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload);
|
getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload);
|
||||||
}
|
}
|
||||||
|
if (dialog.view_forum_as_messages != res.full_chat.view_forum_as_messages) {
|
||||||
dialog.view_forum_as_messages = res.full_chat.view_forum_as_messages;
|
dialog.view_forum_as_messages = res.full_chat.view_forum_as_messages;
|
||||||
|
getMessagesStorage().setDialogViewThreadAsMessages(dialogId, res.full_chat.view_forum_as_messages);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -10975,7 +11131,6 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
migratingDialogs = false;
|
migratingDialogs = false;
|
||||||
getNotificationCenter().postNotificationName(NotificationCenter.needReloadRecentDialogsSearch);
|
getNotificationCenter().postNotificationName(NotificationCenter.needReloadRecentDialogsSearch);
|
||||||
} else {
|
} else {
|
||||||
generateUpdateMessage();
|
|
||||||
if (!added && loadType == DIALOGS_LOAD_TYPE_CACHE && dialogsEndReached.get(folderId)) {
|
if (!added && loadType == DIALOGS_LOAD_TYPE_CACHE && dialogsEndReached.get(folderId)) {
|
||||||
loadDialogs(folderId, 0, count, false);
|
loadDialogs(folderId, 0, count, false);
|
||||||
}
|
}
|
||||||
|
@ -12117,13 +12272,28 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
processUpdates((TLRPC.Updates) response, false);
|
processUpdates((TLRPC.Updates) response, false);
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
if (convertRunnable != null) {
|
if (convertRunnable != null) {
|
||||||
|
TLRPC.Chat prevChat = null;
|
||||||
for (int a = 0; a < updates.chats.size(); a++) {
|
for (int a = 0; a < updates.chats.size(); a++) {
|
||||||
TLRPC.Chat chat = updates.chats.get(a);
|
TLRPC.Chat chat = updates.chats.get(a);
|
||||||
if (ChatObject.isChannel(chat)) {
|
if (chatId == chat.id) {
|
||||||
convertRunnable.run(chat.id);
|
prevChat = chat;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (prevChat != null && prevChat.migrated_to != null) {
|
||||||
|
long newChatId = prevChat.migrated_to.channel_id;
|
||||||
|
TLRPC.Chat newChat = null;
|
||||||
|
for (int a = 0; a < updates.chats.size(); a++) {
|
||||||
|
TLRPC.Chat chat = updates.chats.get(a);
|
||||||
|
if (newChatId == chat.id) {
|
||||||
|
newChat = chat;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newChat != null) {
|
||||||
|
convertRunnable.run(newChatId);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -12960,27 +13130,6 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
getContactsController().deleteUnknownAppAccounts();
|
getContactsController().deleteUnknownAppAccounts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean gettingAppChangelog;
|
|
||||||
|
|
||||||
public void generateUpdateMessage() {
|
|
||||||
if (gettingAppChangelog || BuildVars.DEBUG_VERSION || SharedConfig.lastUpdateVersion == null || SharedConfig.lastUpdateVersion.equals(BuildVars.BUILD_VERSION_STRING)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
gettingAppChangelog = true;
|
|
||||||
TLRPC.TL_help_getAppChangelog req = new TLRPC.TL_help_getAppChangelog();
|
|
||||||
req.prev_app_version = SharedConfig.lastUpdateVersion;
|
|
||||||
getConnectionsManager().sendRequest(req, (response, error) -> {
|
|
||||||
if (error == null) {
|
|
||||||
SharedConfig.lastUpdateVersion = BuildVars.BUILD_VERSION_STRING;
|
|
||||||
SharedConfig.saveConfig();
|
|
||||||
}
|
|
||||||
if (response instanceof TLRPC.Updates) {
|
|
||||||
processUpdates((TLRPC.Updates) response, false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void registerForPush(@PushListenerController.PushType int pushType, String regid) {
|
public void registerForPush(@PushListenerController.PushType int pushType, String regid) {
|
||||||
if (TextUtils.isEmpty(regid) || registeringForPush || getUserConfig().getClientUserId() == 0) {
|
if (TextUtils.isEmpty(regid) || registeringForPush || getUserConfig().getClientUserId() == 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -17256,10 +17405,14 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
TLRPC.Dialog dialog = getDialog(-update.channel_id);
|
TLRPC.Dialog dialog = getDialog(-update.channel_id);
|
||||||
if (dialog != null) {
|
if (dialog != null) {
|
||||||
|
if (dialog.view_forum_as_messages != update.enabled) {
|
||||||
dialog.view_forum_as_messages = update.enabled;
|
dialog.view_forum_as_messages = update.enabled;
|
||||||
}
|
|
||||||
getMessagesStorage().setDialogViewThreadAsMessages(-update.channel_id, update.enabled);
|
getMessagesStorage().setDialogViewThreadAsMessages(-update.channel_id, update.enabled);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
getMessagesStorage().setDialogViewThreadAsMessages(-update.channel_id, update.enabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (editor != null) {
|
if (editor != null) {
|
||||||
editor.commit();
|
editor.commit();
|
||||||
|
@ -19191,13 +19344,13 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
boolean onMessageReceived(TLRPC.Message message);
|
boolean onMessageReceived(TLRPC.Message message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateEmojiStatusUntilUpdate(long userId, TLRPC.EmojiStatus status) {
|
public void updateEmojiStatusUntilUpdate(long dialogId, TLRPC.EmojiStatus status) {
|
||||||
if (status instanceof TLRPC.TL_emojiStatusUntil) {
|
if (status instanceof TLRPC.TL_emojiStatusUntil) {
|
||||||
emojiStatusUntilValues.put(userId, ((TLRPC.TL_emojiStatusUntil) status).until);
|
emojiStatusUntilValues.put(dialogId, ((TLRPC.TL_emojiStatusUntil) status).until);
|
||||||
} else {
|
} else {
|
||||||
if (!emojiStatusUntilValues.containsKey(userId))
|
if (!emojiStatusUntilValues.containsKey(dialogId))
|
||||||
return;
|
return;
|
||||||
emojiStatusUntilValues.remove(userId);
|
emojiStatusUntilValues.remove(dialogId);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateEmojiStatusUntil();
|
updateEmojiStatusUntil();
|
||||||
|
@ -19413,11 +19566,19 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
FileLoader.getInstance(currentAccount).cancelFileUpload(uploadingWallpaper, false);
|
FileLoader.getInstance(currentAccount).cancelFileUpload(uploadingWallpaper, false);
|
||||||
if (uploadingWallpaperInfo.dialogId != 0) {
|
if (uploadingWallpaperInfo.dialogId != 0) {
|
||||||
|
if (uploadingWallpaperInfo.dialogId >= 0) {
|
||||||
TLRPC.UserFull userFull = getUserFull(uploadingWallpaperInfo.dialogId);
|
TLRPC.UserFull userFull = getUserFull(uploadingWallpaperInfo.dialogId);
|
||||||
if (userFull != null) {
|
if (userFull != null) {
|
||||||
userFull.wallpaper = uploadingWallpaperInfo.prevUserWallpaper;
|
userFull.wallpaper = uploadingWallpaperInfo.prevUserWallpaper;
|
||||||
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.userInfoDidLoad, uploadingWallpaperInfo.dialogId, userFull);
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.userInfoDidLoad, uploadingWallpaperInfo.dialogId, userFull);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
TLRPC.ChatFull chatFull = getChatFull(-uploadingWallpaperInfo.dialogId);
|
||||||
|
if (chatFull != null) {
|
||||||
|
chatFull.wallpaper = uploadingWallpaperInfo.prevUserWallpaper;
|
||||||
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.chatInfoDidLoad, chatFull, 0, false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uploadingWallpaperInfo = null;
|
uploadingWallpaperInfo = null;
|
||||||
uploadingWallpaper = null;
|
uploadingWallpaper = null;
|
||||||
|
@ -19544,9 +19705,12 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkPeerColors(boolean force) {
|
public void checkPeerColors(boolean force) {
|
||||||
if (peerColors == null || force) {
|
if (peerColors == null || peerColors.needUpdate() || force) {
|
||||||
TLRPC.TL_help_getPeerColors req = new TLRPC.TL_help_getPeerColors();
|
TLRPC.TL_help_getPeerColors req = new TLRPC.TL_help_getPeerColors();
|
||||||
req.hash = peerColors != null ? peerColors.hash : 0;
|
req.hash = peerColors != null ? peerColors.hash : 0;
|
||||||
|
if (peerColors != null && peerColors.needUpdate()) {
|
||||||
|
req.hash = 0;
|
||||||
|
}
|
||||||
getConnectionsManager().sendRequest(req, (res, err) -> {
|
getConnectionsManager().sendRequest(req, (res, err) -> {
|
||||||
if (res instanceof TLRPC.TL_help_peerColors) {
|
if (res instanceof TLRPC.TL_help_peerColors) {
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
@ -19556,9 +19720,12 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (profilePeerColors == null || force) {
|
if (profilePeerColors == null || profilePeerColors.needUpdate() || force) {
|
||||||
TLRPC.TL_help_getPeerProfileColors req = new TLRPC.TL_help_getPeerProfileColors();
|
TLRPC.TL_help_getPeerProfileColors req = new TLRPC.TL_help_getPeerProfileColors();
|
||||||
req.hash = profilePeerColors != null ? profilePeerColors.hash : 0;
|
req.hash = profilePeerColors != null ? profilePeerColors.hash : 0;
|
||||||
|
if (profilePeerColors != null && profilePeerColors.needUpdate()) {
|
||||||
|
req.hash = 0;
|
||||||
|
}
|
||||||
getConnectionsManager().sendRequest(req, (res, err) -> {
|
getConnectionsManager().sendRequest(req, (res, err) -> {
|
||||||
if (res instanceof TLRPC.TL_help_peerColors) {
|
if (res instanceof TLRPC.TL_help_peerColors) {
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
|
|
@ -14160,6 +14160,14 @@ public class MessagesStorage extends BaseController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (message.media instanceof TLRPC.TL_messageMediaGiveawayResults) {
|
||||||
|
TLRPC.TL_messageMediaGiveawayResults giveaway = (TLRPC.TL_messageMediaGiveawayResults) message.media;
|
||||||
|
for (Long uid : giveaway.winners) {
|
||||||
|
if (!usersToLoad.contains(uid)) {
|
||||||
|
usersToLoad.add(uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (message.media instanceof TLRPC.TL_messageMediaPoll) {
|
if (message.media instanceof TLRPC.TL_messageMediaPoll) {
|
||||||
TLRPC.TL_messageMediaPoll messageMediaPoll = (TLRPC.TL_messageMediaPoll) message.media;
|
TLRPC.TL_messageMediaPoll messageMediaPoll = (TLRPC.TL_messageMediaPoll) message.media;
|
||||||
if (!messageMediaPoll.results.recent_voters.isEmpty()) {
|
if (!messageMediaPoll.results.recent_voters.isEmpty()) {
|
||||||
|
@ -14168,9 +14176,20 @@ public class MessagesStorage extends BaseController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (message.media instanceof TLRPC.TL_messageMediaStory && message.media.storyItem != null && message.media.storyItem.fwd_from != null) {
|
if (message.media instanceof TLRPC.TL_messageMediaStory && message.media.storyItem != null) {
|
||||||
|
if (message.media.storyItem.fwd_from != null) {
|
||||||
addLoadPeerInfo(message.media.storyItem.fwd_from.from, usersToLoad, chatsToLoad);
|
addLoadPeerInfo(message.media.storyItem.fwd_from.from, usersToLoad, chatsToLoad);
|
||||||
}
|
}
|
||||||
|
if (message.media.storyItem != null && message.media.storyItem.media_areas != null) {
|
||||||
|
for (int j = 0; j < message.media.storyItem.media_areas.size(); ++j) {
|
||||||
|
if (message.media.storyItem.media_areas.get(j) instanceof TL_stories.TL_mediaAreaChannelPost) {
|
||||||
|
long channelId = ((TL_stories.TL_mediaAreaChannelPost) message.media.storyItem.media_areas.get(j)).channel_id;
|
||||||
|
if (!chatsToLoad.contains(channelId))
|
||||||
|
chatsToLoad.add(channelId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (message.media instanceof TLRPC.TL_messageMediaWebPage && message.media.webpage != null && message.media.webpage.attributes != null) {
|
if (message.media instanceof TLRPC.TL_messageMediaWebPage && message.media.webpage != null && message.media.webpage.attributes != null) {
|
||||||
for (int i = 0; i < message.media.webpage.attributes.size(); ++i) {
|
for (int i = 0; i < message.media.webpage.attributes.size(); ++i) {
|
||||||
if (message.media.webpage.attributes.get(i) instanceof TLRPC.TL_webPageAttributeStory) {
|
if (message.media.webpage.attributes.get(i) instanceof TLRPC.TL_webPageAttributeStory) {
|
||||||
|
@ -14178,6 +14197,15 @@ public class MessagesStorage extends BaseController {
|
||||||
if (attr.storyItem != null && attr.storyItem.fwd_from != null) {
|
if (attr.storyItem != null && attr.storyItem.fwd_from != null) {
|
||||||
addLoadPeerInfo(attr.storyItem.fwd_from.from, usersToLoad, chatsToLoad);
|
addLoadPeerInfo(attr.storyItem.fwd_from.from, usersToLoad, chatsToLoad);
|
||||||
}
|
}
|
||||||
|
if (attr.storyItem != null && attr.storyItem.media_areas != null) {
|
||||||
|
for (int j = 0; j < attr.storyItem.media_areas.size(); ++j) {
|
||||||
|
if (attr.storyItem.media_areas.get(j) instanceof TL_stories.TL_mediaAreaChannelPost) {
|
||||||
|
long channelId = ((TL_stories.TL_mediaAreaChannelPost) attr.storyItem.media_areas.get(j)).channel_id;
|
||||||
|
if (!chatsToLoad.contains(channelId))
|
||||||
|
chatsToLoad.add(channelId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -210,6 +210,8 @@ public class NotificationCenter {
|
||||||
|
|
||||||
public static final int updateBotMenuButton = totalEvents++;
|
public static final int updateBotMenuButton = totalEvents++;
|
||||||
|
|
||||||
|
public static final int giftsToUserSent = totalEvents++;
|
||||||
|
public static final int didStartedMultiGiftsSelector = totalEvents++;
|
||||||
public static final int boostedChannelByUser = totalEvents++;
|
public static final int boostedChannelByUser = totalEvents++;
|
||||||
public static final int boostByChannelCreated = totalEvents++;
|
public static final int boostByChannelCreated = totalEvents++;
|
||||||
public static final int didUpdatePremiumGiftStickers = totalEvents++;
|
public static final int didUpdatePremiumGiftStickers = totalEvents++;
|
||||||
|
@ -221,6 +223,7 @@ public class NotificationCenter {
|
||||||
public static final int unconfirmedAuthUpdate = totalEvents++;
|
public static final int unconfirmedAuthUpdate = totalEvents++;
|
||||||
public static final int dialogPhotosUpdate = totalEvents++;
|
public static final int dialogPhotosUpdate = totalEvents++;
|
||||||
public static final int channelRecommendationsLoaded = totalEvents++;
|
public static final int channelRecommendationsLoaded = totalEvents++;
|
||||||
|
public static final int savedMessagesUpdate = totalEvents++;
|
||||||
|
|
||||||
//global
|
//global
|
||||||
public static final int pushMessagesUpdated = totalEvents++;
|
public static final int pushMessagesUpdated = totalEvents++;
|
||||||
|
@ -285,21 +288,22 @@ public class NotificationCenter {
|
||||||
public static final int userEmojiStatusUpdated = totalEvents++;
|
public static final int userEmojiStatusUpdated = totalEvents++;
|
||||||
public static final int requestPermissions = totalEvents++;
|
public static final int requestPermissions = totalEvents++;
|
||||||
public static final int permissionsGranted = totalEvents++;
|
public static final int permissionsGranted = totalEvents++;
|
||||||
public static int topicsDidLoaded = totalEvents++;
|
public static final int topicsDidLoaded = totalEvents++;
|
||||||
public static int chatSwithcedToForum = totalEvents++;
|
public static final int chatSwithcedToForum = totalEvents++;
|
||||||
public static int didUpdateGlobalAutoDeleteTimer = totalEvents++;
|
public static final int didUpdateGlobalAutoDeleteTimer = totalEvents++;
|
||||||
public static int onDatabaseReset = totalEvents++;
|
public static final int onDatabaseReset = totalEvents++;
|
||||||
public static int wallpaperSettedToUser = totalEvents++;
|
public static final int wallpaperSettedToUser = totalEvents++;
|
||||||
public static int storiesUpdated = totalEvents++;
|
public static final int storiesUpdated = totalEvents++;
|
||||||
public static int storiesListUpdated = totalEvents++;
|
public static final int storiesListUpdated = totalEvents++;
|
||||||
public static int storiesDraftsUpdated = totalEvents++;
|
public static final int storiesDraftsUpdated = totalEvents++;
|
||||||
public static int chatlistFolderUpdate = totalEvents++;
|
public static final int chatlistFolderUpdate = totalEvents++;
|
||||||
public static final int uploadStoryProgress = totalEvents++;
|
public static final int uploadStoryProgress = totalEvents++;
|
||||||
public static final int uploadStoryEnd = totalEvents++;
|
public static final int uploadStoryEnd = totalEvents++;
|
||||||
public static final int customTypefacesLoaded = totalEvents++;
|
public static final int customTypefacesLoaded = totalEvents++;
|
||||||
public static final int stealthModeChanged = totalEvents++;
|
public static final int stealthModeChanged = totalEvents++;
|
||||||
public static final int onReceivedChannelDifference = totalEvents++;
|
public static final int onReceivedChannelDifference = totalEvents++;
|
||||||
public static final int storiesReadUpdated = totalEvents++;
|
public static final int storiesReadUpdated = totalEvents++;
|
||||||
|
public static final int nearEarEvent = totalEvents++;
|
||||||
|
|
||||||
public static boolean alreadyLogged;
|
public static boolean alreadyLogged;
|
||||||
|
|
||||||
|
|
|
@ -2120,6 +2120,8 @@ public class NotificationsController extends BaseController {
|
||||||
}
|
}
|
||||||
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
|
||||||
return LocaleController.getString("BoostingGiveaway", R.string.BoostingGiveaway);
|
return LocaleController.getString("BoostingGiveaway", R.string.BoostingGiveaway);
|
||||||
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveawayResults) {
|
||||||
|
return LocaleController.getString("BoostingGiveawayResults", R.string.BoostingGiveawayResults);
|
||||||
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) {
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) {
|
||||||
return LocaleController.getString("AttachLocation", R.string.AttachLocation);
|
return LocaleController.getString("AttachLocation", R.string.AttachLocation);
|
||||||
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeoLive) {
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeoLive) {
|
||||||
|
@ -2369,6 +2371,8 @@ public class NotificationsController extends BaseController {
|
||||||
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
|
||||||
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) messageObject.messageOwner.media;
|
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) messageObject.messageOwner.media;
|
||||||
msg = LocaleController.formatString("NotificationMessageChannelGiveaway", R.string.NotificationMessageChannelGiveaway, name, giveaway.quantity, giveaway.months);
|
msg = LocaleController.formatString("NotificationMessageChannelGiveaway", R.string.NotificationMessageChannelGiveaway, name, giveaway.quantity, giveaway.months);
|
||||||
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveawayResults) {
|
||||||
|
msg = LocaleController.formatString("BoostingGiveawayResults", R.string.BoostingGiveawayResults);
|
||||||
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
|
||||||
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) messageObject.messageOwner.media;
|
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) messageObject.messageOwner.media;
|
||||||
if (mediaPoll.poll.quiz) {
|
if (mediaPoll.poll.quiz) {
|
||||||
|
@ -2823,6 +2827,8 @@ public class NotificationsController extends BaseController {
|
||||||
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
|
||||||
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) messageObject.messageOwner.media;
|
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) messageObject.messageOwner.media;
|
||||||
msg = LocaleController.formatString("NotificationMessageChannelGiveaway", R.string.NotificationMessageChannelGiveaway, chat.title, giveaway.quantity, giveaway.months);
|
msg = LocaleController.formatString("NotificationMessageChannelGiveaway", R.string.NotificationMessageChannelGiveaway, chat.title, giveaway.quantity, giveaway.months);
|
||||||
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGiveawayResults) {
|
||||||
|
msg = LocaleController.formatString("BoostingGiveawayResults", R.string.BoostingGiveawayResults);
|
||||||
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) {
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) {
|
||||||
msg = LocaleController.formatString("NotificationMessageGroupMap", R.string.NotificationMessageGroupMap, name, chat.title);
|
msg = LocaleController.formatString("NotificationMessageGroupMap", R.string.NotificationMessageGroupMap, name, chat.title);
|
||||||
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeoLive) {
|
} else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaGeoLive) {
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
package org.telegram.messenger;
|
||||||
|
|
||||||
|
import androidx.collection.LongSparseArray;
|
||||||
|
|
||||||
|
import org.telegram.SQLite.SQLiteCursor;
|
||||||
|
import org.telegram.SQLite.SQLiteDatabase;
|
||||||
|
import org.telegram.SQLite.SQLiteException;
|
||||||
|
import org.telegram.tgnet.NativeByteBuffer;
|
||||||
|
import org.telegram.tgnet.TLRPC;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
public class SavedMessagesController {
|
||||||
|
|
||||||
|
private final int currentAccount;
|
||||||
|
|
||||||
|
public boolean loading, loaded;
|
||||||
|
public LongSparseArray<ArrayList<MessageObject>> messages = new LongSparseArray<ArrayList<MessageObject>>();
|
||||||
|
|
||||||
|
public SavedMessagesController(int account) {
|
||||||
|
this.currentAccount = account;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getSavedMessagesDialogs() {
|
||||||
|
if (loaded || loading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
loading = true;
|
||||||
|
final long myself = UserConfig.getInstance(currentAccount).getClientUserId();
|
||||||
|
MessagesStorage storage = MessagesStorage.getInstance(currentAccount);
|
||||||
|
storage.getStorageQueue().postRunnable(() -> {
|
||||||
|
SQLiteDatabase database = storage.getDatabase();
|
||||||
|
SQLiteCursor cursor = null;
|
||||||
|
final LongSparseArray<ArrayList<MessageObject>> messages = new LongSparseArray<>();
|
||||||
|
try {
|
||||||
|
cursor = database.queryFinalized("SELECT data, mid, date, send_state, read_state, custom_params FROM messages_v2 WHERE out = 0 AND uid = ?", myself);
|
||||||
|
while (cursor.next()) {
|
||||||
|
NativeByteBuffer data = cursor.byteBufferValue(0);
|
||||||
|
if (data != null) {
|
||||||
|
TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false);
|
||||||
|
if (message.fwd_from == null || message.fwd_from.saved_from_peer == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
long did = DialogObject.getPeerDialogId(message.fwd_from.saved_from_peer);
|
||||||
|
|
||||||
|
message.id = cursor.intValue(1);
|
||||||
|
message.date = cursor.intValue(2);
|
||||||
|
message.send_state = cursor.intValue(3);
|
||||||
|
MessageObject.setUnreadFlags(message, cursor.intValue(4));
|
||||||
|
|
||||||
|
MessageObject messageObject = new MessageObject(currentAccount, message, true, true);
|
||||||
|
ArrayList<MessageObject> messageObjects = messages.get(did);
|
||||||
|
if (messageObjects == null) {
|
||||||
|
messages.put(did, messageObjects = new ArrayList<>());
|
||||||
|
}
|
||||||
|
messageObjects.add(messageObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
SavedMessagesController.this.messages.clear();
|
||||||
|
SavedMessagesController.this.messages.putAll(messages);
|
||||||
|
loading = false;
|
||||||
|
});
|
||||||
|
} catch (SQLiteException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (cursor != null) {
|
||||||
|
cursor.dispose();
|
||||||
|
cursor = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,7 +21,6 @@ import android.os.Environment;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import android.util.Log;
|
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
|
|
||||||
import androidx.annotation.IntDef;
|
import androidx.annotation.IntDef;
|
||||||
|
@ -234,7 +233,6 @@ public class SharedConfig {
|
||||||
public static int lastPauseTime;
|
public static int lastPauseTime;
|
||||||
public static boolean isWaitingForPasscodeEnter;
|
public static boolean isWaitingForPasscodeEnter;
|
||||||
public static boolean useFingerprint = true;
|
public static boolean useFingerprint = true;
|
||||||
public static String lastUpdateVersion;
|
|
||||||
public static int suggestStickers;
|
public static int suggestStickers;
|
||||||
public static boolean suggestAnimatedEmoji;
|
public static boolean suggestAnimatedEmoji;
|
||||||
public static int keepMedia = CacheByChatsController.KEEP_MEDIA_ONE_MONTH; //deprecated
|
public static int keepMedia = CacheByChatsController.KEEP_MEDIA_ONE_MONTH; //deprecated
|
||||||
|
@ -312,6 +310,8 @@ public class SharedConfig {
|
||||||
public static int messageSeenHintCount;
|
public static int messageSeenHintCount;
|
||||||
public static int emojiInteractionsHintCount;
|
public static int emojiInteractionsHintCount;
|
||||||
public static int dayNightThemeSwitchHintCount;
|
public static int dayNightThemeSwitchHintCount;
|
||||||
|
public static boolean forceLessData;
|
||||||
|
public static int callEncryptionHintDisplayedCount;
|
||||||
|
|
||||||
public static TLRPC.TL_help_appUpdate pendingAppUpdate;
|
public static TLRPC.TL_help_appUpdate pendingAppUpdate;
|
||||||
public static int pendingAppUpdateBuildVersion;
|
public static int pendingAppUpdateBuildVersion;
|
||||||
|
@ -431,7 +431,6 @@ public class SharedConfig {
|
||||||
editor.putInt("badPasscodeTries", badPasscodeTries);
|
editor.putInt("badPasscodeTries", badPasscodeTries);
|
||||||
editor.putInt("autoLockIn", autoLockIn);
|
editor.putInt("autoLockIn", autoLockIn);
|
||||||
editor.putInt("lastPauseTime", lastPauseTime);
|
editor.putInt("lastPauseTime", lastPauseTime);
|
||||||
editor.putString("lastUpdateVersion2", lastUpdateVersion);
|
|
||||||
editor.putBoolean("useFingerprint", useFingerprint);
|
editor.putBoolean("useFingerprint", useFingerprint);
|
||||||
editor.putBoolean("allowScreenCapture", allowScreenCapture);
|
editor.putBoolean("allowScreenCapture", allowScreenCapture);
|
||||||
editor.putString("pushString2", pushString);
|
editor.putString("pushString2", pushString);
|
||||||
|
@ -511,7 +510,6 @@ public class SharedConfig {
|
||||||
autoLockIn = preferences.getInt("autoLockIn", 60 * 60);
|
autoLockIn = preferences.getInt("autoLockIn", 60 * 60);
|
||||||
lastPauseTime = preferences.getInt("lastPauseTime", 0);
|
lastPauseTime = preferences.getInt("lastPauseTime", 0);
|
||||||
useFingerprint = preferences.getBoolean("useFingerprint", true);
|
useFingerprint = preferences.getBoolean("useFingerprint", true);
|
||||||
lastUpdateVersion = preferences.getString("lastUpdateVersion2", "3.5");
|
|
||||||
allowScreenCapture = preferences.getBoolean("allowScreenCapture", false);
|
allowScreenCapture = preferences.getBoolean("allowScreenCapture", false);
|
||||||
lastLocalId = preferences.getInt("lastLocalId", -210000);
|
lastLocalId = preferences.getInt("lastLocalId", -210000);
|
||||||
pushString = preferences.getString("pushString2", "");
|
pushString = preferences.getString("pushString2", "");
|
||||||
|
@ -541,7 +539,7 @@ public class SharedConfig {
|
||||||
try {
|
try {
|
||||||
String update = preferences.getString("appUpdate", null);
|
String update = preferences.getString("appUpdate", null);
|
||||||
if (update != null) {
|
if (update != null) {
|
||||||
pendingAppUpdateBuildVersion = preferences.getInt("appUpdateBuild", BuildVars.BUILD_VERSION);
|
pendingAppUpdateBuildVersion = preferences.getInt("appUpdateBuild", buildVersion());
|
||||||
byte[] arr = Base64.decode(update, Base64.DEFAULT);
|
byte[] arr = Base64.decode(update, Base64.DEFAULT);
|
||||||
if (arr != null) {
|
if (arr != null) {
|
||||||
SerializedData data = new SerializedData(arr);
|
SerializedData data = new SerializedData(arr);
|
||||||
|
@ -561,7 +559,7 @@ public class SharedConfig {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
if (updateVersion == 0) {
|
if (updateVersion == 0) {
|
||||||
updateVersion = BuildVars.BUILD_VERSION;
|
updateVersion = buildVersion();
|
||||||
}
|
}
|
||||||
if (updateVersionString == null) {
|
if (updateVersionString == null) {
|
||||||
updateVersionString = BuildVars.BUILD_VERSION_STRING;
|
updateVersionString = BuildVars.BUILD_VERSION_STRING;
|
||||||
|
@ -651,6 +649,8 @@ public class SharedConfig {
|
||||||
payByInvoice = preferences.getBoolean("payByInvoice", false);
|
payByInvoice = preferences.getBoolean("payByInvoice", false);
|
||||||
photoViewerBlur = preferences.getBoolean("photoViewerBlur", true);
|
photoViewerBlur = preferences.getBoolean("photoViewerBlur", true);
|
||||||
multipleReactionsPromoShowed = preferences.getBoolean("multipleReactionsPromoShowed", false);
|
multipleReactionsPromoShowed = preferences.getBoolean("multipleReactionsPromoShowed", false);
|
||||||
|
forceLessData = preferences.getBoolean("forceLessData", false);
|
||||||
|
callEncryptionHintDisplayedCount = preferences.getInt("callEncryptionHintDisplayedCount", 0);
|
||||||
|
|
||||||
loadDebugConfig(preferences);
|
loadDebugConfig(preferences);
|
||||||
|
|
||||||
|
@ -669,6 +669,15 @@ public class SharedConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int buildVersion() {
|
||||||
|
try {
|
||||||
|
return ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0).versionCode;
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void updateTabletConfig() {
|
public static void updateTabletConfig() {
|
||||||
if (fontSizeIsDefault) {
|
if (fontSizeIsDefault) {
|
||||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
||||||
|
@ -752,7 +761,7 @@ public class SharedConfig {
|
||||||
currentVersion = pInfo.versionCode;
|
currentVersion = pInfo.versionCode;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
currentVersion = BuildVars.BUILD_VERSION;
|
currentVersion = buildVersion();
|
||||||
}
|
}
|
||||||
return pendingAppUpdateBuildVersion == currentVersion;
|
return pendingAppUpdateBuildVersion == currentVersion;
|
||||||
}
|
}
|
||||||
|
@ -768,7 +777,7 @@ public class SharedConfig {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
if (versionCode == 0) {
|
if (versionCode == 0) {
|
||||||
versionCode = BuildVars.BUILD_VERSION;
|
versionCode = buildVersion();
|
||||||
}
|
}
|
||||||
if (updateVersionString == null) {
|
if (updateVersionString == null) {
|
||||||
updateVersionString = BuildVars.BUILD_VERSION_STRING;
|
updateVersionString = BuildVars.BUILD_VERSION_STRING;
|
||||||
|
@ -847,7 +856,6 @@ public class SharedConfig {
|
||||||
useFingerprint = true;
|
useFingerprint = true;
|
||||||
isWaitingForPasscodeEnter = false;
|
isWaitingForPasscodeEnter = false;
|
||||||
allowScreenCapture = false;
|
allowScreenCapture = false;
|
||||||
lastUpdateVersion = BuildVars.BUILD_VERSION_STRING;
|
|
||||||
textSelectionHintShows = 0;
|
textSelectionHintShows = 0;
|
||||||
scheduledOrNoSoundHintShows = 0;
|
scheduledOrNoSoundHintShows = 0;
|
||||||
scheduledOrNoSoundHintSeenAt = 0;
|
scheduledOrNoSoundHintSeenAt = 0;
|
||||||
|
@ -1071,6 +1079,14 @@ public class SharedConfig {
|
||||||
editor.apply();
|
editor.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void incrementCallEncryptionHintDisplayed(int count) {
|
||||||
|
callEncryptionHintDisplayedCount += count;
|
||||||
|
SharedPreferences preferences = MessagesController.getGlobalMainSettings();
|
||||||
|
SharedPreferences.Editor editor = preferences.edit();
|
||||||
|
editor.putInt("callEncryptionHintDisplayedCount", callEncryptionHintDisplayedCount);
|
||||||
|
editor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
public static void toggleLoopStickers() {
|
public static void toggleLoopStickers() {
|
||||||
LiteMode.toggleFlag(LiteMode.FLAG_ANIMATED_STICKERS_CHAT);
|
LiteMode.toggleFlag(LiteMode.FLAG_ANIMATED_STICKERS_CHAT);
|
||||||
}
|
}
|
||||||
|
@ -1529,6 +1545,10 @@ public class SharedConfig {
|
||||||
preferences.edit().putInt("emojiInteractionsHintCount", emojiInteractionsHintCount).apply();
|
preferences.edit().putInt("emojiInteractionsHintCount", emojiInteractionsHintCount).apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setForceLessData(boolean value) {
|
||||||
|
SharedPreferences preferences = MessagesController.getGlobalMainSettings();
|
||||||
|
preferences.edit().putBoolean("forceLessData", forceLessData = value).apply();
|
||||||
|
}
|
||||||
|
|
||||||
public static void updateDayNightThemeSwitchHintCount(int count) {
|
public static void updateDayNightThemeSwitchHintCount(int count) {
|
||||||
dayNightThemeSwitchHintCount = count;
|
dayNightThemeSwitchHintCount = count;
|
||||||
|
|
|
@ -662,7 +662,11 @@ public class TopicsController extends BaseController {
|
||||||
TLRPC.TL_channels_toggleViewForumAsMessages request = new TLRPC.TL_channels_toggleViewForumAsMessages();
|
TLRPC.TL_channels_toggleViewForumAsMessages request = new TLRPC.TL_channels_toggleViewForumAsMessages();
|
||||||
request.channel_id = getMessagesController().getInputChannel(channelId);
|
request.channel_id = getMessagesController().getInputChannel(channelId);
|
||||||
request.enabled = enabled;
|
request.enabled = enabled;
|
||||||
getConnectionsManager().sendRequest(request, null);
|
getConnectionsManager().sendRequest(request, (res, err) -> {
|
||||||
|
if (res != null) {
|
||||||
|
getMessagesController().processUpdates((TLRPC.Updates) res, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void pinTopic(long chatId, int topicId, boolean pin, BaseFragment fragment) {
|
public void pinTopic(long chatId, int topicId, boolean pin, BaseFragment fragment) {
|
||||||
|
|
|
@ -144,9 +144,9 @@ public class UserObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MessagesController.PeerColor getPeerColorForAvatar(int currentAccount, TLRPC.User user) {
|
public static MessagesController.PeerColor getPeerColorForAvatar(int currentAccount, TLRPC.User user) {
|
||||||
if (user != null && user.profile_color != null && user.profile_color.color >= 0 && MessagesController.getInstance(currentAccount).profilePeerColors != null) {
|
// if (user != null && user.profile_color != null && user.profile_color.color >= 0 && MessagesController.getInstance(currentAccount).profilePeerColors != null) {
|
||||||
return MessagesController.getInstance(currentAccount).profilePeerColors.getColor(user.profile_color.color);
|
// return MessagesController.getInstance(currentAccount).profilePeerColors.getColor(user.profile_color.color);
|
||||||
}
|
// }
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,15 +55,17 @@ public class VideoEditedInfo {
|
||||||
public byte[] key;
|
public byte[] key;
|
||||||
public byte[] iv;
|
public byte[] iv;
|
||||||
public MediaController.SavedFilterState filterState;
|
public MediaController.SavedFilterState filterState;
|
||||||
public String paintPath, blurPath;
|
public String paintPath, blurPath, messagePath, messageVideoMaskPath, backgroundPath;
|
||||||
public ArrayList<MediaEntity> mediaEntities;
|
public ArrayList<MediaEntity> mediaEntities;
|
||||||
public MediaController.CropState cropState;
|
public MediaController.CropState cropState;
|
||||||
public boolean isPhoto;
|
public boolean isPhoto;
|
||||||
public boolean isStory;
|
public boolean isStory;
|
||||||
public StoryEntry.HDRInfo hdrInfo;
|
public StoryEntry.HDRInfo hdrInfo;
|
||||||
public ArrayList<StoryEntry.Part> parts;
|
|
||||||
|
|
||||||
public Integer gradientTopColor, gradientBottomColor;
|
public Integer gradientTopColor, gradientBottomColor;
|
||||||
|
public int account;
|
||||||
|
public boolean isDark;
|
||||||
|
public long wallpaperPeerId = Long.MIN_VALUE;
|
||||||
public boolean forceFragmenting;
|
public boolean forceFragmenting;
|
||||||
|
|
||||||
public boolean alreadyScheduledConverting;
|
public boolean alreadyScheduledConverting;
|
||||||
|
@ -115,6 +117,7 @@ public class VideoEditedInfo {
|
||||||
public static final byte TYPE_LOCATION = 3;
|
public static final byte TYPE_LOCATION = 3;
|
||||||
public static final byte TYPE_REACTION = 4;
|
public static final byte TYPE_REACTION = 4;
|
||||||
public static final byte TYPE_ROUND = 5;
|
public static final byte TYPE_ROUND = 5;
|
||||||
|
public static final byte TYPE_MESSAGE = 6;
|
||||||
|
|
||||||
public byte type;
|
public byte type;
|
||||||
public byte subType;
|
public byte subType;
|
||||||
|
@ -135,7 +138,9 @@ public class VideoEditedInfo {
|
||||||
public int viewHeight;
|
public int viewHeight;
|
||||||
public float roundRadius;
|
public float roundRadius;
|
||||||
|
|
||||||
public float scale;
|
public String segmentedPath = "";
|
||||||
|
|
||||||
|
public float scale = 1.0f;
|
||||||
public float textViewWidth;
|
public float textViewWidth;
|
||||||
public float textViewHeight;
|
public float textViewHeight;
|
||||||
public float textViewX;
|
public float textViewX;
|
||||||
|
@ -172,50 +177,53 @@ public class VideoEditedInfo {
|
||||||
public MediaEntity() {
|
public MediaEntity() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MediaEntity(AbstractSerializedData data, boolean full) {
|
public MediaEntity(AbstractSerializedData data, boolean full) {
|
||||||
type = data.readByte(false);
|
this(data, full, false);
|
||||||
subType = data.readByte(false);
|
}
|
||||||
x = data.readFloat(false);
|
|
||||||
y = data.readFloat(false);
|
public MediaEntity(AbstractSerializedData data, boolean full, boolean exception) {
|
||||||
rotation = data.readFloat(false);
|
type = data.readByte(exception);
|
||||||
width = data.readFloat(false);
|
subType = data.readByte(exception);
|
||||||
height = data.readFloat(false);
|
x = data.readFloat(exception);
|
||||||
text = data.readString(false);
|
y = data.readFloat(exception);
|
||||||
int count = data.readInt32(false);
|
rotation = data.readFloat(exception);
|
||||||
|
width = data.readFloat(exception);
|
||||||
|
height = data.readFloat(exception);
|
||||||
|
text = data.readString(exception);
|
||||||
|
int count = data.readInt32(exception);
|
||||||
for (int i = 0; i < count; ++i) {
|
for (int i = 0; i < count; ++i) {
|
||||||
EmojiEntity entity = new EmojiEntity();
|
EmojiEntity entity = new EmojiEntity();
|
||||||
data.readInt32(false);
|
data.readInt32(exception);
|
||||||
entity.readParams(data, false);
|
entity.readParams(data, exception);
|
||||||
entities.add(entity);
|
entities.add(entity);
|
||||||
}
|
}
|
||||||
color = data.readInt32(false);
|
color = data.readInt32(exception);
|
||||||
fontSize = data.readInt32(false);
|
fontSize = data.readInt32(exception);
|
||||||
viewWidth = data.readInt32(false);
|
viewWidth = data.readInt32(exception);
|
||||||
viewHeight = data.readInt32(false);
|
viewHeight = data.readInt32(exception);
|
||||||
textAlign = data.readInt32(false);
|
textAlign = data.readInt32(exception);
|
||||||
textTypeface = PaintTypeface.find(textTypefaceKey = data.readString(false));
|
textTypeface = PaintTypeface.find(textTypefaceKey = data.readString(exception));
|
||||||
scale = data.readFloat(false);
|
scale = data.readFloat(exception);
|
||||||
textViewWidth = data.readFloat(false);
|
textViewWidth = data.readFloat(exception);
|
||||||
textViewHeight = data.readFloat(false);
|
textViewHeight = data.readFloat(exception);
|
||||||
textViewX = data.readFloat(false);
|
textViewX = data.readFloat(exception);
|
||||||
textViewY = data.readFloat(false);
|
textViewY = data.readFloat(exception);
|
||||||
if (full) {
|
if (full) {
|
||||||
int magic = data.readInt32(false);
|
int magic = data.readInt32(exception);
|
||||||
if (magic == TLRPC.TL_null.constructor) {
|
if (magic == TLRPC.TL_null.constructor) {
|
||||||
document = null;
|
document = null;
|
||||||
} else {
|
} else {
|
||||||
document = TLRPC.Document.TLdeserialize(data, magic, false);
|
document = TLRPC.Document.TLdeserialize(data, magic, exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (type == TYPE_LOCATION) {
|
if (type == TYPE_LOCATION) {
|
||||||
density = data.readFloat(false);
|
density = data.readFloat(exception);
|
||||||
mediaArea = TL_stories.MediaArea.TLdeserialize(data, data.readInt32(false), false);
|
mediaArea = TL_stories.MediaArea.TLdeserialize(data, data.readInt32(exception), exception);
|
||||||
mediaGeo = TLRPC.MessageMedia.TLdeserialize(data, data.readInt32(false), false);
|
mediaGeo = TLRPC.MessageMedia.TLdeserialize(data, data.readInt32(exception), exception);
|
||||||
if (data.remaining() > 0) {
|
if (data.remaining() > 0) {
|
||||||
int magic = data.readInt32(false);
|
int magic = data.readInt32(exception);
|
||||||
if (magic == 0xdeadbeef) {
|
if (magic == 0xdeadbeef) {
|
||||||
String emoji = data.readString(false);
|
String emoji = data.readString(exception);
|
||||||
if (mediaGeo instanceof TLRPC.TL_messageMediaVenue) {
|
if (mediaGeo instanceof TLRPC.TL_messageMediaVenue) {
|
||||||
((TLRPC.TL_messageMediaVenue) mediaGeo).emoji = emoji;
|
((TLRPC.TL_messageMediaVenue) mediaGeo).emoji = emoji;
|
||||||
}
|
}
|
||||||
|
@ -223,13 +231,16 @@ public class VideoEditedInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (type == TYPE_REACTION) {
|
if (type == TYPE_REACTION) {
|
||||||
mediaArea = TL_stories.MediaArea.TLdeserialize(data, data.readInt32(false), false);
|
mediaArea = TL_stories.MediaArea.TLdeserialize(data, data.readInt32(exception), exception);
|
||||||
}
|
}
|
||||||
if (type == TYPE_ROUND) {
|
if (type == TYPE_ROUND) {
|
||||||
roundOffset = data.readInt64(false);
|
roundOffset = data.readInt64(exception);
|
||||||
roundLeft = data.readInt64(false);
|
roundLeft = data.readInt64(exception);
|
||||||
roundRight = data.readInt64(false);
|
roundRight = data.readInt64(exception);
|
||||||
roundDuration = data.readInt64(false);
|
roundDuration = data.readInt64(exception);
|
||||||
|
}
|
||||||
|
if (type == TYPE_PHOTO) {
|
||||||
|
segmentedPath = data.readString(exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,6 +304,9 @@ public class VideoEditedInfo {
|
||||||
data.writeInt64(roundRight);
|
data.writeInt64(roundRight);
|
||||||
data.writeInt64(roundDuration);
|
data.writeInt64(roundDuration);
|
||||||
}
|
}
|
||||||
|
if (type == TYPE_PHOTO) {
|
||||||
|
data.writeString(segmentedPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public MediaEntity copy() {
|
public MediaEntity copy() {
|
||||||
|
@ -452,14 +466,7 @@ public class VideoEditedInfo {
|
||||||
} else {
|
} else {
|
||||||
serializedData.writeByte(0);
|
serializedData.writeByte(0);
|
||||||
}
|
}
|
||||||
if (parts != null && !parts.isEmpty()) {
|
|
||||||
serializedData.writeInt32(parts.size());
|
|
||||||
for (StoryEntry.Part part : parts) {
|
|
||||||
part.serializeToStream(serializedData);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
serializedData.writeInt32(0);
|
serializedData.writeInt32(0);
|
||||||
}
|
|
||||||
serializedData.writeBool(isStory);
|
serializedData.writeBool(isStory);
|
||||||
serializedData.writeBool(fromCamera);
|
serializedData.writeBool(fromCamera);
|
||||||
if (blurPathBytes != null) {
|
if (blurPathBytes != null) {
|
||||||
|
@ -582,11 +589,7 @@ public class VideoEditedInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (version >= 6) {
|
if (version >= 6) {
|
||||||
int count = serializedData.readInt32(false);
|
serializedData.readInt32(false);
|
||||||
for (int i = 0; i < count; ++i) {
|
|
||||||
StoryEntry.Part part = new StoryEntry.Part();
|
|
||||||
part.readParams(serializedData, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (version >= 7) {
|
if (version >= 7) {
|
||||||
isStory = serializedData.readBool(false);
|
isStory = serializedData.readBool(false);
|
||||||
|
|
|
@ -89,7 +89,6 @@ public class MediaCodecVideoConvertor {
|
||||||
boolean muted = convertVideoParams.muted;
|
boolean muted = convertVideoParams.muted;
|
||||||
boolean isStory = convertVideoParams.isStory;
|
boolean isStory = convertVideoParams.isStory;
|
||||||
StoryEntry.HDRInfo hdrInfo = convertVideoParams.hdrInfo;
|
StoryEntry.HDRInfo hdrInfo = convertVideoParams.hdrInfo;
|
||||||
ArrayList<StoryEntry.Part> parts = convertVideoParams.parts;
|
|
||||||
|
|
||||||
FileLog.d("convertVideoInternal original=" + originalWidth + "x" + originalHeight + " result=" + resultWidth + "x" + resultHeight + " " + avatarStartTime);
|
FileLog.d("convertVideoInternal original=" + originalWidth + "x" + originalHeight + " result=" + resultWidth + "x" + resultHeight + " " + avatarStartTime);
|
||||||
long time = System.currentTimeMillis();
|
long time = System.currentTimeMillis();
|
||||||
|
@ -178,7 +177,7 @@ public class MediaCodecVideoConvertor {
|
||||||
inputSurface.makeCurrent();
|
inputSurface.makeCurrent();
|
||||||
encoder.start();
|
encoder.start();
|
||||||
|
|
||||||
outputSurface = new OutputSurface(savedFilterState, videoPath, paintPath, blurPath, mediaEntities, cropState != null && cropState.useMatrix != null ? cropState : null, resultWidth, resultHeight, originalWidth, originalHeight, rotationValue, framerate, true, gradientTopColor, gradientBottomColor, null, parts);
|
outputSurface = new OutputSurface(savedFilterState, videoPath, paintPath, blurPath, mediaEntities, cropState != null && cropState.useMatrix != null ? cropState : null, resultWidth, resultHeight, originalWidth, originalHeight, rotationValue, framerate, true, gradientTopColor, gradientBottomColor, null, convertVideoParams);
|
||||||
|
|
||||||
ByteBuffer[] encoderOutputBuffers = null;
|
ByteBuffer[] encoderOutputBuffers = null;
|
||||||
ByteBuffer[] encoderInputBuffers = null;
|
ByteBuffer[] encoderInputBuffers = null;
|
||||||
|
@ -493,7 +492,7 @@ public class MediaCodecVideoConvertor {
|
||||||
inputSurface.makeCurrent();
|
inputSurface.makeCurrent();
|
||||||
encoder.start();
|
encoder.start();
|
||||||
|
|
||||||
outputSurface = new OutputSurface(savedFilterState, null, paintPath, blurPath, mediaEntities, cropState, resultWidth, resultHeight, originalWidth, originalHeight, rotationValue, framerate, false, gradientTopColor, gradientBottomColor, hdrInfo, parts);
|
outputSurface = new OutputSurface(savedFilterState, null, paintPath, blurPath, mediaEntities, cropState, resultWidth, resultHeight, originalWidth, originalHeight, rotationValue, framerate, false, gradientTopColor, gradientBottomColor, hdrInfo, convertVideoParams);
|
||||||
if (hdrInfo == null && outputSurface.supportsEXTYUV() && hasHDR) {
|
if (hdrInfo == null && outputSurface.supportsEXTYUV() && hasHDR) {
|
||||||
hdrInfo = new StoryEntry.HDRInfo();
|
hdrInfo = new StoryEntry.HDRInfo();
|
||||||
hdrInfo.colorTransfer = colorTransfer;
|
hdrInfo.colorTransfer = colorTransfer;
|
||||||
|
@ -1333,6 +1332,9 @@ public class MediaCodecVideoConvertor {
|
||||||
MediaController.SavedFilterState savedFilterState;
|
MediaController.SavedFilterState savedFilterState;
|
||||||
String paintPath;
|
String paintPath;
|
||||||
String blurPath;
|
String blurPath;
|
||||||
|
String messagePath;
|
||||||
|
String messageVideoMaskPath;
|
||||||
|
String backgroundPath;
|
||||||
ArrayList<VideoEditedInfo.MediaEntity> mediaEntities;
|
ArrayList<VideoEditedInfo.MediaEntity> mediaEntities;
|
||||||
boolean isPhoto;
|
boolean isPhoto;
|
||||||
MediaController.CropState cropState;
|
MediaController.CropState cropState;
|
||||||
|
@ -1343,8 +1345,10 @@ public class MediaCodecVideoConvertor {
|
||||||
boolean muted;
|
boolean muted;
|
||||||
boolean isStory;
|
boolean isStory;
|
||||||
StoryEntry.HDRInfo hdrInfo;
|
StoryEntry.HDRInfo hdrInfo;
|
||||||
ArrayList<StoryEntry.Part> parts;
|
|
||||||
public ArrayList<MixedSoundInfo> soundInfos = new ArrayList<MixedSoundInfo>();
|
public ArrayList<MixedSoundInfo> soundInfos = new ArrayList<MixedSoundInfo>();
|
||||||
|
int account;
|
||||||
|
boolean isDark;
|
||||||
|
long wallpaperPeerId;
|
||||||
|
|
||||||
private ConvertVideoParams() {
|
private ConvertVideoParams() {
|
||||||
|
|
||||||
|
@ -1357,16 +1361,8 @@ public class MediaCodecVideoConvertor {
|
||||||
int framerate, int bitrate, int originalBitrate,
|
int framerate, int bitrate, int originalBitrate,
|
||||||
long startTime, long endTime, long avatarStartTime,
|
long startTime, long endTime, long avatarStartTime,
|
||||||
boolean needCompress, long duration,
|
boolean needCompress, long duration,
|
||||||
MediaController.SavedFilterState savedFilterState,
|
|
||||||
String paintPath, String blurPath,
|
|
||||||
ArrayList<VideoEditedInfo.MediaEntity> mediaEntities,
|
|
||||||
boolean isPhoto,
|
|
||||||
MediaController.CropState cropState,
|
|
||||||
boolean isRound,
|
|
||||||
MediaController.VideoConvertorListener callback,
|
MediaController.VideoConvertorListener callback,
|
||||||
Integer gradientTopColor, Integer gradientBottomColor,
|
VideoEditedInfo info) {
|
||||||
boolean muted, boolean isStory, StoryEntry.HDRInfo hdrInfo,
|
|
||||||
ArrayList<StoryEntry.Part> parts) {
|
|
||||||
ConvertVideoParams params = new ConvertVideoParams();
|
ConvertVideoParams params = new ConvertVideoParams();
|
||||||
params.videoPath = videoPath;
|
params.videoPath = videoPath;
|
||||||
params.cacheFile = cacheFile;
|
params.cacheFile = cacheFile;
|
||||||
|
@ -1384,21 +1380,25 @@ public class MediaCodecVideoConvertor {
|
||||||
params.avatarStartTime = avatarStartTime;
|
params.avatarStartTime = avatarStartTime;
|
||||||
params.needCompress = needCompress;
|
params.needCompress = needCompress;
|
||||||
params.duration = duration;
|
params.duration = duration;
|
||||||
params.savedFilterState = savedFilterState;
|
params.savedFilterState = info.filterState;
|
||||||
params.paintPath = paintPath;
|
params.paintPath = info.paintPath;
|
||||||
params.blurPath = blurPath;
|
params.blurPath = info.blurPath;
|
||||||
params.mediaEntities = mediaEntities;
|
params.mediaEntities = info.mediaEntities;
|
||||||
params.isPhoto = isPhoto;
|
params.isPhoto = info.isPhoto;
|
||||||
params.cropState = cropState;
|
params.cropState = info.cropState;
|
||||||
params.isRound = isRound;
|
params.isRound = info.roundVideo;
|
||||||
params.callback = callback;
|
params.callback = callback;
|
||||||
params.gradientTopColor = gradientTopColor;
|
params.gradientTopColor = info.gradientTopColor;
|
||||||
params.gradientBottomColor = gradientBottomColor;
|
params.gradientBottomColor = info.gradientBottomColor;
|
||||||
params.muted = muted;
|
params.muted = info.muted;
|
||||||
params.isStory = isStory;
|
params.isStory = info.isStory;
|
||||||
params.hdrInfo = hdrInfo;
|
params.hdrInfo = info.hdrInfo;
|
||||||
params.parts = parts;
|
params.isDark = info.isDark;
|
||||||
|
params.wallpaperPeerId = info.wallpaperPeerId;
|
||||||
|
params.account = info.account;
|
||||||
|
params.messagePath = info.messagePath;
|
||||||
|
params.messageVideoMaskPath = info.messageVideoMaskPath;
|
||||||
|
params.backgroundPath = info.backgroundPath;
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,8 +39,8 @@ public class OutputSurface implements SurfaceTexture.OnFrameAvailableListener {
|
||||||
private boolean mFrameAvailable;
|
private boolean mFrameAvailable;
|
||||||
private TextureRenderer mTextureRender;
|
private TextureRenderer mTextureRender;
|
||||||
|
|
||||||
public OutputSurface(MediaController.SavedFilterState savedFilterState, String imagePath, String paintPath, String blurPath, ArrayList<VideoEditedInfo.MediaEntity> mediaEntities, MediaController.CropState cropState, int w, int h, int originalW, int originalH, int rotation, float fps, boolean photo, Integer gradientTopColor, Integer gradientBottomColor, StoryEntry.HDRInfo hdrInfo, ArrayList<StoryEntry.Part> parts) {
|
public OutputSurface(MediaController.SavedFilterState savedFilterState, String imagePath, String paintPath, String blurPath, ArrayList<VideoEditedInfo.MediaEntity> mediaEntities, MediaController.CropState cropState, int w, int h, int originalW, int originalH, int rotation, float fps, boolean photo, Integer gradientTopColor, Integer gradientBottomColor, StoryEntry.HDRInfo hdrInfo, MediaCodecVideoConvertor.ConvertVideoParams params) {
|
||||||
mTextureRender = new TextureRenderer(savedFilterState, imagePath, paintPath, blurPath, mediaEntities, cropState, w, h, originalW, originalH, rotation, fps, photo, gradientTopColor, gradientBottomColor, hdrInfo, parts);
|
mTextureRender = new TextureRenderer(savedFilterState, imagePath, paintPath, blurPath, mediaEntities, cropState, w, h, originalW, originalH, rotation, fps, photo, gradientTopColor, gradientBottomColor, hdrInfo, params);
|
||||||
mTextureRender.surfaceCreated();
|
mTextureRender.surfaceCreated();
|
||||||
mSurfaceTexture = new SurfaceTexture(mTextureRender.getTextureId());
|
mSurfaceTexture = new SurfaceTexture(mTextureRender.getTextureId());
|
||||||
mSurfaceTexture.setOnFrameAvailableListener(this);
|
mSurfaceTexture.setOnFrameAvailableListener(this);
|
||||||
|
|
|
@ -21,6 +21,7 @@ import android.graphics.PorterDuffXfermode;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import android.graphics.SurfaceTexture;
|
import android.graphics.SurfaceTexture;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.opengl.GLES11Ext;
|
import android.opengl.GLES11Ext;
|
||||||
import android.opengl.GLES20;
|
import android.opengl.GLES20;
|
||||||
import android.opengl.GLES30;
|
import android.opengl.GLES30;
|
||||||
|
@ -30,6 +31,7 @@ import android.os.Build;
|
||||||
import android.text.Layout;
|
import android.text.Layout;
|
||||||
import android.text.SpannableString;
|
import android.text.SpannableString;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.text.style.ReplacementSpan;
|
import android.text.style.ReplacementSpan;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
@ -70,6 +72,7 @@ import org.telegram.ui.Components.Paint.Views.LocationMarker;
|
||||||
import org.telegram.ui.Components.Paint.Views.PaintTextOptionsView;
|
import org.telegram.ui.Components.Paint.Views.PaintTextOptionsView;
|
||||||
import org.telegram.ui.Components.RLottieDrawable;
|
import org.telegram.ui.Components.RLottieDrawable;
|
||||||
import org.telegram.ui.Components.Rect;
|
import org.telegram.ui.Components.Rect;
|
||||||
|
import org.telegram.ui.Stories.recorder.PreviewView;
|
||||||
import org.telegram.ui.Stories.recorder.StoryEntry;
|
import org.telegram.ui.Stories.recorder.StoryEntry;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -89,15 +92,11 @@ public class TextureRenderer {
|
||||||
private FloatBuffer gradientTextureBuffer;
|
private FloatBuffer gradientTextureBuffer;
|
||||||
private FloatBuffer textureBuffer;
|
private FloatBuffer textureBuffer;
|
||||||
private FloatBuffer renderTextureBuffer;
|
private FloatBuffer renderTextureBuffer;
|
||||||
|
private FloatBuffer maskTextureBuffer;
|
||||||
private FloatBuffer bitmapVerticesBuffer;
|
private FloatBuffer bitmapVerticesBuffer;
|
||||||
|
|
||||||
private FloatBuffer blurVerticesBuffer;
|
private FloatBuffer blurVerticesBuffer;
|
||||||
|
|
||||||
private FloatBuffer partsVerticesBuffer[];
|
|
||||||
private FloatBuffer partsTextureBuffer;
|
|
||||||
private ArrayList<StoryEntry.Part> parts;
|
|
||||||
private int[] partsTexture;
|
|
||||||
|
|
||||||
private boolean useMatrixForImagePath;
|
private boolean useMatrixForImagePath;
|
||||||
|
|
||||||
float[] bitmapData = {
|
float[] bitmapData = {
|
||||||
|
@ -109,6 +108,9 @@ public class TextureRenderer {
|
||||||
|
|
||||||
private FilterShaders filterShaders;
|
private FilterShaders filterShaders;
|
||||||
private String paintPath;
|
private String paintPath;
|
||||||
|
private String messagePath;
|
||||||
|
private String messageVideoMaskPath;
|
||||||
|
private String backgroundPath;
|
||||||
private String blurPath;
|
private String blurPath;
|
||||||
private String imagePath;
|
private String imagePath;
|
||||||
private int imageWidth, imageHeight;
|
private int imageWidth, imageHeight;
|
||||||
|
@ -118,6 +120,7 @@ public class TextureRenderer {
|
||||||
private int originalHeight;
|
private int originalHeight;
|
||||||
private int transformedWidth;
|
private int transformedWidth;
|
||||||
private int transformedHeight;
|
private int transformedHeight;
|
||||||
|
private Drawable backgroundDrawable;
|
||||||
|
|
||||||
private BlurringShader blur;
|
private BlurringShader blur;
|
||||||
|
|
||||||
|
@ -144,6 +147,35 @@ public class TextureRenderer {
|
||||||
" vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
|
" vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
|
private static final String VERTEX_SHADER_MASK =
|
||||||
|
"uniform mat4 uMVPMatrix;\n" +
|
||||||
|
"uniform mat4 uSTMatrix;\n" +
|
||||||
|
"attribute vec4 aPosition;\n" +
|
||||||
|
"attribute vec4 aTextureCoord;\n" +
|
||||||
|
"attribute vec4 mTextureCoord;\n" +
|
||||||
|
"varying vec2 vTextureCoord;\n" +
|
||||||
|
"varying vec2 MTextureCoord;\n" +
|
||||||
|
"void main() {\n" +
|
||||||
|
" gl_Position = uMVPMatrix * aPosition;\n" +
|
||||||
|
" vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
|
||||||
|
" MTextureCoord = (uSTMatrix * mTextureCoord).xy;\n" +
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
private static final String VERTEX_SHADER_MASK_300 =
|
||||||
|
"#version 320 es\n" +
|
||||||
|
"uniform mat4 uMVPMatrix;\n" +
|
||||||
|
"uniform mat4 uSTMatrix;\n" +
|
||||||
|
"in vec4 aPosition;\n" +
|
||||||
|
"in vec4 aTextureCoord;\n" +
|
||||||
|
"in vec4 mTextureCoord;\n" +
|
||||||
|
"out vec2 vTextureCoord;\n" +
|
||||||
|
"out vec2 MTextureCoord;\n" +
|
||||||
|
"void main() {\n" +
|
||||||
|
" gl_Position = uMVPMatrix * aPosition;\n" +
|
||||||
|
" vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
|
||||||
|
" MTextureCoord = (uSTMatrix * mTextureCoord).xy;\n" +
|
||||||
|
"}\n";
|
||||||
|
|
||||||
private static final String FRAGMENT_EXTERNAL_SHADER =
|
private static final String FRAGMENT_EXTERNAL_SHADER =
|
||||||
"#extension GL_OES_EGL_image_external : require\n" +
|
"#extension GL_OES_EGL_image_external : require\n" +
|
||||||
"precision highp float;\n" +
|
"precision highp float;\n" +
|
||||||
|
@ -153,6 +185,17 @@ public class TextureRenderer {
|
||||||
" gl_FragColor = texture2D(sTexture, vTextureCoord);" +
|
" gl_FragColor = texture2D(sTexture, vTextureCoord);" +
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
|
private static final String FRAGMENT_EXTERNAL_MASK_SHADER =
|
||||||
|
"#extension GL_OES_EGL_image_external : require\n" +
|
||||||
|
"precision highp float;\n" +
|
||||||
|
"varying vec2 vTextureCoord;\n" +
|
||||||
|
"varying vec2 MTextureCoord;\n" +
|
||||||
|
"uniform samplerExternalOES sTexture;\n" +
|
||||||
|
"uniform sampler2D sMask;\n" +
|
||||||
|
"void main() {\n" +
|
||||||
|
" gl_FragColor = texture2D(sTexture, vTextureCoord) * texture2D(sMask, MTextureCoord).a;\n" +
|
||||||
|
"}\n";
|
||||||
|
|
||||||
private static final String FRAGMENT_SHADER =
|
private static final String FRAGMENT_SHADER =
|
||||||
"precision highp float;\n" +
|
"precision highp float;\n" +
|
||||||
"varying vec2 vTextureCoord;\n" +
|
"varying vec2 vTextureCoord;\n" +
|
||||||
|
@ -161,6 +204,16 @@ public class TextureRenderer {
|
||||||
" gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
|
" gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
|
private static final String FRAGMENT_MASK_SHADER =
|
||||||
|
"precision highp float;\n" +
|
||||||
|
"varying vec2 vTextureCoord;\n" +
|
||||||
|
"varying vec2 MTextureCoord;\n" +
|
||||||
|
"uniform sampler2D sTexture;\n" +
|
||||||
|
"uniform sampler2D sMask;\n" +
|
||||||
|
"void main() {\n" +
|
||||||
|
" gl_FragColor = texture2D(sTexture, vTextureCoord) * texture2D(sMask, MTextureCoord).a;\n" +
|
||||||
|
"}\n";
|
||||||
|
|
||||||
private static final String GRADIENT_FRAGMENT_SHADER =
|
private static final String GRADIENT_FRAGMENT_SHADER =
|
||||||
"precision highp float;\n" +
|
"precision highp float;\n" +
|
||||||
"varying vec2 vTextureCoord;\n" +
|
"varying vec2 vTextureCoord;\n" +
|
||||||
|
@ -181,11 +234,14 @@ public class TextureRenderer {
|
||||||
private float[] mSTMatrix = new float[16];
|
private float[] mSTMatrix = new float[16];
|
||||||
private float[] mSTMatrixIdentity = new float[16];
|
private float[] mSTMatrixIdentity = new float[16];
|
||||||
private int mTextureID;
|
private int mTextureID;
|
||||||
|
private int videoMaskTexture;
|
||||||
private int[] mProgram;
|
private int[] mProgram;
|
||||||
private int[] muMVPMatrixHandle;
|
private int[] muMVPMatrixHandle;
|
||||||
private int[] muSTMatrixHandle;
|
private int[] muSTMatrixHandle;
|
||||||
private int[] maPositionHandle;
|
private int[] maPositionHandle;
|
||||||
private int[] maTextureHandle;
|
private int[] maTextureHandle;
|
||||||
|
private int[] mmTextureHandle;
|
||||||
|
private int[] maskTextureHandle;
|
||||||
private int gradientTopColorHandle, gradientBottomColorHandle;
|
private int gradientTopColorHandle, gradientBottomColorHandle;
|
||||||
private int texSizeHandle;
|
private int texSizeHandle;
|
||||||
// todo: HDR handles
|
// todo: HDR handles
|
||||||
|
@ -207,6 +263,11 @@ public class TextureRenderer {
|
||||||
private Canvas stickerCanvas;
|
private Canvas stickerCanvas;
|
||||||
private float videoFps;
|
private float videoFps;
|
||||||
|
|
||||||
|
private int imagePathIndex = -1;
|
||||||
|
private int paintPathIndex = -1;
|
||||||
|
private int messagePathIndex = -1;
|
||||||
|
private int backgroundPathIndex = -1;
|
||||||
|
|
||||||
private Bitmap roundBitmap;
|
private Bitmap roundBitmap;
|
||||||
private Canvas roundCanvas;
|
private Canvas roundCanvas;
|
||||||
private final android.graphics.Rect roundSrc = new android.graphics.Rect();
|
private final android.graphics.Rect roundSrc = new android.graphics.Rect();
|
||||||
|
@ -244,10 +305,9 @@ public class TextureRenderer {
|
||||||
Integer gradientTopColor,
|
Integer gradientTopColor,
|
||||||
Integer gradientBottomColor,
|
Integer gradientBottomColor,
|
||||||
StoryEntry.HDRInfo hdrInfo,
|
StoryEntry.HDRInfo hdrInfo,
|
||||||
ArrayList<StoryEntry.Part> parts
|
MediaCodecVideoConvertor.ConvertVideoParams params
|
||||||
) {
|
) {
|
||||||
isPhoto = photo;
|
isPhoto = photo;
|
||||||
this.parts = parts;
|
|
||||||
|
|
||||||
float[] texData = {
|
float[] texData = {
|
||||||
0.f, 0.f,
|
0.f, 0.f,
|
||||||
|
@ -285,6 +345,9 @@ public class TextureRenderer {
|
||||||
this.originalHeight = originalHeight;
|
this.originalHeight = originalHeight;
|
||||||
imagePath = image;
|
imagePath = image;
|
||||||
paintPath = paint;
|
paintPath = paint;
|
||||||
|
messagePath = params.messagePath;
|
||||||
|
messageVideoMaskPath = params.messageVideoMaskPath;
|
||||||
|
backgroundPath = params.backgroundPath;
|
||||||
blurPath = blurtex;
|
blurPath = blurtex;
|
||||||
mediaEntities = entities;
|
mediaEntities = entities;
|
||||||
videoFps = fps == 0 ? 30 : fps;
|
videoFps = fps == 0 ? 30 : fps;
|
||||||
|
@ -292,21 +355,12 @@ public class TextureRenderer {
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
NUM_EXTERNAL_SHADER = count++;
|
NUM_EXTERNAL_SHADER = count++;
|
||||||
if (gradientBottomColor != null && gradientTopColor != null) {
|
|
||||||
NUM_GRADIENT_SHADER = count++;
|
|
||||||
}
|
|
||||||
if (filterShaders != null) {
|
|
||||||
NUM_FILTER_SHADER = count++;
|
|
||||||
}
|
|
||||||
mProgram = new int[count];
|
|
||||||
muMVPMatrixHandle = new int[count];
|
|
||||||
muSTMatrixHandle = new int[count];
|
|
||||||
maPositionHandle = new int[count];
|
|
||||||
maTextureHandle = new int[count];
|
|
||||||
|
|
||||||
Matrix.setIdentityM(mMVPMatrix, 0);
|
Matrix.setIdentityM(mMVPMatrix, 0);
|
||||||
int textureRotation = 0;
|
int textureRotation = 0;
|
||||||
if (gradientBottomColor != null && gradientTopColor != null) {
|
if (params != null && params.wallpaperPeerId != Long.MIN_VALUE) {
|
||||||
|
backgroundDrawable = PreviewView.getBackgroundDrawable(null, params.account, params.wallpaperPeerId, params.isDark);
|
||||||
|
} else if (gradientBottomColor != null && gradientTopColor != null) {
|
||||||
final float[] verticesData = {
|
final float[] verticesData = {
|
||||||
-1.0f, -1.0f,
|
-1.0f, -1.0f,
|
||||||
1.0f, -1.0f,
|
1.0f, -1.0f,
|
||||||
|
@ -325,7 +379,18 @@ public class TextureRenderer {
|
||||||
gradientTextureBuffer.put(textureData).position(0);
|
gradientTextureBuffer.put(textureData).position(0);
|
||||||
this.gradientTopColor = gradientTopColor;
|
this.gradientTopColor = gradientTopColor;
|
||||||
this.gradientBottomColor = gradientBottomColor;
|
this.gradientBottomColor = gradientBottomColor;
|
||||||
|
NUM_GRADIENT_SHADER = count++;
|
||||||
}
|
}
|
||||||
|
if (filterShaders != null) {
|
||||||
|
NUM_FILTER_SHADER = count++;
|
||||||
|
}
|
||||||
|
mProgram = new int[count];
|
||||||
|
muMVPMatrixHandle = new int[count];
|
||||||
|
muSTMatrixHandle = new int[count];
|
||||||
|
maPositionHandle = new int[count];
|
||||||
|
maTextureHandle = new int[count];
|
||||||
|
mmTextureHandle = new int[count];
|
||||||
|
maskTextureHandle = new int[count];
|
||||||
if (cropState != null) {
|
if (cropState != null) {
|
||||||
if (cropState.useMatrix != null) {
|
if (cropState.useMatrix != null) {
|
||||||
useMatrixForImagePath = true;
|
useMatrixForImagePath = true;
|
||||||
|
@ -455,16 +520,23 @@ public class TextureRenderer {
|
||||||
}
|
}
|
||||||
renderTextureBuffer = ByteBuffer.allocateDirect(textureData.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
renderTextureBuffer = ByteBuffer.allocateDirect(textureData.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
||||||
renderTextureBuffer.put(textureData).position(0);
|
renderTextureBuffer.put(textureData).position(0);
|
||||||
|
|
||||||
|
textureData = new float[]{
|
||||||
|
0.f, 0.f,
|
||||||
|
1.f, 0.f,
|
||||||
|
0.f, 1.f,
|
||||||
|
1.f, 1.f
|
||||||
|
};
|
||||||
|
maskTextureBuffer = ByteBuffer.allocateDirect(textureData.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
||||||
|
maskTextureBuffer.put(textureData).position(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getTextureId() {
|
public int getTextureId() {
|
||||||
return mTextureID;
|
return mTextureID;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawGradient() {
|
private void drawBackground() {
|
||||||
if (NUM_GRADIENT_SHADER < 0) {
|
if (NUM_GRADIENT_SHADER >= 0) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
GLES20.glUseProgram(mProgram[NUM_GRADIENT_SHADER]);
|
GLES20.glUseProgram(mProgram[NUM_GRADIENT_SHADER]);
|
||||||
|
|
||||||
GLES20.glVertexAttribPointer(maPositionHandle[NUM_GRADIENT_SHADER], 2, GLES20.GL_FLOAT, false, 8, gradientVerticesBuffer);
|
GLES20.glVertexAttribPointer(maPositionHandle[NUM_GRADIENT_SHADER], 2, GLES20.GL_FLOAT, false, 8, gradientVerticesBuffer);
|
||||||
|
@ -478,12 +550,23 @@ public class TextureRenderer {
|
||||||
GLES20.glUniform4f(gradientTopColorHandle, Color.red(gradientTopColor) / 255f, Color.green(gradientTopColor) / 255f, Color.blue(gradientTopColor) / 255f, Color.alpha(gradientTopColor) / 255f);
|
GLES20.glUniform4f(gradientTopColorHandle, Color.red(gradientTopColor) / 255f, Color.green(gradientTopColor) / 255f, Color.blue(gradientTopColor) / 255f, Color.alpha(gradientTopColor) / 255f);
|
||||||
GLES20.glUniform4f(gradientBottomColorHandle, Color.red(gradientBottomColor) / 255f, Color.green(gradientBottomColor) / 255f, Color.blue(gradientBottomColor) / 255f, Color.alpha(gradientBottomColor) / 255f);
|
GLES20.glUniform4f(gradientBottomColorHandle, Color.red(gradientBottomColor) / 255f, Color.green(gradientBottomColor) / 255f, Color.blue(gradientBottomColor) / 255f, Color.alpha(gradientBottomColor) / 255f);
|
||||||
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
|
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
} else if (backgroundPathIndex >= 0) {
|
||||||
|
GLES20.glUseProgram(simpleShaderProgram);
|
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
|
||||||
|
|
||||||
|
GLES20.glUniform1i(simpleSourceImageHandle, 0);
|
||||||
|
GLES20.glEnableVertexAttribArray(simpleInputTexCoordHandle);
|
||||||
|
GLES20.glVertexAttribPointer(simpleInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer);
|
||||||
|
GLES20.glEnableVertexAttribArray(simplePositionHandle);
|
||||||
|
|
||||||
|
drawTexture(true, paintTexture[backgroundPathIndex], -10000, -10000, -10000, -10000, 0, false, false, -1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void drawFrame(SurfaceTexture st, long time) {
|
public void drawFrame(SurfaceTexture st, long time) {
|
||||||
boolean blurred = false;
|
boolean blurred = false;
|
||||||
if (isPhoto) {
|
if (isPhoto) {
|
||||||
drawGradient();
|
drawBackground();
|
||||||
} else {
|
} else {
|
||||||
st.getTransformMatrix(mSTMatrix);
|
st.getTransformMatrix(mSTMatrix);
|
||||||
if (BuildVars.LOGS_ENABLED && firstFrame) {
|
if (BuildVars.LOGS_ENABLED && firstFrame) {
|
||||||
|
@ -530,16 +613,26 @@ public class TextureRenderer {
|
||||||
stMatrix = mSTMatrix;
|
stMatrix = mSTMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
drawGradient();
|
drawBackground();
|
||||||
|
|
||||||
GLES20.glUseProgram(mProgram[index]);
|
GLES20.glUseProgram(mProgram[index]);
|
||||||
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
|
||||||
GLES20.glBindTexture(target, texture);
|
GLES20.glBindTexture(target, texture);
|
||||||
|
|
||||||
|
if (messageVideoMaskPath != null && videoMaskTexture != -1) {
|
||||||
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
|
||||||
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, videoMaskTexture);
|
||||||
|
GLES20.glUniform1i(maskTextureHandle[index], 1);
|
||||||
|
}
|
||||||
|
|
||||||
GLES20.glVertexAttribPointer(maPositionHandle[index], 2, GLES20.GL_FLOAT, false, 8, verticesBuffer);
|
GLES20.glVertexAttribPointer(maPositionHandle[index], 2, GLES20.GL_FLOAT, false, 8, verticesBuffer);
|
||||||
GLES20.glEnableVertexAttribArray(maPositionHandle[index]);
|
GLES20.glEnableVertexAttribArray(maPositionHandle[index]);
|
||||||
GLES20.glVertexAttribPointer(maTextureHandle[index], 2, GLES20.GL_FLOAT, false, 8, renderTextureBuffer);
|
GLES20.glVertexAttribPointer(maTextureHandle[index], 2, GLES20.GL_FLOAT, false, 8, renderTextureBuffer);
|
||||||
GLES20.glEnableVertexAttribArray(maTextureHandle[index]);
|
GLES20.glEnableVertexAttribArray(maTextureHandle[index]);
|
||||||
|
if (messageVideoMaskPath != null && videoMaskTexture != -1) {
|
||||||
|
GLES20.glVertexAttribPointer(mmTextureHandle[index], 2, GLES20.GL_FLOAT, false, 8, maskTextureBuffer);
|
||||||
|
GLES20.glEnableVertexAttribArray(mmTextureHandle[index]);
|
||||||
|
}
|
||||||
|
|
||||||
if (texSizeHandle != 0) {
|
if (texSizeHandle != 0) {
|
||||||
GLES20.glUniform2f(texSizeHandle, transformedWidth, transformedHeight);
|
GLES20.glUniform2f(texSizeHandle, transformedWidth, transformedHeight);
|
||||||
|
@ -590,7 +683,7 @@ public class TextureRenderer {
|
||||||
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
|
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isPhoto || paintTexture != null || stickerTexture != null || partsTexture != null) {
|
if (isPhoto || paintTexture != null || stickerTexture != null) {
|
||||||
GLES20.glUseProgram(simpleShaderProgram);
|
GLES20.glUseProgram(simpleShaderProgram);
|
||||||
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
|
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
|
||||||
|
|
||||||
|
@ -599,20 +692,14 @@ public class TextureRenderer {
|
||||||
GLES20.glVertexAttribPointer(simpleInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer);
|
GLES20.glVertexAttribPointer(simpleInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer);
|
||||||
GLES20.glEnableVertexAttribArray(simplePositionHandle);
|
GLES20.glEnableVertexAttribArray(simplePositionHandle);
|
||||||
}
|
}
|
||||||
if (paintTexture != null && imagePath != null) {
|
if (imagePathIndex >= 0) {
|
||||||
for (int a = 0; a < 1; a++) {
|
drawTexture(true, paintTexture[imagePathIndex], -10000, -10000, -10000, -10000, 0, false, useMatrixForImagePath && isPhoto, -1);
|
||||||
drawTexture(true, paintTexture[a], -10000, -10000, -10000, -10000, 0, false, useMatrixForImagePath && isPhoto && a == 0, -1);
|
|
||||||
}
|
}
|
||||||
|
if (paintPathIndex >= 0) {
|
||||||
|
drawTexture(true, paintTexture[paintPathIndex], -10000, -10000, -10000, -10000, 0, false, false, -1);
|
||||||
}
|
}
|
||||||
if (partsTexture != null) {
|
if (messagePathIndex >= 0) {
|
||||||
for (int a = 0; a < partsTexture.length; a++) {
|
drawTexture(true, paintTexture[messagePathIndex], -10000, -10000, -10000, -10000, 0, false, false, -1);
|
||||||
drawTexture(true, partsTexture[a], -10000, -10000, -10000, -10000, 0, false, false, a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (paintTexture != null) {
|
|
||||||
for (int a = (imagePath != null ? 1 : 0); a < paintTexture.length; a++) {
|
|
||||||
drawTexture(true, paintTexture[a], -10000, -10000, -10000, -10000, 0, false, useMatrixForImagePath && isPhoto && a == 0, -1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (stickerTexture != null) {
|
if (stickerTexture != null) {
|
||||||
for (int a = 0, N = mediaEntities.size(); a < N; a++) {
|
for (int a = 0, N = mediaEntities.size(); a < N; a++) {
|
||||||
|
@ -857,9 +944,9 @@ public class TextureRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bitmapVerticesBuffer.put(bitmapData).position(0);
|
bitmapVerticesBuffer.put(bitmapData).position(0);
|
||||||
GLES20.glVertexAttribPointer(simplePositionHandle, 2, GLES20.GL_FLOAT, false, 8, matrixIndex >= 0 ? partsVerticesBuffer[matrixIndex] : (useCropMatrix ? verticesBuffer : bitmapVerticesBuffer));
|
GLES20.glVertexAttribPointer(simplePositionHandle, 2, GLES20.GL_FLOAT, false, 8, useCropMatrix ? verticesBuffer : bitmapVerticesBuffer);
|
||||||
GLES20.glEnableVertexAttribArray(simpleInputTexCoordHandle);
|
GLES20.glEnableVertexAttribArray(simpleInputTexCoordHandle);
|
||||||
GLES20.glVertexAttribPointer(simpleInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, matrixIndex >= 0 ? partsTextureBuffer : (useCropMatrix ? renderTextureBuffer : textureBuffer));
|
GLES20.glVertexAttribPointer(simpleInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, useCropMatrix ? renderTextureBuffer : textureBuffer);
|
||||||
if (bind) {
|
if (bind) {
|
||||||
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
|
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
|
||||||
}
|
}
|
||||||
|
@ -874,22 +961,27 @@ public class TextureRenderer {
|
||||||
@SuppressLint("WrongConstant")
|
@SuppressLint("WrongConstant")
|
||||||
public void surfaceCreated() {
|
public void surfaceCreated() {
|
||||||
for (int a = 0; a < mProgram.length; a++) {
|
for (int a = 0; a < mProgram.length; a++) {
|
||||||
String shader = null;
|
String fragSshader = null;
|
||||||
|
String vertexShader = VERTEX_SHADER;
|
||||||
if (a == NUM_EXTERNAL_SHADER) {
|
if (a == NUM_EXTERNAL_SHADER) {
|
||||||
shader = FRAGMENT_EXTERNAL_SHADER;
|
fragSshader = messageVideoMaskPath != null ? FRAGMENT_EXTERNAL_MASK_SHADER : FRAGMENT_EXTERNAL_SHADER;
|
||||||
|
vertexShader = messageVideoMaskPath != null ? VERTEX_SHADER_MASK : VERTEX_SHADER;
|
||||||
} else if (a == NUM_FILTER_SHADER) {
|
} else if (a == NUM_FILTER_SHADER) {
|
||||||
shader = FRAGMENT_SHADER;
|
fragSshader = messageVideoMaskPath != null ? FRAGMENT_MASK_SHADER : FRAGMENT_SHADER;
|
||||||
|
vertexShader = messageVideoMaskPath != null ? VERTEX_SHADER_MASK : VERTEX_SHADER;
|
||||||
} else if (a == NUM_GRADIENT_SHADER) {
|
} else if (a == NUM_GRADIENT_SHADER) {
|
||||||
shader = GRADIENT_FRAGMENT_SHADER;
|
fragSshader = GRADIENT_FRAGMENT_SHADER;
|
||||||
}
|
}
|
||||||
if (shader == null) {
|
if (vertexShader == null || fragSshader == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
mProgram[a] = createProgram(VERTEX_SHADER, shader, false);
|
mProgram[a] = createProgram(vertexShader, fragSshader, false);
|
||||||
maPositionHandle[a] = GLES20.glGetAttribLocation(mProgram[a], "aPosition");
|
maPositionHandle[a] = GLES20.glGetAttribLocation(mProgram[a], "aPosition");
|
||||||
maTextureHandle[a] = GLES20.glGetAttribLocation(mProgram[a], "aTextureCoord");
|
maTextureHandle[a] = GLES20.glGetAttribLocation(mProgram[a], "aTextureCoord");
|
||||||
|
mmTextureHandle[a] = GLES20.glGetAttribLocation(mProgram[a], "mTextureCoord");
|
||||||
muMVPMatrixHandle[a] = GLES20.glGetUniformLocation(mProgram[a], "uMVPMatrix");
|
muMVPMatrixHandle[a] = GLES20.glGetUniformLocation(mProgram[a], "uMVPMatrix");
|
||||||
muSTMatrixHandle[a] = GLES20.glGetUniformLocation(mProgram[a], "uSTMatrix");
|
muSTMatrixHandle[a] = GLES20.glGetUniformLocation(mProgram[a], "uSTMatrix");
|
||||||
|
maskTextureHandle[a] = GLES20.glGetUniformLocation(mProgram[a], "sMask");
|
||||||
if (a == NUM_GRADIENT_SHADER) {
|
if (a == NUM_GRADIENT_SHADER) {
|
||||||
gradientTopColorHandle = GLES20.glGetUniformLocation(mProgram[a], "gradientTopColor");
|
gradientTopColorHandle = GLES20.glGetUniformLocation(mProgram[a], "gradientTopColor");
|
||||||
gradientBottomColorHandle = GLES20.glGetUniformLocation(mProgram[a], "gradientBottomColor");
|
gradientBottomColorHandle = GLES20.glGetUniformLocation(mProgram[a], "gradientBottomColor");
|
||||||
|
@ -904,6 +996,23 @@ public class TextureRenderer {
|
||||||
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
|
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
|
||||||
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
|
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
|
if (messageVideoMaskPath != null) {
|
||||||
|
try {
|
||||||
|
GLES20.glGenTextures(1, textures, 0);
|
||||||
|
GLES20.glBindTexture(GL10.GL_TEXTURE_2D, videoMaskTexture = textures[0]);
|
||||||
|
GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
|
||||||
|
GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
|
||||||
|
GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
|
||||||
|
GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
|
||||||
|
Bitmap bitmap = BitmapFactory.decodeFile(messageVideoMaskPath);
|
||||||
|
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
|
||||||
|
bitmap.recycle();
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
videoMaskTexture = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (blurPath != null && cropState != null && cropState.useMatrix != null) {
|
if (blurPath != null && cropState != null && cropState.useMatrix != null) {
|
||||||
blur = new BlurringShader();
|
blur = new BlurringShader();
|
||||||
if (!blur.setup(transformedWidth / (float) transformedHeight, true, 0)) {
|
if (!blur.setup(transformedWidth / (float) transformedHeight, true, 0)) {
|
||||||
|
@ -980,7 +1089,7 @@ public class TextureRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (filterShaders != null || imagePath != null || paintPath != null || mediaEntities != null || parts != null) {
|
if (filterShaders != null || imagePath != null || paintPath != null || messagePath != null || mediaEntities != null) {
|
||||||
int vertexShader = FilterShaders.loadShader(GLES20.GL_VERTEX_SHADER, FilterShaders.simpleVertexShaderCode);
|
int vertexShader = FilterShaders.loadShader(GLES20.GL_VERTEX_SHADER, FilterShaders.simpleVertexShaderCode);
|
||||||
int fragmentShader = FilterShaders.loadShader(GLES20.GL_FRAGMENT_SHADER, FilterShaders.simpleFragmentShaderCode);
|
int fragmentShader = FilterShaders.loadShader(GLES20.GL_FRAGMENT_SHADER, FilterShaders.simpleFragmentShaderCode);
|
||||||
if (vertexShader != 0 && fragmentShader != 0) {
|
if (vertexShader != 0 && fragmentShader != 0) {
|
||||||
|
@ -1008,24 +1117,41 @@ public class TextureRenderer {
|
||||||
filterShaders.create();
|
filterShaders.create();
|
||||||
filterShaders.setRenderData(null, 0, mTextureID, originalWidth, originalHeight);
|
filterShaders.setRenderData(null, 0, mTextureID, originalWidth, originalHeight);
|
||||||
}
|
}
|
||||||
if (imagePath != null || paintPath != null) {
|
if (imagePath != null || paintPath != null || messagePath != null) {
|
||||||
paintTexture = new int[(imagePath != null ? 1 : 0) + (paintPath != null ? 1 : 0)];
|
int texturePathesCount = 0;
|
||||||
|
if (imagePath != null) {
|
||||||
|
imagePathIndex = texturePathesCount++;
|
||||||
|
}
|
||||||
|
if (paintPath != null) {
|
||||||
|
paintPathIndex = texturePathesCount++;
|
||||||
|
}
|
||||||
|
if (messagePath != null) {
|
||||||
|
messagePathIndex = texturePathesCount++;
|
||||||
|
}
|
||||||
|
if (backgroundPath != null) {
|
||||||
|
backgroundPathIndex = texturePathesCount++;
|
||||||
|
}
|
||||||
|
paintTexture = new int[texturePathesCount];
|
||||||
GLES20.glGenTextures(paintTexture.length, paintTexture, 0);
|
GLES20.glGenTextures(paintTexture.length, paintTexture, 0);
|
||||||
try {
|
try {
|
||||||
for (int a = 0; a < paintTexture.length; a++) {
|
for (int a = 0; a < paintTexture.length; a++) {
|
||||||
String path;
|
String path;
|
||||||
int angle = 0, invert = 0;
|
int angle = 0, invert = 0;
|
||||||
if (a == 0 && imagePath != null) {
|
if (a == imagePathIndex) {
|
||||||
path = imagePath;
|
path = imagePath;
|
||||||
Pair<Integer, Integer> orientation = AndroidUtilities.getImageOrientation(path);
|
Pair<Integer, Integer> orientation = AndroidUtilities.getImageOrientation(path);
|
||||||
angle = orientation.first;
|
angle = orientation.first;
|
||||||
invert = orientation.second;
|
invert = orientation.second;
|
||||||
} else {
|
} else if (a == paintPathIndex) {
|
||||||
path = paintPath;
|
path = paintPath;
|
||||||
|
} else if (a == backgroundPathIndex) {
|
||||||
|
path = backgroundPath;
|
||||||
|
} else { // messagePathIndex
|
||||||
|
path = messagePath;
|
||||||
}
|
}
|
||||||
Bitmap bitmap = BitmapFactory.decodeFile(path);
|
Bitmap bitmap = BitmapFactory.decodeFile(path);
|
||||||
if (bitmap != null) {
|
if (bitmap != null) {
|
||||||
if (a == 0 && imagePath != null && !useMatrixForImagePath) {
|
if (a == imagePathIndex && !useMatrixForImagePath) {
|
||||||
Bitmap newBitmap = Bitmap.createBitmap(transformedWidth, transformedHeight, Bitmap.Config.ARGB_8888);
|
Bitmap newBitmap = Bitmap.createBitmap(transformedWidth, transformedHeight, Bitmap.Config.ARGB_8888);
|
||||||
newBitmap.eraseColor(0xff000000);
|
newBitmap.eraseColor(0xff000000);
|
||||||
Canvas canvas = new Canvas(newBitmap);
|
Canvas canvas = new Canvas(newBitmap);
|
||||||
|
@ -1045,7 +1171,7 @@ public class TextureRenderer {
|
||||||
bitmap = newBitmap;
|
bitmap = newBitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a == 0 && imagePath != null) {
|
if (a == imagePathIndex) {
|
||||||
imageWidth = bitmap.getWidth();
|
imageWidth = bitmap.getWidth();
|
||||||
imageHeight = bitmap.getHeight();
|
imageHeight = bitmap.getHeight();
|
||||||
}
|
}
|
||||||
|
@ -1062,56 +1188,7 @@ public class TextureRenderer {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (parts != null && !parts.isEmpty()) {
|
if (mediaEntities != null || backgroundDrawable != null) {
|
||||||
partsTexture = new int[parts.size()];
|
|
||||||
partsVerticesBuffer = new FloatBuffer[parts.size()];
|
|
||||||
GLES20.glGenTextures(partsTexture.length, partsTexture, 0);
|
|
||||||
try {
|
|
||||||
for (int a = 0; a < partsTexture.length; a++) {
|
|
||||||
StoryEntry.Part part = parts.get(a);
|
|
||||||
String path = part.file.getAbsolutePath();
|
|
||||||
|
|
||||||
BitmapFactory.Options opts = new BitmapFactory.Options();
|
|
||||||
opts.inJustDecodeBounds = true;
|
|
||||||
BitmapFactory.decodeFile(path, opts);
|
|
||||||
opts.inJustDecodeBounds = false;
|
|
||||||
opts.inSampleSize = StoryEntry.calculateInSampleSize(opts, transformedWidth, transformedHeight);
|
|
||||||
Bitmap bitmap = BitmapFactory.decodeFile(path, opts);
|
|
||||||
GLES20.glBindTexture(GL10.GL_TEXTURE_2D, partsTexture[a]);
|
|
||||||
GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
|
|
||||||
GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
|
|
||||||
GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
|
|
||||||
GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
|
|
||||||
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
|
|
||||||
|
|
||||||
final float[] verticesData = {
|
|
||||||
0, 0,
|
|
||||||
part.width, 0,
|
|
||||||
0, part.height,
|
|
||||||
part.width, part.height
|
|
||||||
};
|
|
||||||
part.matrix.mapPoints(verticesData);
|
|
||||||
for (int i = 0; i < 4; i++) {
|
|
||||||
verticesData[i * 2] = verticesData[i * 2] / transformedWidth * 2f - 1f;
|
|
||||||
verticesData[i * 2 + 1] = 1f - verticesData[i * 2 + 1] / transformedHeight * 2f;
|
|
||||||
}
|
|
||||||
partsVerticesBuffer[a] = ByteBuffer.allocateDirect(verticesData.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
||||||
partsVerticesBuffer[a].put(verticesData).position(0);
|
|
||||||
}
|
|
||||||
} catch (Throwable e2) {
|
|
||||||
FileLog.e(e2);
|
|
||||||
}
|
|
||||||
|
|
||||||
final float[] textureData = {
|
|
||||||
0, 0,
|
|
||||||
1f, 0,
|
|
||||||
0, 1f,
|
|
||||||
1f, 1f
|
|
||||||
};
|
|
||||||
partsTextureBuffer = ByteBuffer.allocateDirect(textureData.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
|
|
||||||
partsTextureBuffer.put(textureData).position(0);
|
|
||||||
}
|
|
||||||
if (mediaEntities != null) {
|
|
||||||
try {
|
try {
|
||||||
stickerBitmap = Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888);
|
stickerBitmap = Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888);
|
||||||
stickerTexture = new int[1];
|
stickerTexture = new int[1];
|
||||||
|
@ -1335,17 +1412,21 @@ public class TextureRenderer {
|
||||||
entity.firstSeek = true;
|
entity.firstSeek = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
String path = entity.text;
|
||||||
|
if (!TextUtils.isEmpty(entity.segmentedPath) && (entity.subType & 16) != 0) {
|
||||||
|
path = entity.segmentedPath;
|
||||||
|
}
|
||||||
if (Build.VERSION.SDK_INT >= 19) {
|
if (Build.VERSION.SDK_INT >= 19) {
|
||||||
BitmapFactory.Options opts = new BitmapFactory.Options();
|
BitmapFactory.Options opts = new BitmapFactory.Options();
|
||||||
if (entity.type == VideoEditedInfo.MediaEntity.TYPE_PHOTO) {
|
if (entity.type == VideoEditedInfo.MediaEntity.TYPE_PHOTO) {
|
||||||
opts.inMutable = true;
|
opts.inMutable = true;
|
||||||
}
|
}
|
||||||
entity.bitmap = BitmapFactory.decodeFile(entity.text, opts);
|
entity.bitmap = BitmapFactory.decodeFile(path, opts);
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
File path = new File(entity.text);
|
File filePath = new File(path);
|
||||||
RandomAccessFile file = new RandomAccessFile(path, "r");
|
RandomAccessFile file = new RandomAccessFile(filePath, "r");
|
||||||
ByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, path.length());
|
ByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, filePath.length());
|
||||||
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
|
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
|
||||||
bmOptions.inJustDecodeBounds = true;
|
bmOptions.inJustDecodeBounds = true;
|
||||||
Utilities.loadWebpImage(null, buffer, buffer.limit(), bmOptions, true);
|
Utilities.loadWebpImage(null, buffer, buffer.limit(), bmOptions, true);
|
||||||
|
@ -1461,8 +1542,14 @@ public class TextureRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void changeFragmentShader(String fragmentExternalShader, String fragmentShader, boolean is300) {
|
public void changeFragmentShader(String fragmentExternalShader, String fragmentShader, boolean is300) {
|
||||||
|
String vertexCode;
|
||||||
|
if (messageVideoMaskPath != null) {
|
||||||
|
vertexCode = is300 ? VERTEX_SHADER_MASK_300 : VERTEX_SHADER_MASK;
|
||||||
|
} else {
|
||||||
|
vertexCode = is300 ? VERTEX_SHADER_300 : VERTEX_SHADER;
|
||||||
|
}
|
||||||
if (NUM_EXTERNAL_SHADER >= 0 && NUM_EXTERNAL_SHADER < mProgram.length) {
|
if (NUM_EXTERNAL_SHADER >= 0 && NUM_EXTERNAL_SHADER < mProgram.length) {
|
||||||
int newProgram = createProgram(is300 ? VERTEX_SHADER_300 : VERTEX_SHADER, fragmentExternalShader, is300);
|
int newProgram = createProgram(vertexCode, fragmentExternalShader, is300);
|
||||||
if (newProgram != 0) {
|
if (newProgram != 0) {
|
||||||
GLES20.glDeleteProgram(mProgram[NUM_EXTERNAL_SHADER]);
|
GLES20.glDeleteProgram(mProgram[NUM_EXTERNAL_SHADER]);
|
||||||
mProgram[NUM_EXTERNAL_SHADER] = newProgram;
|
mProgram[NUM_EXTERNAL_SHADER] = newProgram;
|
||||||
|
@ -1471,7 +1558,7 @@ public class TextureRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (NUM_FILTER_SHADER >= 0 && NUM_FILTER_SHADER < mProgram.length) {
|
if (NUM_FILTER_SHADER >= 0 && NUM_FILTER_SHADER < mProgram.length) {
|
||||||
int newProgram = createProgram(is300 ? VERTEX_SHADER_300 : VERTEX_SHADER, fragmentShader, is300);
|
int newProgram = createProgram(vertexCode, fragmentShader, is300);
|
||||||
if (newProgram != 0) {
|
if (newProgram != 0) {
|
||||||
GLES20.glDeleteProgram(mProgram[NUM_FILTER_SHADER]);
|
GLES20.glDeleteProgram(mProgram[NUM_FILTER_SHADER]);
|
||||||
mProgram[NUM_FILTER_SHADER] = newProgram;
|
mProgram[NUM_FILTER_SHADER] = newProgram;
|
||||||
|
|
|
@ -77,8 +77,8 @@ import android.telephony.TelephonyManager;
|
||||||
import android.text.SpannableString;
|
import android.text.SpannableString;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.style.ForegroundColorSpan;
|
import android.text.style.ForegroundColorSpan;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.LruCache;
|
import android.util.LruCache;
|
||||||
|
import android.view.HapticFeedbackConstants;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
@ -236,6 +236,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
private BluetoothAdapter btAdapter;
|
private BluetoothAdapter btAdapter;
|
||||||
private Instance.TrafficStats prevTrafficStats;
|
private Instance.TrafficStats prevTrafficStats;
|
||||||
private boolean isBtHeadsetConnected;
|
private boolean isBtHeadsetConnected;
|
||||||
|
private volatile boolean isCallEnded;
|
||||||
|
|
||||||
private Runnable updateNotificationRunnable;
|
private Runnable updateNotificationRunnable;
|
||||||
|
|
||||||
|
@ -1115,6 +1116,10 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
tgVoip[CAPTURE_DEVICE_CAMERA].switchCamera(!isFrontFaceCamera);
|
tgVoip[CAPTURE_DEVICE_CAMERA].switchCamera(!isFrontFaceCamera);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isSwitchingCamera() {
|
||||||
|
return switchingCamera;
|
||||||
|
}
|
||||||
|
|
||||||
public void createCaptureDevice(boolean screencast) {
|
public void createCaptureDevice(boolean screencast) {
|
||||||
int index = screencast ? CAPTURE_DEVICE_SCREEN : CAPTURE_DEVICE_CAMERA;
|
int index = screencast ? CAPTURE_DEVICE_SCREEN : CAPTURE_DEVICE_CAMERA;
|
||||||
int deviceType;
|
int deviceType;
|
||||||
|
@ -1598,6 +1603,10 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendCallRating(int rating) {
|
||||||
|
VoIPHelper.sendCallRating(privateCall.id, privateCall.access_hash, currentAccount, rating);
|
||||||
|
}
|
||||||
|
|
||||||
public byte[] getEncryptionKey() {
|
public byte[] getEncryptionKey() {
|
||||||
return authKey;
|
return authKey;
|
||||||
}
|
}
|
||||||
|
@ -2711,16 +2720,38 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
}
|
}
|
||||||
|
|
||||||
public void toggleSpeakerphoneOrShowRouteSheet(Context context, boolean fromOverlayWindow) {
|
public void toggleSpeakerphoneOrShowRouteSheet(Context context, boolean fromOverlayWindow) {
|
||||||
|
toggleSpeakerphoneOrShowRouteSheet(context, fromOverlayWindow, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void switchToSpeaker() {
|
||||||
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
VoipAudioManager vam = VoipAudioManager.get();
|
||||||
|
if ((isBluetoothHeadsetConnected() && hasEarpiece()) || isHeadsetPlugged || isSpeakerphoneOn()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
vam.setSpeakerphoneOn(true);
|
||||||
|
vam.isBluetoothAndSpeakerOnAsync((isBluetoothOn, isSpeakerOn) -> {
|
||||||
|
updateOutputGainControlState();
|
||||||
|
for (StateListener l : stateListeners) {
|
||||||
|
l.onAudioSettingsChanged();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void toggleSpeakerphoneOrShowRouteSheet(Context context, boolean fromOverlayWindow, Integer selectedPos) {
|
||||||
if (isBluetoothHeadsetConnected() && hasEarpiece()) {
|
if (isBluetoothHeadsetConnected() && hasEarpiece()) {
|
||||||
BottomSheet.Builder builder = new BottomSheet.Builder(context)
|
BottomSheet.Builder builder = new BottomSheet.Builder(context)
|
||||||
.setTitle(LocaleController.getString("VoipOutputDevices", R.string.VoipOutputDevices), true)
|
.setTitle(LocaleController.getString("VoipOutputDevices", R.string.VoipOutputDevices), true)
|
||||||
|
.selectedPos(selectedPos)
|
||||||
|
.setCellType(selectedPos != null ? BottomSheet.Builder.CELL_TYPE_CALL : 0)
|
||||||
.setItems(new CharSequence[]{
|
.setItems(new CharSequence[]{
|
||||||
LocaleController.getString("VoipAudioRoutingSpeaker", R.string.VoipAudioRoutingSpeaker),
|
LocaleController.getString("VoipAudioRoutingSpeaker", R.string.VoipAudioRoutingSpeaker),
|
||||||
isHeadsetPlugged ? LocaleController.getString("VoipAudioRoutingHeadset", R.string.VoipAudioRoutingHeadset) : LocaleController.getString("VoipAudioRoutingEarpiece", R.string.VoipAudioRoutingEarpiece),
|
isHeadsetPlugged ? LocaleController.getString("VoipAudioRoutingHeadset", R.string.VoipAudioRoutingHeadset) : LocaleController.getString("VoipAudioRoutingEarpiece", R.string.VoipAudioRoutingEarpiece),
|
||||||
currentBluetoothDeviceName != null ? currentBluetoothDeviceName : LocaleController.getString("VoipAudioRoutingBluetooth", R.string.VoipAudioRoutingBluetooth)},
|
currentBluetoothDeviceName != null ? currentBluetoothDeviceName : LocaleController.getString("VoipAudioRoutingBluetooth", R.string.VoipAudioRoutingBluetooth)},
|
||||||
new int[]{R.drawable.calls_menu_speaker,
|
new int[]{R.drawable.msg_call_speaker,
|
||||||
isHeadsetPlugged ? R.drawable.calls_menu_headset : R.drawable.calls_menu_phone,
|
isHeadsetPlugged ? R.drawable.calls_menu_headset : R.drawable.msg_call_earpiece,
|
||||||
R.drawable.calls_menu_bluetooth}, (dialog, which) -> {
|
R.drawable.msg_call_bluetooth}, (dialog, which) -> {
|
||||||
if (getSharedInstance() == null) {
|
if (getSharedInstance() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2728,6 +2759,15 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
});
|
});
|
||||||
|
|
||||||
BottomSheet bottomSheet = builder.create();
|
BottomSheet bottomSheet = builder.create();
|
||||||
|
bottomSheet.setOnShowListener(dialog -> {
|
||||||
|
for (int i = 0; i < bottomSheet.getItemViews().size(); i++) {
|
||||||
|
bottomSheet.setItemColor(i, Theme.getColor(Theme.key_dialogTextBlack), Theme.getColor(Theme.key_dialogTextBlack));
|
||||||
|
}
|
||||||
|
if (selectedPos != null) {
|
||||||
|
int selectedColor = Theme.getColor(Theme.key_dialogTextLink);
|
||||||
|
bottomSheet.setItemColor(selectedPos, selectedColor, selectedColor);
|
||||||
|
}
|
||||||
|
});
|
||||||
if (fromOverlayWindow) {
|
if (fromOverlayWindow) {
|
||||||
if (Build.VERSION.SDK_INT >= 26) {
|
if (Build.VERSION.SDK_INT >= 26) {
|
||||||
bottomSheet.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
|
bottomSheet.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
|
||||||
|
@ -2752,7 +2792,13 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
} else {
|
} else {
|
||||||
am.setBluetoothScoOn(!am.isBluetoothScoOn());
|
am.setBluetoothScoOn(!am.isBluetoothScoOn());
|
||||||
}
|
}
|
||||||
|
vam.isBluetoothAndSpeakerOnAsync((isBluetoothOn, isSpeakerOn) -> {
|
||||||
updateOutputGainControlState();
|
updateOutputGainControlState();
|
||||||
|
for (StateListener l : stateListeners) {
|
||||||
|
l.onAudioSettingsChanged();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
speakerphoneStateToSet = !speakerphoneStateToSet;
|
speakerphoneStateToSet = !speakerphoneStateToSet;
|
||||||
}
|
}
|
||||||
|
@ -3482,6 +3528,10 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasRate() {
|
||||||
|
return needRateCall || forceRating;
|
||||||
|
}
|
||||||
|
|
||||||
private void onTgVoipStop(Instance.FinalState finalState) {
|
private void onTgVoipStop(Instance.FinalState finalState) {
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -3493,11 +3543,6 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needRateCall || forceRating || finalState.isRatingSuggested) {
|
|
||||||
startRatingActivity();
|
|
||||||
needRateCall = false;
|
|
||||||
}
|
|
||||||
if (needSendDebugLog && finalState.debugLog != null) {
|
if (needSendDebugLog && finalState.debugLog != null) {
|
||||||
TLRPC.TL_phone_saveCallDebug req = new TLRPC.TL_phone_saveCallDebug();
|
TLRPC.TL_phone_saveCallDebug req = new TLRPC.TL_phone_saveCallDebug();
|
||||||
req.debug = new TLRPC.TL_dataJSON();
|
req.debug = new TLRPC.TL_dataJSON();
|
||||||
|
@ -3753,6 +3798,10 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
} else {
|
} else {
|
||||||
audioRouteToSet = AUDIO_ROUTE_EARPIECE;
|
audioRouteToSet = AUDIO_ROUTE_EARPIECE;
|
||||||
}
|
}
|
||||||
|
if (lastSensorEvent != null) {
|
||||||
|
//For the case when the phone was put to the ear before configureDeviceForCall.
|
||||||
|
onSensorChanged(lastSensorEvent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
updateOutputGainControlState();
|
updateOutputGainControlState();
|
||||||
audioConfigured = true;
|
audioConfigured = true;
|
||||||
|
@ -3787,9 +3836,12 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private SensorEvent lastSensorEvent;
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@Override
|
@Override
|
||||||
public void onSensorChanged(SensorEvent event) {
|
public void onSensorChanged(SensorEvent event) {
|
||||||
|
lastSensorEvent = event;
|
||||||
if (unmutedByHold || remoteVideoState == Instance.VIDEO_STATE_ACTIVE || videoState[CAPTURE_DEVICE_CAMERA] == Instance.VIDEO_STATE_ACTIVE) {
|
if (unmutedByHold || remoteVideoState == Instance.VIDEO_STATE_ACTIVE || videoState[CAPTURE_DEVICE_CAMERA] == Instance.VIDEO_STATE_ACTIVE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3801,6 +3853,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
}
|
}
|
||||||
boolean newIsNear = event.values[0] < Math.min(event.sensor.getMaximumRange(), 3);
|
boolean newIsNear = event.values[0] < Math.min(event.sensor.getMaximumRange(), 3);
|
||||||
checkIsNear(newIsNear);
|
checkIsNear(newIsNear);
|
||||||
|
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.nearEarEvent, newIsNear);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4255,9 +4308,9 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
if (groupCall == null && !wasEstablished) {
|
if (groupCall == null && !wasEstablished) {
|
||||||
wasEstablished = true;
|
wasEstablished = true;
|
||||||
if (!isProximityNear && !privateCall.video) {
|
if (!isProximityNear && !privateCall.video) {
|
||||||
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
|
try {
|
||||||
if (vibrator.hasVibrator()) {
|
LaunchActivity.getLastFragment().getFragmentView().performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
|
||||||
vibrator.vibrate(100);
|
} catch (Exception ignore) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||||
|
@ -4276,7 +4329,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (newState == STATE_RECONNECTING) {
|
if (newState == STATE_RECONNECTING && !isCallEnded) {
|
||||||
Utilities.globalQueue.postRunnable(() -> {
|
Utilities.globalQueue.postRunnable(() -> {
|
||||||
if (spPlayId != 0) {
|
if (spPlayId != 0) {
|
||||||
soundPool.stop(spPlayId);
|
soundPool.stop(spPlayId);
|
||||||
|
@ -4324,6 +4377,7 @@ public class VoIPService extends Service implements SensorEventListener, AudioMa
|
||||||
if (BuildVars.LOGS_ENABLED) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
FileLog.d("Call " + getCallID() + " ended");
|
FileLog.d("Call " + getCallID() + " ended");
|
||||||
}
|
}
|
||||||
|
isCallEnded = true;
|
||||||
if (groupCall != null && (!playedConnectedSound || onDestroyRunnable != null)) {
|
if (groupCall != null && (!playedConnectedSound || onDestroyRunnable != null)) {
|
||||||
needPlayEndSound = false;
|
needPlayEndSound = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@ import static android.content.Context.AUDIO_SERVICE;
|
||||||
|
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
|
|
||||||
|
|
||||||
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
import org.telegram.messenger.ApplicationLoader;
|
import org.telegram.messenger.ApplicationLoader;
|
||||||
import org.telegram.messenger.Utilities;
|
import org.telegram.messenger.Utilities;
|
||||||
|
|
||||||
|
@ -47,6 +49,15 @@ public class VoipAudioManager {
|
||||||
return isSpeakerphoneOn;
|
return isSpeakerphoneOn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void isBluetoothAndSpeakerOnAsync(Utilities.Callback2<Boolean, Boolean> onDone) {
|
||||||
|
Utilities.globalQueue.postRunnable(() -> {
|
||||||
|
AudioManager audioManager = getAudioManager();
|
||||||
|
boolean isBluetoothScoOn = audioManager.isBluetoothScoOn();
|
||||||
|
boolean isSpeakerphoneOn = audioManager.isSpeakerphoneOn();
|
||||||
|
AndroidUtilities.runOnUIThread(() -> onDone.run(isBluetoothScoOn, isSpeakerphoneOn));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private AudioManager getAudioManager() {
|
private AudioManager getAudioManager() {
|
||||||
return (AudioManager) ApplicationLoader.applicationContext.getSystemService(AUDIO_SERVICE);
|
return (AudioManager) ApplicationLoader.applicationContext.getSystemService(AUDIO_SERVICE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,7 +245,7 @@ public class ConnectionsManager extends BaseController {
|
||||||
if (getUserConfig().getCurrentUser() != null) {
|
if (getUserConfig().getCurrentUser() != null) {
|
||||||
userPremium = getUserConfig().getCurrentUser().premium;
|
userPremium = getUserConfig().getCurrentUser().premium;
|
||||||
}
|
}
|
||||||
init(BuildVars.BUILD_VERSION, TLRPC.LAYER, BuildVars.APP_ID, deviceModel, systemVersion, appVersion, langCode, systemLangCode, configPath, FileLog.getNetworkLogPath(), pushString, fingerprint, timezoneOffset, getUserConfig().getClientUserId(), userPremium, enablePushConnection);
|
init(SharedConfig.buildVersion(), TLRPC.LAYER, BuildVars.APP_ID, deviceModel, systemVersion, appVersion, langCode, systemLangCode, configPath, FileLog.getNetworkLogPath(), pushString, fingerprint, timezoneOffset, getUserConfig().getClientUserId(), userPremium, enablePushConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getRegId() {
|
private String getRegId() {
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,5 +1,6 @@
|
||||||
package org.telegram.tgnet.tl;
|
package org.telegram.tgnet.tl;
|
||||||
|
|
||||||
|
import org.telegram.messenger.DialogObject;
|
||||||
import org.telegram.tgnet.AbstractSerializedData;
|
import org.telegram.tgnet.AbstractSerializedData;
|
||||||
import org.telegram.tgnet.TLObject;
|
import org.telegram.tgnet.TLObject;
|
||||||
import org.telegram.tgnet.TLRPC;
|
import org.telegram.tgnet.TLRPC;
|
||||||
|
@ -78,8 +79,7 @@ public class TL_stories {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TL_storyView extends TLObject {
|
public static class StoryView extends TLObject {
|
||||||
public static final int constructor = 0xb0bdeac5;
|
|
||||||
|
|
||||||
public int flags;
|
public int flags;
|
||||||
public boolean blocked;
|
public boolean blocked;
|
||||||
|
@ -87,19 +87,35 @@ public class TL_stories {
|
||||||
public long user_id;
|
public long user_id;
|
||||||
public int date;
|
public int date;
|
||||||
public TLRPC.Reaction reaction;
|
public TLRPC.Reaction reaction;
|
||||||
|
public TLRPC.Message message;
|
||||||
|
public TLRPC.Peer peer_id;
|
||||||
|
public StoryItem story;
|
||||||
|
|
||||||
public static TL_storyView TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
|
public static StoryView TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
|
||||||
if (TL_storyView.constructor != constructor) {
|
StoryView result = null;
|
||||||
if (exception) {
|
switch (constructor) {
|
||||||
throw new RuntimeException(String.format("can't parse magic %x in TL_storyView", constructor));
|
case TL_storyView.constructor:
|
||||||
} else {
|
result = new TL_storyView();
|
||||||
return null;
|
break;
|
||||||
|
case TL_storyViewPublicForward.constructor:
|
||||||
|
result = new TL_storyViewPublicForward();
|
||||||
|
break;
|
||||||
|
case TL_storyViewPublicRepost.constructor:
|
||||||
|
result = new TL_storyViewPublicRepost();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
if (result == null && exception) {
|
||||||
|
throw new RuntimeException(String.format("can't parse magic %x in StoryView", constructor));
|
||||||
}
|
}
|
||||||
TL_storyView result = new TL_storyView();
|
if (result != null) {
|
||||||
result.readParams(stream, exception);
|
result.readParams(stream, exception);
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TL_storyView extends StoryView {
|
||||||
|
public static final int constructor = 0xb0bdeac5;
|
||||||
|
|
||||||
public void readParams(AbstractSerializedData stream, boolean exception) {
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
flags = stream.readInt32(exception);
|
flags = stream.readInt32(exception);
|
||||||
|
@ -125,6 +141,46 @@ public class TL_stories {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class TL_storyViewPublicForward extends StoryView {
|
||||||
|
public static final int constructor = 0x9083670b;
|
||||||
|
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
flags = stream.readInt32(exception);
|
||||||
|
blocked = (flags & 1) != 0;
|
||||||
|
blocked_my_stories_from = (flags & 2) != 0;
|
||||||
|
message = TLRPC.Message.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
flags = blocked ? (flags | 1) : (flags &~ 1);
|
||||||
|
flags = blocked_my_stories_from ? (flags | 2) : (flags &~ 2);
|
||||||
|
stream.writeInt32(flags);
|
||||||
|
message.serializeToStream(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TL_storyViewPublicRepost extends StoryView {
|
||||||
|
public static final int constructor = 0xbd74cf49;
|
||||||
|
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
flags = stream.readInt32(exception);
|
||||||
|
blocked = (flags & 1) != 0;
|
||||||
|
blocked_my_stories_from = (flags & 2) != 0;
|
||||||
|
peer_id = TLRPC.Peer.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
story = StoryItem.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
flags = blocked ? (flags | 1) : (flags &~ 1);
|
||||||
|
flags = blocked_my_stories_from ? (flags | 2) : (flags &~ 2);
|
||||||
|
stream.writeInt32(flags);
|
||||||
|
peer_id.serializeToStream(stream);
|
||||||
|
story.serializeToStream(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static abstract class PeerStories extends TLObject {
|
public static abstract class PeerStories extends TLObject {
|
||||||
|
|
||||||
public int flags;
|
public int flags;
|
||||||
|
@ -862,28 +918,131 @@ public class TL_stories {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TL_stories_storyViewsList extends TLObject {
|
public static class StoryViewsList extends TLObject {
|
||||||
public static final int constructor = 0x46e9b9ec;
|
|
||||||
|
|
||||||
public int flags;
|
public int flags;
|
||||||
public int count;
|
public int count;
|
||||||
|
public int views_count;
|
||||||
|
public int forwards_count;
|
||||||
public int reactions_count;
|
public int reactions_count;
|
||||||
public ArrayList<TL_storyView> views = new ArrayList<>();
|
public ArrayList<StoryView> views = new ArrayList<>();
|
||||||
|
public ArrayList<TLRPC.Chat> chats = new ArrayList<>();
|
||||||
public ArrayList<TLRPC.User> users = new ArrayList<>();
|
public ArrayList<TLRPC.User> users = new ArrayList<>();
|
||||||
public String next_offset = "";
|
public String next_offset = "";
|
||||||
|
|
||||||
public static TL_stories_storyViewsList TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
|
public static StoryViewsList TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
|
||||||
if (TL_stories_storyViewsList.constructor != constructor) {
|
StoryViewsList result = null;
|
||||||
if (exception) {
|
switch (constructor) {
|
||||||
throw new RuntimeException(String.format("can't parse magic %x in TL_stories_storyViewsList", constructor));
|
case TL_storyViewsList.constructor:
|
||||||
} else {
|
result = new TL_storyViewsList();
|
||||||
return null;
|
break;
|
||||||
|
case TL_storyViewsList_layer167.constructor:
|
||||||
|
result = new TL_storyViewsList_layer167();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
if (result == null && exception) {
|
||||||
|
throw new RuntimeException(String.format("can't parse magic %x in StoryViewsList", constructor));
|
||||||
}
|
}
|
||||||
TL_stories_storyViewsList result = new TL_stories_storyViewsList();
|
if (result != null) {
|
||||||
result.readParams(stream, exception);
|
result.readParams(stream, exception);
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TL_storyViewsList extends StoryViewsList {
|
||||||
|
public static final int constructor = 0x59d78fc5;
|
||||||
|
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
flags = stream.readInt32(exception);
|
||||||
|
count = stream.readInt32(exception);
|
||||||
|
views_count = stream.readInt32(exception);
|
||||||
|
forwards_count = stream.readInt32(exception);
|
||||||
|
reactions_count = stream.readInt32(exception);
|
||||||
|
int magic = stream.readInt32(exception);
|
||||||
|
if (magic != 0x1cb5c415) {
|
||||||
|
if (exception) {
|
||||||
|
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int count = stream.readInt32(exception);
|
||||||
|
for (int a = 0; a < count; a++) {
|
||||||
|
StoryView object = StoryView.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
if (object == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
views.add(object);
|
||||||
|
}
|
||||||
|
magic = stream.readInt32(exception);
|
||||||
|
if (magic != 0x1cb5c415) {
|
||||||
|
if (exception) {
|
||||||
|
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
count = stream.readInt32(exception);
|
||||||
|
for (int a = 0; a < count; a++) {
|
||||||
|
TLRPC.Chat object = TLRPC.Chat.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
if (object == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chats.add(object);
|
||||||
|
}
|
||||||
|
magic = stream.readInt32(exception);
|
||||||
|
if (magic != 0x1cb5c415) {
|
||||||
|
if (exception) {
|
||||||
|
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
count = stream.readInt32(exception);
|
||||||
|
for (int a = 0; a < count; a++) {
|
||||||
|
TLRPC.User object = TLRPC.User.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
if (object == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
users.add(object);
|
||||||
|
}
|
||||||
|
if ((flags & 1) != 0) {
|
||||||
|
next_offset = stream.readString(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
stream.writeInt32(flags);
|
||||||
|
stream.writeInt32(count);
|
||||||
|
stream.writeInt32(views_count);
|
||||||
|
stream.writeInt32(forwards_count);
|
||||||
|
stream.writeInt32(reactions_count);
|
||||||
|
stream.writeInt32(0x1cb5c415);
|
||||||
|
int count = views.size();
|
||||||
|
stream.writeInt32(count);
|
||||||
|
for (int a = 0; a < count; a++) {
|
||||||
|
views.get(a).serializeToStream(stream);
|
||||||
|
}
|
||||||
|
stream.writeInt32(0x1cb5c415);
|
||||||
|
count = chats.size();
|
||||||
|
stream.writeInt32(count);
|
||||||
|
for (int a = 0; a < count; a++) {
|
||||||
|
chats.get(a).serializeToStream(stream);
|
||||||
|
}
|
||||||
|
stream.writeInt32(0x1cb5c415);
|
||||||
|
count = users.size();
|
||||||
|
stream.writeInt32(count);
|
||||||
|
for (int a = 0; a < count; a++) {
|
||||||
|
users.get(a).serializeToStream(stream);
|
||||||
|
}
|
||||||
|
if ((flags & 1) != 0) {
|
||||||
|
stream.writeString(next_offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static class TL_storyViewsList_layer167 extends StoryViewsList {
|
||||||
|
public static final int constructor = 0x46e9b9ec;
|
||||||
|
|
||||||
public void readParams(AbstractSerializedData stream, boolean exception) {
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
flags = stream.readInt32(exception);
|
flags = stream.readInt32(exception);
|
||||||
|
@ -898,7 +1057,7 @@ public class TL_stories {
|
||||||
}
|
}
|
||||||
int count = stream.readInt32(exception);
|
int count = stream.readInt32(exception);
|
||||||
for (int a = 0; a < count; a++) {
|
for (int a = 0; a < count; a++) {
|
||||||
TL_storyView object = TL_storyView.TLdeserialize(stream, stream.readInt32(exception), exception);
|
StoryView object = StoryView.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
if (object == null) {
|
if (object == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -975,6 +1134,7 @@ public class TL_stories {
|
||||||
public int flags;
|
public int flags;
|
||||||
public boolean just_contacts;
|
public boolean just_contacts;
|
||||||
public boolean reactions_first;
|
public boolean reactions_first;
|
||||||
|
public boolean forwards_first;
|
||||||
public TLRPC.InputPeer peer;
|
public TLRPC.InputPeer peer;
|
||||||
public String q;
|
public String q;
|
||||||
public int id;
|
public int id;
|
||||||
|
@ -982,13 +1142,14 @@ public class TL_stories {
|
||||||
public int limit;
|
public int limit;
|
||||||
|
|
||||||
public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) {
|
public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) {
|
||||||
return TL_stories_storyViewsList.TLdeserialize(stream, constructor, exception);
|
return StoryViewsList.TLdeserialize(stream, constructor, exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void serializeToStream(AbstractSerializedData stream) {
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
stream.writeInt32(constructor);
|
stream.writeInt32(constructor);
|
||||||
flags = just_contacts ? (flags | 1) : (flags &~ 1);
|
flags = just_contacts ? (flags | 1) : (flags &~ 1);
|
||||||
flags = reactions_first ? (flags | 4) : (flags &~ 4);
|
flags = reactions_first ? (flags | 4) : (flags &~ 4);
|
||||||
|
flags = forwards_first ? (flags | 8) : (flags &~ 8);
|
||||||
stream.writeInt32(flags);
|
stream.writeInt32(flags);
|
||||||
peer.serializeToStream(stream);
|
peer.serializeToStream(stream);
|
||||||
if ((flags & 2) != 0) {
|
if ((flags & 2) != 0) {
|
||||||
|
@ -2543,9 +2704,15 @@ public class TL_stories {
|
||||||
case TL_inputMediaAreaVenue.constructor:
|
case TL_inputMediaAreaVenue.constructor:
|
||||||
result = new TL_inputMediaAreaVenue();
|
result = new TL_inputMediaAreaVenue();
|
||||||
break;
|
break;
|
||||||
|
case TL_inputMediaAreaChannelPost.constructor:
|
||||||
|
result = new TL_inputMediaAreaChannelPost();
|
||||||
|
break;
|
||||||
case TL_mediaAreaSuggestedReaction.constructor:
|
case TL_mediaAreaSuggestedReaction.constructor:
|
||||||
result = new TL_mediaAreaSuggestedReaction();
|
result = new TL_mediaAreaSuggestedReaction();
|
||||||
break;
|
break;
|
||||||
|
case TL_mediaAreaChannelPost.constructor:
|
||||||
|
result = new TL_mediaAreaChannelPost();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (result == null && exception) {
|
if (result == null && exception) {
|
||||||
throw new RuntimeException(String.format("can't parse magic %x in MediaArea", constructor));
|
throw new RuntimeException(String.format("can't parse magic %x in MediaArea", constructor));
|
||||||
|
@ -2578,6 +2745,26 @@ public class TL_stories {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class TL_mediaAreaChannelPost extends MediaArea {
|
||||||
|
public static final int constructor = 0x770416af;
|
||||||
|
|
||||||
|
public long channel_id;
|
||||||
|
public int msg_id;
|
||||||
|
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
coordinates = TL_mediaAreaCoordinates.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
channel_id = stream.readInt64(exception);
|
||||||
|
msg_id = stream.readInt32(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
coordinates.serializeToStream(stream);
|
||||||
|
stream.writeInt64(channel_id);
|
||||||
|
stream.writeInt32(msg_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class TL_mediaAreaVenue extends MediaArea {
|
public static class TL_mediaAreaVenue extends MediaArea {
|
||||||
public static final int constructor = 0xbe82db9c;
|
public static final int constructor = 0xbe82db9c;
|
||||||
|
|
||||||
|
@ -2634,6 +2821,28 @@ public class TL_stories {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class TL_inputMediaAreaChannelPost extends MediaArea {
|
||||||
|
public static final int constructor = 0x2271f2bf;
|
||||||
|
|
||||||
|
public TLRPC.InputChannel channel;
|
||||||
|
public int msg_id;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
coordinates = TL_mediaAreaCoordinates.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
channel = TLRPC.InputChannel.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
msg_id = stream.readInt32(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
coordinates.serializeToStream(stream);
|
||||||
|
channel.serializeToStream(stream);
|
||||||
|
stream.writeInt32(msg_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class TL_mediaAreaGeoPoint extends MediaArea {
|
public static class TL_mediaAreaGeoPoint extends MediaArea {
|
||||||
public static final int constructor = 0xdf8b3b22;
|
public static final int constructor = 0xdf8b3b22;
|
||||||
|
|
||||||
|
@ -2741,4 +2950,229 @@ public class TL_stories {
|
||||||
stream.writeInt32(id);
|
stream.writeInt32(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class StoryReaction extends TLObject {
|
||||||
|
|
||||||
|
public TLRPC.Peer peer_id;
|
||||||
|
public StoryItem story;
|
||||||
|
public TLRPC.Message message;
|
||||||
|
|
||||||
|
public static StoryReaction TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
|
||||||
|
StoryReaction result = null;
|
||||||
|
switch (constructor) {
|
||||||
|
case TL_storyReaction.constructor:
|
||||||
|
result = new TL_storyReaction();
|
||||||
|
break;
|
||||||
|
case TL_storyReactionPublicForward.constructor:
|
||||||
|
result = new TL_storyReactionPublicForward();
|
||||||
|
break;
|
||||||
|
case TL_storyReactionPublicRepost.constructor:
|
||||||
|
result = new TL_storyReactionPublicRepost();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (result == null && exception) {
|
||||||
|
throw new RuntimeException(String.format("can't parse magic %x in StoryReaction", constructor));
|
||||||
|
}
|
||||||
|
if (result != null) {
|
||||||
|
result.readParams(stream, exception);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TL_storyReactionPublicForward extends StoryReaction {
|
||||||
|
public final static int constructor = 0xbbab2643;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
message = TLRPC.Message.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
message.serializeToStream(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TL_storyReactionPublicRepost extends StoryReaction {
|
||||||
|
public final static int constructor = 0xcfcd0f13;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
peer_id = TLRPC.Peer.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
story = StoryItem.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
if (story != null) {
|
||||||
|
story.dialogId = DialogObject.getPeerDialogId(peer_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
peer_id.serializeToStream(stream);
|
||||||
|
story.serializeToStream(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TL_storyReaction extends StoryReaction {
|
||||||
|
public final static int constructor = 0x6090d6d5;
|
||||||
|
|
||||||
|
public int date;
|
||||||
|
public TLRPC.Reaction reaction;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
peer_id = TLRPC.Peer.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
date = stream.readInt32(exception);
|
||||||
|
reaction = TLRPC.Reaction.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
peer_id.serializeToStream(stream);
|
||||||
|
stream.writeInt32(date);
|
||||||
|
reaction.serializeToStream(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TL_storyReactionsList extends TLObject {
|
||||||
|
public final static int constructor = 0xaa5f789c;
|
||||||
|
|
||||||
|
public int flags;
|
||||||
|
public int count;
|
||||||
|
public ArrayList<StoryReaction> reactions = new ArrayList<>();
|
||||||
|
public ArrayList<TLRPC.Chat> chats = new ArrayList<>();
|
||||||
|
public ArrayList<TLRPC.User> users = new ArrayList<>();
|
||||||
|
public String next_offset;
|
||||||
|
|
||||||
|
public static TL_storyReactionsList TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
|
||||||
|
if (TL_storyReactionsList.constructor != constructor) {
|
||||||
|
if (exception) {
|
||||||
|
throw new RuntimeException(String.format("can't parse magic %x in TL_storyReactionsList", constructor));
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TL_storyReactionsList result = new TL_storyReactionsList();
|
||||||
|
result.readParams(stream, exception);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
stream.writeInt32(flags);
|
||||||
|
stream.writeInt32(count);
|
||||||
|
stream.writeInt32(0x1cb5c415);
|
||||||
|
int count = reactions.size();
|
||||||
|
stream.writeInt32(count);
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
reactions.get(i).serializeToStream(stream);
|
||||||
|
}
|
||||||
|
stream.writeInt32(0x1cb5c415);
|
||||||
|
count = chats.size();
|
||||||
|
stream.writeInt32(count);
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
chats.get(i).serializeToStream(stream);
|
||||||
|
}
|
||||||
|
stream.writeInt32(0x1cb5c415);
|
||||||
|
count = users.size();
|
||||||
|
stream.writeInt32(count);
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
users.get(i).serializeToStream(stream);
|
||||||
|
}
|
||||||
|
if ((flags & 1) != 0) {
|
||||||
|
stream.writeString(next_offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readParams(AbstractSerializedData stream, boolean exception) {
|
||||||
|
flags = stream.readInt32(exception);
|
||||||
|
count = stream.readInt32(exception);
|
||||||
|
int magic = stream.readInt32(exception);
|
||||||
|
if (magic != 0x1cb5c415) {
|
||||||
|
if (exception) {
|
||||||
|
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int count = stream.readInt32(exception);
|
||||||
|
for (int a = 0; a < count; a++) {
|
||||||
|
StoryReaction object = StoryReaction.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
if (object == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
reactions.add(object);
|
||||||
|
}
|
||||||
|
magic = stream.readInt32(exception);
|
||||||
|
if (magic != 0x1cb5c415) {
|
||||||
|
if (exception) {
|
||||||
|
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
count = stream.readInt32(exception);
|
||||||
|
for (int a = 0; a < count; a++) {
|
||||||
|
TLRPC.Chat object = TLRPC.Chat.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
if (object == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chats.add(object);
|
||||||
|
}
|
||||||
|
magic = stream.readInt32(exception);
|
||||||
|
if (magic != 0x1cb5c415) {
|
||||||
|
if (exception) {
|
||||||
|
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
count = stream.readInt32(exception);
|
||||||
|
for (int a = 0; a < count; a++) {
|
||||||
|
TLRPC.User object = TLRPC.User.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||||
|
if (object == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
users.add(object);
|
||||||
|
}
|
||||||
|
if ((flags & 1) != 0) {
|
||||||
|
next_offset = stream.readString(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TL_getStoryReactionsList extends TLObject {
|
||||||
|
public final static int constructor = 0xb9b2881f;
|
||||||
|
|
||||||
|
public int flags;
|
||||||
|
public boolean forwards_first;
|
||||||
|
public TLRPC.InputPeer peer;
|
||||||
|
public int id;
|
||||||
|
public TLRPC.Reaction reaction;
|
||||||
|
public String offset;
|
||||||
|
public int limit;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) {
|
||||||
|
return TL_storyReactionsList.TLdeserialize(stream, constructor, exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serializeToStream(AbstractSerializedData stream) {
|
||||||
|
stream.writeInt32(constructor);
|
||||||
|
flags = forwards_first ? (flags | 4) : (flags &~ 4);
|
||||||
|
stream.writeInt32(flags);
|
||||||
|
peer.serializeToStream(stream);
|
||||||
|
stream.writeInt32(id);
|
||||||
|
if ((flags & 1) != 0) {
|
||||||
|
reaction.serializeToStream(stream);
|
||||||
|
}
|
||||||
|
if ((flags & 2) != 0) {
|
||||||
|
stream.writeString(offset);
|
||||||
|
}
|
||||||
|
stream.writeInt32(limit);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
|
|
||||||
package org.telegram.ui.ActionBar;
|
package org.telegram.ui.ActionBar;
|
||||||
|
|
||||||
|
import static org.telegram.messenger.AndroidUtilities.dp;
|
||||||
|
|
||||||
import android.animation.Animator;
|
import android.animation.Animator;
|
||||||
import android.animation.AnimatorListenerAdapter;
|
import android.animation.AnimatorListenerAdapter;
|
||||||
import android.animation.AnimatorSet;
|
import android.animation.AnimatorSet;
|
||||||
|
@ -192,7 +194,7 @@ public class ActionBar extends FrameLayout {
|
||||||
if (itemsColor != 0) {
|
if (itemsColor != 0) {
|
||||||
backButtonImageView.setColorFilter(new PorterDuffColorFilter(itemsColor, colorFilterMode));
|
backButtonImageView.setColorFilter(new PorterDuffColorFilter(itemsColor, colorFilterMode));
|
||||||
}
|
}
|
||||||
backButtonImageView.setPadding(AndroidUtilities.dp(1), 0, 0, 0);
|
backButtonImageView.setPadding(dp(1), 0, 0, 0);
|
||||||
addView(backButtonImageView, LayoutHelper.createFrame(54, 54, Gravity.LEFT | Gravity.TOP));
|
addView(backButtonImageView, LayoutHelper.createFrame(54, 54, Gravity.LEFT | Gravity.TOP));
|
||||||
|
|
||||||
backButtonImageView.setOnClickListener(v -> {
|
backButtonImageView.setOnClickListener(v -> {
|
||||||
|
@ -302,19 +304,18 @@ public class ActionBar extends FrameLayout {
|
||||||
canvas.clipRect(0, -getTranslationY() + (occupyStatusBar ? AndroidUtilities.statusBarHeight : 0), getMeasuredWidth(), getMeasuredHeight());
|
canvas.clipRect(0, -getTranslationY() + (occupyStatusBar ? AndroidUtilities.statusBarHeight : 0), getMeasuredWidth(), getMeasuredHeight());
|
||||||
}
|
}
|
||||||
boolean result = super.drawChild(canvas, child, drawingTime);
|
boolean result = super.drawChild(canvas, child, drawingTime);
|
||||||
if (supportsHolidayImage && !titleOverlayShown && !LocaleController.isRTL && (child == titleTextView[0] || child == titleTextView[1])) {
|
if (supportsHolidayImage && !titleOverlayShown && !LocaleController.isRTL && (child == titleTextView[0] || child == titleTextView[1] || child == titlesContainer && useContainerForTitles)) {
|
||||||
Drawable drawable = Theme.getCurrentHolidayDrawable();
|
Drawable drawable = Theme.getCurrentHolidayDrawable();
|
||||||
if (drawable != null) {
|
if (drawable != null) {
|
||||||
|
SimpleTextView titleView = child == titlesContainer ? titleTextView[0] : (SimpleTextView) child;
|
||||||
SimpleTextView titleView = (SimpleTextView) child;
|
if (titleView != null && titleView.getVisibility() == View.VISIBLE && titleView.getText() instanceof String) {
|
||||||
if (titleView.getVisibility() == View.VISIBLE && titleView.getText() instanceof String) {
|
|
||||||
TextPaint textPaint = titleView.getTextPaint();
|
TextPaint textPaint = titleView.getTextPaint();
|
||||||
textPaint.getFontMetricsInt(fontMetricsInt);
|
textPaint.getFontMetricsInt(fontMetricsInt);
|
||||||
textPaint.getTextBounds((String) titleView.getText(), 0, 1, rect);
|
textPaint.getTextBounds((String) titleView.getText(), 0, 1, rect);
|
||||||
int x = titleView.getTextStartX() + Theme.getCurrentHolidayDrawableXOffset() + (rect.width() - (drawable.getIntrinsicWidth() + Theme.getCurrentHolidayDrawableXOffset())) / 2;
|
int x = titleView.getTextStartX() + Theme.getCurrentHolidayDrawableXOffset() + (rect.width() - (drawable.getIntrinsicWidth() + Theme.getCurrentHolidayDrawableXOffset())) / 2;
|
||||||
int y = titleView.getTextStartY() + Theme.getCurrentHolidayDrawableYOffset() + (int) Math.ceil((titleView.getTextHeight() - rect.height()) / 2.0f);
|
int y = titleView.getTextStartY() + Theme.getCurrentHolidayDrawableYOffset() + (int) Math.ceil((titleView.getTextHeight() - rect.height()) / 2.0f) + (int) (dp(8) * (1f - titlesContainer.getScaleY()));
|
||||||
drawable.setBounds(x, y - drawable.getIntrinsicHeight(), x + drawable.getIntrinsicWidth(), y);
|
drawable.setBounds(x, y - drawable.getIntrinsicHeight(), x + drawable.getIntrinsicWidth(), y);
|
||||||
drawable.setAlpha((int) (255 * titleView.getAlpha()));
|
drawable.setAlpha((int) (255 * titlesContainer.getAlpha() * titleView.getAlpha()));
|
||||||
drawable.draw(canvas);
|
drawable.draw(canvas);
|
||||||
if (overlayTitleAnimationInProgress) {
|
if (overlayTitleAnimationInProgress) {
|
||||||
child.invalidate();
|
child.invalidate();
|
||||||
|
@ -425,9 +426,9 @@ public class ActionBar extends FrameLayout {
|
||||||
titleTextView[i].setTextColor(getThemedColor(Theme.key_actionBarDefaultTitle));
|
titleTextView[i].setTextColor(getThemedColor(Theme.key_actionBarDefaultTitle));
|
||||||
}
|
}
|
||||||
titleTextView[i].setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
titleTextView[i].setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
||||||
titleTextView[i].setDrawablePadding(AndroidUtilities.dp(4));
|
titleTextView[i].setDrawablePadding(dp(4));
|
||||||
titleTextView[i].setPadding(0, AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8));
|
titleTextView[i].setPadding(0, dp(8), 0, dp(8));
|
||||||
titleTextView[i].setRightDrawableTopPadding(-AndroidUtilities.dp(1));
|
titleTextView[i].setRightDrawableTopPadding(-dp(1));
|
||||||
if (useContainerForTitles) {
|
if (useContainerForTitles) {
|
||||||
titlesContainer.addView(titleTextView[i], 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP));
|
titlesContainer.addView(titleTextView[i], 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1209,10 +1210,10 @@ public class ActionBar extends FrameLayout {
|
||||||
|
|
||||||
int textLeft;
|
int textLeft;
|
||||||
if (backButtonImageView != null && backButtonImageView.getVisibility() != GONE) {
|
if (backButtonImageView != null && backButtonImageView.getVisibility() != GONE) {
|
||||||
backButtonImageView.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(54), MeasureSpec.EXACTLY), actionBarHeightSpec);
|
backButtonImageView.measure(MeasureSpec.makeMeasureSpec(dp(54), MeasureSpec.EXACTLY), actionBarHeightSpec);
|
||||||
textLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 80 : 72);
|
textLeft = dp(AndroidUtilities.isTablet() ? 80 : 72);
|
||||||
} else {
|
} else {
|
||||||
textLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 26 : 18);
|
textLeft = dp(AndroidUtilities.isTablet() ? 26 : 18);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu != null && menu.getVisibility() != GONE) {
|
if (menu != null && menu.getVisibility() != GONE) {
|
||||||
|
@ -1222,12 +1223,12 @@ public class ActionBar extends FrameLayout {
|
||||||
menuWidth = MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST);
|
menuWidth = MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST);
|
||||||
menu.measure(menuWidth, actionBarHeightSpec);
|
menu.measure(menuWidth, actionBarHeightSpec);
|
||||||
int itemsWidth = menu.getItemsMeasuredWidth(true);
|
int itemsWidth = menu.getItemsMeasuredWidth(true);
|
||||||
menuWidth = MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(AndroidUtilities.isTablet() ? 74 : 66) + menu.getItemsMeasuredWidth(true), MeasureSpec.EXACTLY);
|
menuWidth = MeasureSpec.makeMeasureSpec(width - dp(AndroidUtilities.isTablet() ? 74 : 66) + menu.getItemsMeasuredWidth(true), MeasureSpec.EXACTLY);
|
||||||
if (!isMenuOffsetSuppressed) {
|
if (!isMenuOffsetSuppressed) {
|
||||||
menu.translateXItems(-itemsWidth);
|
menu.translateXItems(-itemsWidth);
|
||||||
}
|
}
|
||||||
} else if (isSearchFieldVisible) {
|
} else if (isSearchFieldVisible) {
|
||||||
menuWidth = MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(AndroidUtilities.isTablet() ? 74 : 66), MeasureSpec.EXACTLY);
|
menuWidth = MeasureSpec.makeMeasureSpec(width - dp(AndroidUtilities.isTablet() ? 74 : 66), MeasureSpec.EXACTLY);
|
||||||
if (!isMenuOffsetSuppressed) {
|
if (!isMenuOffsetSuppressed) {
|
||||||
menu.translateXItems(0);
|
menu.translateXItems(0);
|
||||||
}
|
}
|
||||||
|
@ -1243,7 +1244,7 @@ public class ActionBar extends FrameLayout {
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
if (titleTextView[0] != null && titleTextView[0].getVisibility() != GONE || subtitleTextView != null && subtitleTextView.getVisibility() != GONE) {
|
if (titleTextView[0] != null && titleTextView[0].getVisibility() != GONE || subtitleTextView != null && subtitleTextView.getVisibility() != GONE) {
|
||||||
int availableWidth = width - (menu != null ? menu.getMeasuredWidth() : 0) - AndroidUtilities.dp(16) - textLeft - titleRightMargin;
|
int availableWidth = width - (menu != null ? menu.getMeasuredWidth() : 0) - dp(16) - textLeft - titleRightMargin;
|
||||||
|
|
||||||
if (((fromBottom && i == 0) || (!fromBottom && i == 1)) && overlayTitleAnimation && titleAnimationRunning) {
|
if (((fromBottom && i == 0) || (!fromBottom && i == 1)) && overlayTitleAnimation && titleAnimationRunning) {
|
||||||
titleTextView[i].setTextSize(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 18 : 20);
|
titleTextView[i].setTextSize(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 18 : 20);
|
||||||
|
@ -1270,29 +1271,29 @@ public class ActionBar extends FrameLayout {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (titleTextView[i] != null && titleTextView[i].getVisibility() != GONE) {
|
if (titleTextView[i] != null && titleTextView[i].getVisibility() != GONE) {
|
||||||
titleTextView[i].measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(24) + titleTextView[i].getPaddingTop() + titleTextView[i].getPaddingBottom(), MeasureSpec.AT_MOST));
|
titleTextView[i].measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(24) + titleTextView[i].getPaddingTop() + titleTextView[i].getPaddingBottom(), MeasureSpec.AT_MOST));
|
||||||
if (centerScale) {
|
if (centerScale) {
|
||||||
CharSequence text = titleTextView[i].getText();
|
CharSequence text = titleTextView[i].getText();
|
||||||
titleTextView[i].setPivotX(titleTextView[i].getTextPaint().measureText(text, 0, text.length()) / 2f);
|
titleTextView[i].setPivotX(titleTextView[i].getTextPaint().measureText(text, 0, text.length()) / 2f);
|
||||||
titleTextView[i].setPivotY((AndroidUtilities.dp(24) >> 1));
|
titleTextView[i].setPivotY((dp(24) >> 1));
|
||||||
} else {
|
} else {
|
||||||
titleTextView[i].setPivotX(0);
|
titleTextView[i].setPivotX(0);
|
||||||
titleTextView[i].setPivotY(0);
|
titleTextView[i].setPivotY(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (subtitleTextView != null && subtitleTextView.getVisibility() != GONE) {
|
if (subtitleTextView != null && subtitleTextView.getVisibility() != GONE) {
|
||||||
subtitleTextView.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.AT_MOST));
|
subtitleTextView.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.AT_MOST));
|
||||||
}
|
}
|
||||||
if (additionalSubtitleTextView != null && additionalSubtitleTextView.getVisibility() != GONE) {
|
if (additionalSubtitleTextView != null && additionalSubtitleTextView.getVisibility() != GONE) {
|
||||||
additionalSubtitleTextView.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.AT_MOST));
|
additionalSubtitleTextView.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.AT_MOST));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avatarSearchImageView != null) {
|
if (avatarSearchImageView != null) {
|
||||||
avatarSearchImageView.measure(
|
avatarSearchImageView.measure(
|
||||||
MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(42), MeasureSpec.EXACTLY),
|
MeasureSpec.makeMeasureSpec(dp(42), MeasureSpec.EXACTLY),
|
||||||
MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(42), MeasureSpec.EXACTLY)
|
MeasureSpec.makeMeasureSpec(dp(42), MeasureSpec.EXACTLY)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1317,13 +1318,13 @@ public class ActionBar extends FrameLayout {
|
||||||
int textLeft;
|
int textLeft;
|
||||||
if (backButtonImageView != null && backButtonImageView.getVisibility() != GONE) {
|
if (backButtonImageView != null && backButtonImageView.getVisibility() != GONE) {
|
||||||
backButtonImageView.layout(0, additionalTop, backButtonImageView.getMeasuredWidth(), additionalTop + backButtonImageView.getMeasuredHeight());
|
backButtonImageView.layout(0, additionalTop, backButtonImageView.getMeasuredWidth(), additionalTop + backButtonImageView.getMeasuredHeight());
|
||||||
textLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 80 : 72);
|
textLeft = dp(AndroidUtilities.isTablet() ? 80 : 72);
|
||||||
} else {
|
} else {
|
||||||
textLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 26 : 18);
|
textLeft = dp(AndroidUtilities.isTablet() ? 26 : 18);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu != null && menu.getVisibility() != GONE) {
|
if (menu != null && menu.getVisibility() != GONE) {
|
||||||
int menuLeft = menu.searchFieldVisible() ? AndroidUtilities.dp(AndroidUtilities.isTablet() ? 74 : 66) : (right - left) - menu.getMeasuredWidth();
|
int menuLeft = menu.searchFieldVisible() ? dp(AndroidUtilities.isTablet() ? 74 : 66) : (right - left) - menu.getMeasuredWidth();
|
||||||
menu.layout(menuLeft, additionalTop, menuLeft + menu.getMeasuredWidth(), additionalTop + menu.getMeasuredHeight());
|
menu.layout(menuLeft, additionalTop, menuLeft + menu.getMeasuredWidth(), additionalTop + menu.getMeasuredHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1334,7 +1335,7 @@ public class ActionBar extends FrameLayout {
|
||||||
textTop = (getCurrentActionBarHeight() - titleTextView[i].getTextHeight()) / 2;
|
textTop = (getCurrentActionBarHeight() - titleTextView[i].getTextHeight()) / 2;
|
||||||
} else {
|
} else {
|
||||||
if ((subtitleTextView != null && subtitleTextView.getVisibility() != GONE)) {
|
if ((subtitleTextView != null && subtitleTextView.getVisibility() != GONE)) {
|
||||||
textTop = (getCurrentActionBarHeight() / 2 - titleTextView[i].getTextHeight()) / 2 + AndroidUtilities.dp(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 2 : 3);
|
textTop = (getCurrentActionBarHeight() / 2 - titleTextView[i].getTextHeight()) / 2 + dp(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 2 : 3);
|
||||||
} else {
|
} else {
|
||||||
textTop = (getCurrentActionBarHeight() - titleTextView[i].getTextHeight()) / 2;
|
textTop = (getCurrentActionBarHeight() - titleTextView[i].getTextHeight()) / 2;
|
||||||
}
|
}
|
||||||
|
@ -1343,20 +1344,20 @@ public class ActionBar extends FrameLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (subtitleTextView != null && subtitleTextView.getVisibility() != GONE) {
|
if (subtitleTextView != null && subtitleTextView.getVisibility() != GONE) {
|
||||||
int textTop = getCurrentActionBarHeight() / 2 + (getCurrentActionBarHeight() / 2 - subtitleTextView.getTextHeight()) / 2 - AndroidUtilities.dp(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 1 : 1);
|
int textTop = getCurrentActionBarHeight() / 2 + (getCurrentActionBarHeight() / 2 - subtitleTextView.getTextHeight()) / 2 - dp(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 1 : 1);
|
||||||
subtitleTextView.layout(textLeft, additionalTop + textTop, textLeft + subtitleTextView.getMeasuredWidth(), additionalTop + textTop + subtitleTextView.getTextHeight());
|
subtitleTextView.layout(textLeft, additionalTop + textTop, textLeft + subtitleTextView.getMeasuredWidth(), additionalTop + textTop + subtitleTextView.getTextHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (additionalSubtitleTextView != null && additionalSubtitleTextView.getVisibility() != GONE) {
|
if (additionalSubtitleTextView != null && additionalSubtitleTextView.getVisibility() != GONE) {
|
||||||
int textTop = getCurrentActionBarHeight() / 2 + (getCurrentActionBarHeight() / 2 - additionalSubtitleTextView.getTextHeight()) / 2 - AndroidUtilities.dp(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 1 : 1);
|
int textTop = getCurrentActionBarHeight() / 2 + (getCurrentActionBarHeight() / 2 - additionalSubtitleTextView.getTextHeight()) / 2 - dp(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 1 : 1);
|
||||||
additionalSubtitleTextView.layout(textLeft, additionalTop + textTop, textLeft + additionalSubtitleTextView.getMeasuredWidth(), additionalTop + textTop + additionalSubtitleTextView.getTextHeight());
|
additionalSubtitleTextView.layout(textLeft, additionalTop + textTop, textLeft + additionalSubtitleTextView.getMeasuredWidth(), additionalTop + textTop + additionalSubtitleTextView.getTextHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avatarSearchImageView != null) {
|
if (avatarSearchImageView != null) {
|
||||||
avatarSearchImageView.layout(
|
avatarSearchImageView.layout(
|
||||||
AndroidUtilities.dp(56 + 8),
|
dp(56 + 8),
|
||||||
additionalTop + (getCurrentActionBarHeight() - avatarSearchImageView.getMeasuredHeight()) / 2,
|
additionalTop + (getCurrentActionBarHeight() - avatarSearchImageView.getMeasuredHeight()) / 2,
|
||||||
AndroidUtilities.dp(56 + 8) + avatarSearchImageView.getMeasuredWidth(),
|
dp(56 + 8) + avatarSearchImageView.getMeasuredWidth(),
|
||||||
additionalTop + (getCurrentActionBarHeight() + avatarSearchImageView.getMeasuredHeight()) / 2
|
additionalTop + (getCurrentActionBarHeight() + avatarSearchImageView.getMeasuredHeight()) / 2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1476,7 +1477,7 @@ public class ActionBar extends FrameLayout {
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
titleTextView[0].setText(textToSet);
|
titleTextView[0].setText(textToSet);
|
||||||
titleTextView[0].setDrawablePadding(AndroidUtilities.dp(4));
|
titleTextView[0].setDrawablePadding(dp(4));
|
||||||
titleTextView[0].setRightDrawable(rightDrawableToSet);
|
titleTextView[0].setRightDrawable(rightDrawableToSet);
|
||||||
titleTextView[0].setRightDrawableOnClick(rightDrawableOnClickListener);
|
titleTextView[0].setRightDrawableOnClick(rightDrawableOnClickListener);
|
||||||
if (rightDrawableToSet instanceof AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable) {
|
if (rightDrawableToSet instanceof AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable) {
|
||||||
|
@ -1496,7 +1497,7 @@ public class ActionBar extends FrameLayout {
|
||||||
createTitleTextView(1);
|
createTitleTextView(1);
|
||||||
}
|
}
|
||||||
titleTextView[1].setText(textToSet);
|
titleTextView[1].setText(textToSet);
|
||||||
titleTextView[1].setDrawablePadding(AndroidUtilities.dp(4));
|
titleTextView[1].setDrawablePadding(dp(4));
|
||||||
titleTextView[1].setRightDrawable(rightDrawableToSet);
|
titleTextView[1].setRightDrawable(rightDrawableToSet);
|
||||||
titleTextView[1].setRightDrawableOnClick(rightDrawableOnClickListener);
|
titleTextView[1].setRightDrawableOnClick(rightDrawableOnClickListener);
|
||||||
if (rightDrawableToSet instanceof AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable) {
|
if (rightDrawableToSet instanceof AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable) {
|
||||||
|
@ -1510,7 +1511,7 @@ public class ActionBar extends FrameLayout {
|
||||||
titleTextView[1] = titleTextView[0];
|
titleTextView[1] = titleTextView[0];
|
||||||
titleTextView[0] = tmp;
|
titleTextView[0] = tmp;
|
||||||
titleTextView[0].setAlpha(0);
|
titleTextView[0].setAlpha(0);
|
||||||
titleTextView[0].setTranslationY(-AndroidUtilities.dp(20));
|
titleTextView[0].setTranslationY(-dp(20));
|
||||||
titleTextView[0].animate()
|
titleTextView[0].animate()
|
||||||
.alpha(1f)
|
.alpha(1f)
|
||||||
.translationY(0)
|
.translationY(0)
|
||||||
|
@ -1518,7 +1519,7 @@ public class ActionBar extends FrameLayout {
|
||||||
ViewPropertyAnimator animator = titleTextView[1].animate()
|
ViewPropertyAnimator animator = titleTextView[1].animate()
|
||||||
.alpha(0);
|
.alpha(0);
|
||||||
if (subtitleTextView == null) {
|
if (subtitleTextView == null) {
|
||||||
animator.translationY(AndroidUtilities.dp(20));
|
animator.translationY(dp(20));
|
||||||
} else {
|
} else {
|
||||||
animator.scaleY(0.7f).scaleX(0.7f);
|
animator.scaleY(0.7f).scaleX(0.7f);
|
||||||
}
|
}
|
||||||
|
@ -1627,11 +1628,11 @@ public class ActionBar extends FrameLayout {
|
||||||
|
|
||||||
public static int getCurrentActionBarHeight() {
|
public static int getCurrentActionBarHeight() {
|
||||||
if (AndroidUtilities.isTablet()) {
|
if (AndroidUtilities.isTablet()) {
|
||||||
return AndroidUtilities.dp(64);
|
return dp(64);
|
||||||
} else if (AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y) {
|
} else if (AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y) {
|
||||||
return AndroidUtilities.dp(48);
|
return dp(48);
|
||||||
} else {
|
} else {
|
||||||
return AndroidUtilities.dp(56);
|
return dp(56);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1665,7 +1666,7 @@ public class ActionBar extends FrameLayout {
|
||||||
this.fromBottom = fromBottom;
|
this.fromBottom = fromBottom;
|
||||||
titleTextView[0].setAlpha(0);
|
titleTextView[0].setAlpha(0);
|
||||||
if (!crossfade) {
|
if (!crossfade) {
|
||||||
titleTextView[0].setTranslationY(fromBottom ? AndroidUtilities.dp(20) : -AndroidUtilities.dp(20));
|
titleTextView[0].setTranslationY(fromBottom ? dp(20) : -dp(20));
|
||||||
}
|
}
|
||||||
ViewPropertyAnimator a1 = titleTextView[0].animate().alpha(1f).translationY(0).setDuration(duration);
|
ViewPropertyAnimator a1 = titleTextView[0].animate().alpha(1f).translationY(0).setDuration(duration);
|
||||||
if (interpolator != null) {
|
if (interpolator != null) {
|
||||||
|
@ -1676,7 +1677,7 @@ public class ActionBar extends FrameLayout {
|
||||||
titleAnimationRunning = true;
|
titleAnimationRunning = true;
|
||||||
ViewPropertyAnimator a = titleTextView[1].animate().alpha(0);
|
ViewPropertyAnimator a = titleTextView[1].animate().alpha(0);
|
||||||
if (!crossfade) {
|
if (!crossfade) {
|
||||||
a.translationY(fromBottom ? -AndroidUtilities.dp(20) : AndroidUtilities.dp(20));
|
a.translationY(fromBottom ? -dp(20) : dp(20));
|
||||||
}
|
}
|
||||||
if (interpolator != null) {
|
if (interpolator != null) {
|
||||||
a.setInterpolator(interpolator);
|
a.setInterpolator(interpolator);
|
||||||
|
|
|
@ -396,6 +396,7 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F
|
||||||
private float themeAnimationValue;
|
private float themeAnimationValue;
|
||||||
private boolean animateThemeAfterAnimation;
|
private boolean animateThemeAfterAnimation;
|
||||||
private Theme.ThemeInfo animateSetThemeAfterAnimation;
|
private Theme.ThemeInfo animateSetThemeAfterAnimation;
|
||||||
|
private boolean animateSetThemeAfterAnimationApply;
|
||||||
private boolean animateSetThemeNightAfterAnimation;
|
private boolean animateSetThemeNightAfterAnimation;
|
||||||
private int animateSetThemeAccentIdAfterAnimation;
|
private int animateSetThemeAccentIdAfterAnimation;
|
||||||
private boolean rebuildAfterAnimation;
|
private boolean rebuildAfterAnimation;
|
||||||
|
@ -1256,10 +1257,10 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F
|
||||||
}
|
}
|
||||||
BaseFragment lastFragment = getLastFragment();
|
BaseFragment lastFragment = getLastFragment();
|
||||||
Dialog dialog = lastFragment != null ? lastFragment.getVisibleDialog() : null;
|
Dialog dialog = lastFragment != null ? lastFragment.getVisibleDialog() : null;
|
||||||
if (dialog == null && LaunchActivity.instance != null && LaunchActivity.instance.visibleDialog != null) {
|
if (dialog == null && LaunchActivity.instance != null && LaunchActivity.instance.getVisibleDialog() != null) {
|
||||||
dialog = LaunchActivity.instance.visibleDialog;
|
dialog = LaunchActivity.instance.getVisibleDialog();
|
||||||
}
|
}
|
||||||
if (shouldOpenFragmentOverlay(dialog)) {
|
if (lastFragment != null && shouldOpenFragmentOverlay(dialog)) {
|
||||||
BaseFragment.BottomSheetParams bottomSheetParams = new BaseFragment.BottomSheetParams();
|
BaseFragment.BottomSheetParams bottomSheetParams = new BaseFragment.BottomSheetParams();
|
||||||
bottomSheetParams.transitionFromLeft = true;
|
bottomSheetParams.transitionFromLeft = true;
|
||||||
bottomSheetParams.allowNestedScroll = false;
|
bottomSheetParams.allowNestedScroll = false;
|
||||||
|
@ -1564,7 +1565,7 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean shouldOpenFragmentOverlay(Dialog visibleDialog) {
|
private boolean shouldOpenFragmentOverlay(Dialog visibleDialog) {
|
||||||
return visibleDialog instanceof ChatAttachAlert || visibleDialog instanceof BotWebViewSheet;
|
return (visibleDialog != null && visibleDialog.isShowing()) && (visibleDialog instanceof ChatAttachAlert || visibleDialog instanceof BotWebViewSheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1726,6 +1727,10 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F
|
||||||
|
|
||||||
fragment.setInPreviewMode(false);
|
fragment.setInPreviewMode(false);
|
||||||
fragment.setInMenuMode(false);
|
fragment.setInMenuMode(false);
|
||||||
|
|
||||||
|
try {
|
||||||
|
AndroidUtilities.setLightStatusBar(parentActivity.getWindow(), Theme.getColor(Theme.key_actionBarDefault) == Color.WHITE || (fragment.hasForceLightStatusBar() && !Theme.getCurrentTheme().isDark()), fragment.hasForceLightStatusBar());
|
||||||
|
} catch (Exception ignore) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -2124,6 +2129,7 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F
|
||||||
animateSetThemeAfterAnimation = settings.theme;
|
animateSetThemeAfterAnimation = settings.theme;
|
||||||
animateSetThemeNightAfterAnimation = settings.nightTheme;
|
animateSetThemeNightAfterAnimation = settings.nightTheme;
|
||||||
animateSetThemeAccentIdAfterAnimation = settings.accentId;
|
animateSetThemeAccentIdAfterAnimation = settings.accentId;
|
||||||
|
animateSetThemeAfterAnimationApply = settings.applyTrulyTheme;
|
||||||
if (onDone != null) {
|
if (onDone != null) {
|
||||||
onDone.run();
|
onDone.run();
|
||||||
}
|
}
|
||||||
|
@ -2259,7 +2265,7 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F
|
||||||
onDone.run();
|
onDone.run();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (fragmentCount >= 1 && settings.applyTheme) {
|
if (fragmentCount >= 1 && settings.applyTheme && settings.applyTrulyTheme) {
|
||||||
if (settings.accentId != -1 && settings.theme != null) {
|
if (settings.accentId != -1 && settings.theme != null) {
|
||||||
settings.theme.setCurrentAccentId(settings.accentId);
|
settings.theme.setCurrentAccentId(settings.accentId);
|
||||||
Theme.saveThemeAccents(settings.theme, true, false, true, false);
|
Theme.saveThemeAccents(settings.theme, true, false, true, false);
|
||||||
|
@ -2363,7 +2369,11 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F
|
||||||
rebuildAllFragmentViews(rebuildLastAfterAnimation, showLastAfterAnimation);
|
rebuildAllFragmentViews(rebuildLastAfterAnimation, showLastAfterAnimation);
|
||||||
rebuildAfterAnimation = false;
|
rebuildAfterAnimation = false;
|
||||||
} else if (animateThemeAfterAnimation) {
|
} else if (animateThemeAfterAnimation) {
|
||||||
animateThemedValues(animateSetThemeAfterAnimation, animateSetThemeAccentIdAfterAnimation, animateSetThemeNightAfterAnimation, false);
|
ThemeAnimationSettings settings = new ThemeAnimationSettings(animateSetThemeAfterAnimation, animateSetThemeAccentIdAfterAnimation, animateSetThemeNightAfterAnimation, false);
|
||||||
|
if (!animateSetThemeAfterAnimationApply) {
|
||||||
|
settings.applyTheme = settings.applyTrulyTheme = animateSetThemeAfterAnimationApply;
|
||||||
|
}
|
||||||
|
animateThemedValues(settings, null);
|
||||||
animateSetThemeAfterAnimation = null;
|
animateSetThemeAfterAnimation = null;
|
||||||
animateThemeAfterAnimation = false;
|
animateThemeAfterAnimation = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,6 +83,7 @@ public class AlertDialog extends Dialog implements Drawable.Callback, Notificati
|
||||||
|
|
||||||
private View customView;
|
private View customView;
|
||||||
private View bottomView;
|
private View bottomView;
|
||||||
|
private View aboveMessageView;
|
||||||
private int customViewHeight = LayoutHelper.WRAP_CONTENT;
|
private int customViewHeight = LayoutHelper.WRAP_CONTENT;
|
||||||
private TextView titleTextView;
|
private TextView titleTextView;
|
||||||
private TextView secondTitleTextView;
|
private TextView secondTitleTextView;
|
||||||
|
@ -766,9 +767,12 @@ public class AlertDialog extends Dialog implements Drawable.Callback, Notificati
|
||||||
progressView.setProgressColor(getThemedColor(Theme.key_dialog_inlineProgress));
|
progressView.setProgressColor(getThemedColor(Theme.key_dialog_inlineProgress));
|
||||||
progressViewContainer.addView(progressView, LayoutHelper.createFrame(86, 86, Gravity.CENTER));
|
progressViewContainer.addView(progressView, LayoutHelper.createFrame(86, 86, Gravity.CENTER));
|
||||||
} else {
|
} else {
|
||||||
|
if (aboveMessageView != null) {
|
||||||
|
scrollContainer.addView(aboveMessageView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 22, 4, 22, 12));
|
||||||
|
}
|
||||||
scrollContainer.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (topAnimationIsNew ? Gravity.CENTER_HORIZONTAL : LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, 0, 24, customView != null || items != null ? customViewOffset : 0));
|
scrollContainer.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (topAnimationIsNew ? Gravity.CENTER_HORIZONTAL : LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, 0, 24, customView != null || items != null ? customViewOffset : 0));
|
||||||
if (bottomView != null) {
|
if (bottomView != null) {
|
||||||
scrollContainer.addView(bottomView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 24, -24, 24, 0));
|
scrollContainer.addView(bottomView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 22, 12, 22, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!TextUtils.isEmpty(message)) {
|
if (!TextUtils.isEmpty(message)) {
|
||||||
|
@ -1170,6 +1174,21 @@ public class AlertDialog extends Dialog implements Drawable.Callback, Notificati
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setTextSize(int titleSizeDp, int messageSizeDp) {
|
||||||
|
if (titleTextView != null) {
|
||||||
|
titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, titleSizeDp);
|
||||||
|
}
|
||||||
|
if (messageTextView != null) {
|
||||||
|
messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, messageSizeDp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessageLineSpacing(float spaceDp) {
|
||||||
|
if (messageTextView != null) {
|
||||||
|
messageTextView.setLineSpacing(AndroidUtilities.dp(spaceDp), 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void showCancelAlert() {
|
private void showCancelAlert() {
|
||||||
if (!canCacnel || cancelDialog != null) {
|
if (!canCacnel || cancelDialog != null) {
|
||||||
return;
|
return;
|
||||||
|
@ -1523,6 +1542,11 @@ public class AlertDialog extends Dialog implements Drawable.Callback, Notificati
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder aboveMessageView(View view) {
|
||||||
|
alertDialog.aboveMessageView = view;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder addBottomView(View view) {
|
public Builder addBottomView(View view) {
|
||||||
alertDialog.bottomView = view;
|
alertDialog.bottomView = view;
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -109,6 +109,8 @@ public class BottomSheet extends Dialog {
|
||||||
protected boolean fullWidth;
|
protected boolean fullWidth;
|
||||||
protected boolean isFullscreen;
|
protected boolean isFullscreen;
|
||||||
private boolean fullHeight;
|
private boolean fullHeight;
|
||||||
|
private int cellType;
|
||||||
|
private Integer selectedPos;
|
||||||
protected ColorDrawable backDrawable = new ColorDrawable(0xff000000) {
|
protected ColorDrawable backDrawable = new ColorDrawable(0xff000000) {
|
||||||
@Override
|
@Override
|
||||||
public void setAlpha(int alpha) {
|
public void setAlpha(int alpha) {
|
||||||
|
@ -897,7 +899,9 @@ public class BottomSheet extends Dialog {
|
||||||
this.resourcesProvider = resourcesProvider;
|
this.resourcesProvider = resourcesProvider;
|
||||||
|
|
||||||
currentType = type;
|
currentType = type;
|
||||||
|
if (type != Builder.CELL_TYPE_CALL) {
|
||||||
setBackgroundDrawable(Theme.getSelectorDrawable(false, resourcesProvider));
|
setBackgroundDrawable(Theme.getSelectorDrawable(false, resourcesProvider));
|
||||||
|
}
|
||||||
//setPadding(AndroidUtilities.dp(16), 0, AndroidUtilities.dp(16), 0);
|
//setPadding(AndroidUtilities.dp(16), 0, AndroidUtilities.dp(16), 0);
|
||||||
|
|
||||||
imageView = new ImageView(context);
|
imageView = new ImageView(context);
|
||||||
|
@ -910,7 +914,7 @@ public class BottomSheet extends Dialog {
|
||||||
textView.setSingleLine(true);
|
textView.setSingleLine(true);
|
||||||
textView.setGravity(Gravity.CENTER_HORIZONTAL);
|
textView.setGravity(Gravity.CENTER_HORIZONTAL);
|
||||||
textView.setEllipsize(TextUtils.TruncateAt.END);
|
textView.setEllipsize(TextUtils.TruncateAt.END);
|
||||||
if (type == 0) {
|
if (type == 0 || type == Builder.CELL_TYPE_CALL) {
|
||||||
textView.setTextColor(getThemedColor(Theme.key_dialogTextBlack));
|
textView.setTextColor(getThemedColor(Theme.key_dialogTextBlack));
|
||||||
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
|
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
|
||||||
addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL));
|
addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL));
|
||||||
|
@ -1234,7 +1238,7 @@ public class BottomSheet extends Dialog {
|
||||||
if (items[a] == null) {
|
if (items[a] == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
BottomSheetCell cell = new BottomSheetCell(getContext(), 0, resourcesProvider);
|
BottomSheetCell cell = new BottomSheetCell(getContext(), cellType, resourcesProvider);
|
||||||
cell.setTextAndIcon(items[a], itemIcons != null ? itemIcons[a] : 0, null, bigTitle);
|
cell.setTextAndIcon(items[a], itemIcons != null ? itemIcons[a] : 0, null, bigTitle);
|
||||||
containerView.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.TOP, 0, topOffset, 0, 0));
|
containerView.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.TOP, 0, topOffset, 0, 0));
|
||||||
topOffset += 48;
|
topOffset += 48;
|
||||||
|
@ -1617,7 +1621,7 @@ public class BottomSheet extends Dialog {
|
||||||
ObjectAnimator.ofFloat(containerView, View.TRANSLATION_Y, getContainerViewHeight() + keyboardHeight + AndroidUtilities.dp(10) + (scrollNavBar ? getBottomInset() : 0)),
|
ObjectAnimator.ofFloat(containerView, View.TRANSLATION_Y, getContainerViewHeight() + keyboardHeight + AndroidUtilities.dp(10) + (scrollNavBar ? getBottomInset() : 0)),
|
||||||
ObjectAnimator.ofInt(backDrawable, AnimationProperties.COLOR_DRAWABLE_ALPHA, 0)
|
ObjectAnimator.ofInt(backDrawable, AnimationProperties.COLOR_DRAWABLE_ALPHA, 0)
|
||||||
);
|
);
|
||||||
currentSheetAnimation.setDuration(180);
|
currentSheetAnimation.setDuration(cellType == Builder.CELL_TYPE_CALL ? 330 : 180);
|
||||||
currentSheetAnimation.setInterpolator(CubicBezierInterpolator.EASE_OUT);
|
currentSheetAnimation.setInterpolator(CubicBezierInterpolator.EASE_OUT);
|
||||||
currentSheetAnimation.addListener(new AnimatorListenerAdapter() {
|
currentSheetAnimation.addListener(new AnimatorListenerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -1652,6 +1656,27 @@ public class BottomSheet extends Dialog {
|
||||||
});
|
});
|
||||||
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.stopAllHeavyOperations, 512);
|
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.stopAllHeavyOperations, 512);
|
||||||
currentSheetAnimation.start();
|
currentSheetAnimation.start();
|
||||||
|
|
||||||
|
if (cellType == Builder.CELL_TYPE_CALL && selectedPos != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
int color1 = getItemViews().get(selectedPos).getTextView().getCurrentTextColor();
|
||||||
|
int color2 = getItemViews().get(item).getTextView().getCurrentTextColor();
|
||||||
|
ValueAnimator animator = ValueAnimator.ofArgb(color1, color2);
|
||||||
|
animator.addUpdateListener(a -> {
|
||||||
|
int color = (int) a.getAnimatedValue();
|
||||||
|
setItemColor(selectedPos, color, color);
|
||||||
|
});
|
||||||
|
animator.setDuration(130);
|
||||||
|
animator.setInterpolator(CubicBezierInterpolator.DEFAULT);
|
||||||
|
animator.start();
|
||||||
|
ValueAnimator animator2 = ValueAnimator.ofArgb(color2, color1);
|
||||||
|
animator2.addUpdateListener(a -> {
|
||||||
|
int color = (int) a.getAnimatedValue();
|
||||||
|
setItemColor(item, color, color);
|
||||||
|
});
|
||||||
|
animator2.setDuration(130);
|
||||||
|
animator2.setInterpolator(CubicBezierInterpolator.DEFAULT);
|
||||||
|
animator2.start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1796,6 +1821,8 @@ public class BottomSheet extends Dialog {
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
|
|
||||||
|
public static int CELL_TYPE_CALL = 4;
|
||||||
|
|
||||||
private BottomSheet bottomSheet;
|
private BottomSheet bottomSheet;
|
||||||
|
|
||||||
public Builder(Context context) {
|
public Builder(Context context) {
|
||||||
|
@ -1863,6 +1890,16 @@ public class BottomSheet extends Dialog {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder selectedPos(Integer pos) {
|
||||||
|
bottomSheet.selectedPos = pos;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setCellType(int cellType) {
|
||||||
|
bottomSheet.cellType = cellType;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder setTitleMultipleLines(boolean allowMultipleLines) {
|
public Builder setTitleMultipleLines(boolean allowMultipleLines) {
|
||||||
bottomSheet.multipleLinesTitle = allowMultipleLines;
|
bottomSheet.multipleLinesTitle = allowMultipleLines;
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -254,17 +254,23 @@ public class EmojiThemes {
|
||||||
} else {
|
} else {
|
||||||
baseTheme = Theme.getTheme("Blue");
|
baseTheme = Theme.getTheme("Blue");
|
||||||
}
|
}
|
||||||
|
if (baseTheme != null) {
|
||||||
themeInfo = new Theme.ThemeInfo(baseTheme);
|
themeInfo = new Theme.ThemeInfo(baseTheme);
|
||||||
accent = themeInfo.createNewAccent(tlTheme, currentAccount, true, settingsIndex);
|
accent = themeInfo.createNewAccent(tlTheme, currentAccount, true, settingsIndex);
|
||||||
if (accent != null) {
|
if (accent != null) {
|
||||||
themeInfo.setCurrentAccentId(accent.id);
|
themeInfo.setCurrentAccentId(accent.id);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (themeInfo.themeAccentsMap != null) {
|
if (themeInfo.themeAccentsMap != null) {
|
||||||
accent = themeInfo.themeAccentsMap.get(items.get(index).accentId);
|
accent = themeInfo.themeAccentsMap.get(items.get(index).accentId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (themeInfo == null) {
|
||||||
|
return currentColors;
|
||||||
|
}
|
||||||
|
|
||||||
SparseIntArray currentColorsNoAccent;
|
SparseIntArray currentColorsNoAccent;
|
||||||
String[] wallpaperLink = new String[1];
|
String[] wallpaperLink = new String[1];
|
||||||
if (themeInfo.pathToFile != null) {
|
if (themeInfo.pathToFile != null) {
|
||||||
|
|
|
@ -1007,7 +1007,7 @@ public final class FloatingToolbar {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
final int size = menuItems.size();
|
final int size = menuItems.size();
|
||||||
final boolean premiumLocked = MessagesController.getInstance(UserConfig.selectedAccount).premiumLocked;
|
final boolean premiumLocked = MessagesController.getInstance(UserConfig.selectedAccount).premiumFeaturesBlocked();
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
final MenuItem menuItem = menuItems.get(i);
|
final MenuItem menuItem = menuItems.get(i);
|
||||||
final boolean show;
|
final boolean show;
|
||||||
|
|
|
@ -368,6 +368,7 @@ public interface INavigationLayout {
|
||||||
public final boolean instant;
|
public final boolean instant;
|
||||||
public boolean onlyTopFragment;
|
public boolean onlyTopFragment;
|
||||||
public boolean applyTheme = true;
|
public boolean applyTheme = true;
|
||||||
|
public boolean applyTrulyTheme = true;
|
||||||
public Runnable afterStartDescriptionsAddedRunnable;
|
public Runnable afterStartDescriptionsAddedRunnable;
|
||||||
public Runnable beforeAnimationRunnable;
|
public Runnable beforeAnimationRunnable;
|
||||||
public Runnable afterAnimationRunnable;
|
public Runnable afterAnimationRunnable;
|
||||||
|
|
|
@ -61,6 +61,7 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
private SpannableStringBuilder spannableStringBuilder;
|
private SpannableStringBuilder spannableStringBuilder;
|
||||||
private Drawable leftDrawable;
|
private Drawable leftDrawable;
|
||||||
private Drawable rightDrawable;
|
private Drawable rightDrawable;
|
||||||
|
private Drawable rightDrawable2;
|
||||||
private Drawable replacedDrawable;
|
private Drawable replacedDrawable;
|
||||||
private String replacedText;
|
private String replacedText;
|
||||||
private int replacingDrawableTextIndex;
|
private int replacingDrawableTextIndex;
|
||||||
|
@ -273,6 +274,10 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
int dw = (int) (rightDrawable.getIntrinsicWidth() * rightDrawableScale);
|
int dw = (int) (rightDrawable.getIntrinsicWidth() * rightDrawableScale);
|
||||||
size += dw + drawablePadding;
|
size += dw + drawablePadding;
|
||||||
}
|
}
|
||||||
|
if (rightDrawable2 != null) {
|
||||||
|
int dw = (int) (rightDrawable2.getIntrinsicWidth() * rightDrawableScale);
|
||||||
|
size += dw + drawablePadding;
|
||||||
|
}
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,6 +347,11 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
width -= rightDrawableWidth;
|
width -= rightDrawableWidth;
|
||||||
width -= drawablePadding;
|
width -= drawablePadding;
|
||||||
}
|
}
|
||||||
|
if (rightDrawable2 != null && !rightDrawableOutside) {
|
||||||
|
rightDrawableWidth = (int) (rightDrawable2.getIntrinsicWidth() * rightDrawableScale);
|
||||||
|
width -= rightDrawableWidth;
|
||||||
|
width -= drawablePadding;
|
||||||
|
}
|
||||||
if (replacedText != null && replacedDrawable != null) {
|
if (replacedText != null && replacedDrawable != null) {
|
||||||
replacingDrawableTextIndex = text.toString().indexOf(replacedText);
|
replacingDrawableTextIndex = text.toString().indexOf(replacedText);
|
||||||
if (replacingDrawableTextIndex >= 0) {
|
if (replacingDrawableTextIndex >= 0) {
|
||||||
|
@ -450,7 +460,7 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
scrollingOffset = 0;
|
scrollingOffset = 0;
|
||||||
currentScrollDelay = SCROLL_DELAY_MS;
|
currentScrollDelay = SCROLL_DELAY_MS;
|
||||||
}
|
}
|
||||||
createLayout(width - getPaddingLeft() - getPaddingRight() - minusWidth - (rightDrawableOutside && rightDrawable != null ? rightDrawable.getIntrinsicWidth() + drawablePadding : 0));
|
createLayout(width - getPaddingLeft() - getPaddingRight() - minusWidth - (rightDrawableOutside && rightDrawable != null ? rightDrawable.getIntrinsicWidth() + drawablePadding : 0) - (rightDrawableOutside && rightDrawable2 != null ? rightDrawable2.getIntrinsicWidth() + drawablePadding : 0));
|
||||||
|
|
||||||
int finalHeight;
|
int finalHeight;
|
||||||
if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) {
|
if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) {
|
||||||
|
@ -460,7 +470,7 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
}
|
}
|
||||||
if (widthWrapContent) {
|
if (widthWrapContent) {
|
||||||
// textWidth = (int) Math.ceil(layout.getLineWidth(0));
|
// textWidth = (int) Math.ceil(layout.getLineWidth(0));
|
||||||
width = Math.min(width, getPaddingLeft() + textWidth + getPaddingRight() + minusWidth + (rightDrawableOutside && rightDrawable != null ? rightDrawable.getIntrinsicWidth() + drawablePadding : 0));
|
width = Math.min(width, getPaddingLeft() + textWidth + getPaddingRight() + minusWidth + (rightDrawableOutside && rightDrawable != null ? rightDrawable.getIntrinsicWidth() + drawablePadding : 0) + (rightDrawableOutside && rightDrawable2 != null ? rightDrawable2.getIntrinsicWidth() + drawablePadding : 0));
|
||||||
}
|
}
|
||||||
setMeasuredDimension(width, finalHeight);
|
setMeasuredDimension(width, finalHeight);
|
||||||
|
|
||||||
|
@ -549,7 +559,7 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean verifyDrawable(@NonNull Drawable who) {
|
protected boolean verifyDrawable(@NonNull Drawable who) {
|
||||||
return who == rightDrawable || who == leftDrawable || super.verifyDrawable(who);
|
return who == rightDrawable || who == rightDrawable2 || who == leftDrawable || super.verifyDrawable(who);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void replaceTextWithDrawable(Drawable drawable, String replacedText) {
|
public void replaceTextWithDrawable(Drawable drawable, String replacedText) {
|
||||||
|
@ -599,6 +609,26 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setRightDrawable2(Drawable drawable) {
|
||||||
|
if (rightDrawable2 == drawable) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (rightDrawable2 != null) {
|
||||||
|
rightDrawable2.setCallback(null);
|
||||||
|
}
|
||||||
|
rightDrawable2 = drawable;
|
||||||
|
if (drawable != null) {
|
||||||
|
drawable.setCallback(this);
|
||||||
|
}
|
||||||
|
if (!recreateLayoutMaybe()) {
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Drawable getRightDrawable2() {
|
||||||
|
return rightDrawable2;
|
||||||
|
}
|
||||||
|
|
||||||
public void setRightDrawableScale(float scale) {
|
public void setRightDrawableScale(float scale) {
|
||||||
rightDrawableScale = scale;
|
rightDrawableScale = scale;
|
||||||
}
|
}
|
||||||
|
@ -717,6 +747,11 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
width -= rightDrawableWidth;
|
width -= rightDrawableWidth;
|
||||||
width -= drawablePadding;
|
width -= drawablePadding;
|
||||||
}
|
}
|
||||||
|
if (rightDrawable2 != null && !rightDrawableOutside) {
|
||||||
|
rightDrawableWidth = (int) (rightDrawable2.getIntrinsicWidth() * rightDrawableScale);
|
||||||
|
width -= rightDrawableWidth;
|
||||||
|
width -= drawablePadding;
|
||||||
|
}
|
||||||
if (replacedText != null && replacedDrawable != null) {
|
if (replacedText != null && replacedDrawable != null) {
|
||||||
if ((replacingDrawableTextIndex = text.toString().indexOf(replacedText)) < 0) {
|
if ((replacingDrawableTextIndex = text.toString().indexOf(replacedText)) < 0) {
|
||||||
width -= replacedDrawable.getIntrinsicWidth();
|
width -= replacedDrawable.getIntrinsicWidth();
|
||||||
|
@ -808,6 +843,27 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
rightDrawable.draw(canvas);
|
rightDrawable.draw(canvas);
|
||||||
totalWidth += drawablePadding + dw;
|
totalWidth += drawablePadding + dw;
|
||||||
}
|
}
|
||||||
|
if (rightDrawable2 != null && !rightDrawableHidden && rightDrawableScale > 0 && !rightDrawableOutside) {
|
||||||
|
int x = textOffsetX + textWidth + drawablePadding + (int) -scrollingOffset;
|
||||||
|
if (rightDrawable != null) {
|
||||||
|
x += (int) (rightDrawable.getIntrinsicWidth() * rightDrawableScale) + drawablePadding;
|
||||||
|
}
|
||||||
|
if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.CENTER_HORIZONTAL ||
|
||||||
|
(gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.RIGHT) {
|
||||||
|
x += offsetX;
|
||||||
|
}
|
||||||
|
int dw = (int) (rightDrawable2.getIntrinsicWidth() * rightDrawableScale);
|
||||||
|
int dh = (int) (rightDrawable2.getIntrinsicHeight() * rightDrawableScale);
|
||||||
|
int y;
|
||||||
|
if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.CENTER_VERTICAL) {
|
||||||
|
y = (getMeasuredHeight() - dh) / 2 + rightDrawableTopPadding;
|
||||||
|
} else {
|
||||||
|
y = getPaddingTop() + (textHeight - dh) / 2 + rightDrawableTopPadding;
|
||||||
|
}
|
||||||
|
rightDrawable2.setBounds(x, y, x + dw, y + dh);
|
||||||
|
rightDrawable2.draw(canvas);
|
||||||
|
totalWidth += drawablePadding + dw;
|
||||||
|
}
|
||||||
int nextScrollX = totalWidth + AndroidUtilities.dp(DIST_BETWEEN_SCROLLING_TEXT);
|
int nextScrollX = totalWidth + AndroidUtilities.dp(DIST_BETWEEN_SCROLLING_TEXT);
|
||||||
|
|
||||||
if (scrollingOffset != 0) {
|
if (scrollingOffset != 0) {
|
||||||
|
@ -835,6 +891,22 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
rightDrawable.setBounds(x, y, x + dw, y + dh);
|
rightDrawable.setBounds(x, y, x + dw, y + dh);
|
||||||
rightDrawable.draw(canvas);
|
rightDrawable.draw(canvas);
|
||||||
}
|
}
|
||||||
|
if (rightDrawable2 != null && !rightDrawableOutside) {
|
||||||
|
int dw = (int) (rightDrawable2.getIntrinsicWidth() * rightDrawableScale);
|
||||||
|
int dh = (int) (rightDrawable2.getIntrinsicHeight() * rightDrawableScale);
|
||||||
|
int x = textOffsetX + textWidth + drawablePadding + (int) -scrollingOffset + nextScrollX;
|
||||||
|
if (rightDrawable != null) {
|
||||||
|
x += (int) (rightDrawable.getIntrinsicWidth() * rightDrawableScale) + drawablePadding;
|
||||||
|
}
|
||||||
|
int y;
|
||||||
|
if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.CENTER_VERTICAL) {
|
||||||
|
y = (getMeasuredHeight() - dh) / 2 + rightDrawableTopPadding;
|
||||||
|
} else {
|
||||||
|
y = getPaddingTop() + (textHeight - dh) / 2 + rightDrawableTopPadding;
|
||||||
|
}
|
||||||
|
rightDrawable2.setBounds(x, y, x + dw, y + dh);
|
||||||
|
rightDrawable2.draw(canvas);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (layout != null) {
|
if (layout != null) {
|
||||||
|
@ -939,6 +1011,25 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
rightDrawableY = y + (dh >> 1);
|
rightDrawableY = y + (dh >> 1);
|
||||||
rightDrawable.draw(canvas);
|
rightDrawable.draw(canvas);
|
||||||
}
|
}
|
||||||
|
if (rightDrawable2 != null && rightDrawableOutside) {
|
||||||
|
int x = Math.min(
|
||||||
|
textOffsetX + textWidth + drawablePadding + (scrollingOffset == 0 ? -nextScrollX : (int) -scrollingOffset) + nextScrollX,
|
||||||
|
getMaxTextWidth() - paddingRight + drawablePadding
|
||||||
|
);
|
||||||
|
if (rightDrawable != null) {
|
||||||
|
x += (int) (rightDrawable.getIntrinsicWidth() * rightDrawableScale) + drawablePadding;
|
||||||
|
}
|
||||||
|
int dw = (int) (rightDrawable2.getIntrinsicWidth() * rightDrawableScale);
|
||||||
|
int dh = (int) (rightDrawable2.getIntrinsicHeight() * rightDrawableScale);
|
||||||
|
int y;
|
||||||
|
if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.CENTER_VERTICAL) {
|
||||||
|
y = (getMeasuredHeight() - dh) / 2 + rightDrawableTopPadding;
|
||||||
|
} else {
|
||||||
|
y = getPaddingTop() + (textHeight - dh) / 2 + rightDrawableTopPadding;
|
||||||
|
}
|
||||||
|
rightDrawable2.setBounds(x, y, x + dw, y + dh);
|
||||||
|
rightDrawable2.draw(canvas);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getRightDrawableX() {
|
public int getRightDrawableX() {
|
||||||
|
@ -950,7 +1041,7 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getMaxTextWidth() {
|
private int getMaxTextWidth() {
|
||||||
return getMeasuredWidth() - (rightDrawableOutside && rightDrawable != null ? rightDrawable.getIntrinsicWidth() + drawablePadding : 0);
|
return getMeasuredWidth() - (rightDrawableOutside && rightDrawable != null ? rightDrawable.getIntrinsicWidth() + drawablePadding : 0) - (rightDrawableOutside && rightDrawable2 != null ? rightDrawable2.getIntrinsicWidth() + drawablePadding : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawLayout(Canvas canvas) {
|
private void drawLayout(Canvas canvas) {
|
||||||
|
@ -1035,6 +1126,8 @@ public class SimpleTextView extends View implements Drawable.Callback {
|
||||||
invalidate(leftDrawable.getBounds());
|
invalidate(leftDrawable.getBounds());
|
||||||
} else if (who == rightDrawable) {
|
} else if (who == rightDrawable) {
|
||||||
invalidate(rightDrawable.getBounds());
|
invalidate(rightDrawable.getBounds());
|
||||||
|
} else if (who == rightDrawable2) {
|
||||||
|
invalidate(rightDrawable2.getBounds());
|
||||||
} else if (who == replacedDrawable) {
|
} else if (who == replacedDrawable) {
|
||||||
invalidate(replacedDrawable.getBounds());
|
invalidate(replacedDrawable.getBounds());
|
||||||
}
|
}
|
||||||
|
|
|
@ -958,7 +958,7 @@ public class Theme {
|
||||||
}
|
}
|
||||||
if (currentType == TYPE_MEDIA) {
|
if (currentType == TYPE_MEDIA) {
|
||||||
if (customPaint || drawFullBottom) {
|
if (customPaint || drawFullBottom) {
|
||||||
int radToUse = isBottomNear ? nearRad : rad;
|
int radToUse = isBottomNear || botButtonsBottom ? nearRad : rad;
|
||||||
|
|
||||||
path.lineTo(bounds.left + padding, bounds.bottom - padding - radToUse);
|
path.lineTo(bounds.left + padding, bounds.bottom - padding - radToUse);
|
||||||
rect.set(bounds.left + padding, bounds.bottom - padding - radToUse * 2, bounds.left + padding + radToUse * 2, bounds.bottom - padding);
|
rect.set(bounds.left + padding, bounds.bottom - padding - radToUse * 2, bounds.left + padding + radToUse * 2, bounds.bottom - padding);
|
||||||
|
@ -1749,7 +1749,6 @@ public class Theme {
|
||||||
Math.max(0, Color.blue(submenuBackground) - 10)
|
Math.max(0, Color.blue(submenuBackground) - 10)
|
||||||
));
|
));
|
||||||
|
|
||||||
currentColors.put(key_chat_inCodeBackground, codeBackground(inBubble, isDarkTheme));
|
|
||||||
if (isDarkTheme && currentColors.get(key_chat_outBubbleGradient1) != 0) {
|
if (isDarkTheme && currentColors.get(key_chat_outBubbleGradient1) != 0) {
|
||||||
int outBubbleAverage = averageColor(currentColors, key_chat_outBubbleGradient1, key_chat_outBubbleGradient2, key_chat_outBubbleGradient3);
|
int outBubbleAverage = averageColor(currentColors, key_chat_outBubbleGradient1, key_chat_outBubbleGradient2, key_chat_outBubbleGradient3);
|
||||||
Color.colorToHSV(outBubbleAverage, tempHSV);
|
Color.colorToHSV(outBubbleAverage, tempHSV);
|
||||||
|
@ -4126,7 +4125,6 @@ public class Theme {
|
||||||
public static final int key_stories_circle_closeFriends1 = colorsCount++;
|
public static final int key_stories_circle_closeFriends1 = colorsCount++;
|
||||||
public static final int key_stories_circle_closeFriends2 = colorsCount++;
|
public static final int key_stories_circle_closeFriends2 = colorsCount++;
|
||||||
|
|
||||||
public static final int key_code_background = colorsCount++;
|
|
||||||
public static final int key_chat_inCodeBackground = colorsCount++;
|
public static final int key_chat_inCodeBackground = colorsCount++;
|
||||||
public static final int key_chat_outCodeBackground = colorsCount++;
|
public static final int key_chat_outCodeBackground = colorsCount++;
|
||||||
public static final int key_code_keyword = colorsCount++;
|
public static final int key_code_keyword = colorsCount++;
|
||||||
|
@ -4411,6 +4409,7 @@ public class Theme {
|
||||||
themeAccentExclusionKeys.add(key_statisticChartLine_lightgreen);
|
themeAccentExclusionKeys.add(key_statisticChartLine_lightgreen);
|
||||||
themeAccentExclusionKeys.add(key_statisticChartLine_orange);
|
themeAccentExclusionKeys.add(key_statisticChartLine_orange);
|
||||||
themeAccentExclusionKeys.add(key_statisticChartLine_indigo);
|
themeAccentExclusionKeys.add(key_statisticChartLine_indigo);
|
||||||
|
themeAccentExclusionKeys.add(key_chat_inCodeBackground);
|
||||||
|
|
||||||
themeAccentExclusionKeys.add(key_voipgroup_checkMenu);
|
themeAccentExclusionKeys.add(key_voipgroup_checkMenu);
|
||||||
themeAccentExclusionKeys.add(key_voipgroup_muteButton);
|
themeAccentExclusionKeys.add(key_voipgroup_muteButton);
|
||||||
|
@ -5757,7 +5756,7 @@ public class Theme {
|
||||||
ripple = new ShapeDrawable(new RectShape());
|
ripple = new ShapeDrawable(new RectShape());
|
||||||
((ShapeDrawable) ripple).getPaint().setColor(rippleColor);
|
((ShapeDrawable) ripple).getPaint().setColor(rippleColor);
|
||||||
}
|
}
|
||||||
Drawable pressed = new LayerDrawable(new Drawable[] { background, ripple });
|
Drawable pressed = background == null ? ripple : new LayerDrawable(new Drawable[] { background, ripple });
|
||||||
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressed);
|
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressed);
|
||||||
stateListDrawable.addState(new int[]{android.R.attr.state_selected}, pressed);
|
stateListDrawable.addState(new int[]{android.R.attr.state_selected}, pressed);
|
||||||
stateListDrawable.addState(StateSet.WILD_CARD, background);
|
stateListDrawable.addState(StateSet.WILD_CARD, background);
|
||||||
|
@ -5791,7 +5790,7 @@ public class Theme {
|
||||||
} else {
|
} else {
|
||||||
StateListDrawable stateListDrawable = new StateListDrawable();
|
StateListDrawable stateListDrawable = new StateListDrawable();
|
||||||
Drawable ripple = new CircleDrawable(radius, rippleColor);
|
Drawable ripple = new CircleDrawable(radius, rippleColor);
|
||||||
Drawable pressed = new LayerDrawable(new Drawable[] { background, ripple });
|
Drawable pressed = background == null ? ripple : new LayerDrawable(new Drawable[] { background, ripple });
|
||||||
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressed);
|
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressed);
|
||||||
stateListDrawable.addState(new int[]{android.R.attr.state_selected}, pressed);
|
stateListDrawable.addState(new int[]{android.R.attr.state_selected}, pressed);
|
||||||
stateListDrawable.addState(StateSet.WILD_CARD, background);
|
stateListDrawable.addState(StateSet.WILD_CARD, background);
|
||||||
|
@ -9868,9 +9867,13 @@ public class Theme {
|
||||||
MotionBackgroundDrawable motionBackgroundDrawable = new MotionBackgroundDrawable(backgroundColor, gradientToColor1, gradientToColor2, gradientToColor3, false);
|
MotionBackgroundDrawable motionBackgroundDrawable = new MotionBackgroundDrawable(backgroundColor, gradientToColor1, gradientToColor2, gradientToColor3, false);
|
||||||
Bitmap patternBitmap = null;
|
Bitmap patternBitmap = null;
|
||||||
|
|
||||||
if (wallpaperFile != null && wallpaperDocument != null) {
|
if (wallpaperFile != null && !isCustomTheme()) {
|
||||||
|
if (wallpaperDocument != null) {
|
||||||
File f = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(wallpaperDocument, true);
|
File f = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(wallpaperDocument, true);
|
||||||
patternBitmap = SvgHelper.getBitmap(f, AndroidUtilities.dp(360), AndroidUtilities.dp(640), false);
|
patternBitmap = SvgHelper.getBitmap(f, AndroidUtilities.dp(360), AndroidUtilities.dp(640), false);
|
||||||
|
} else {
|
||||||
|
patternBitmap = SvgHelper.getBitmap(R.raw.default_pattern, AndroidUtilities.dp(360), AndroidUtilities.dp(640), Color.WHITE);
|
||||||
|
}
|
||||||
if (patternBitmap != null) {
|
if (patternBitmap != null) {
|
||||||
FileOutputStream stream = null;
|
FileOutputStream stream = null;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -771,8 +771,7 @@ public class ThemeColors {
|
||||||
defaultColors[key_stories_circle_closeFriends1] = 0xFFC9EB38;
|
defaultColors[key_stories_circle_closeFriends1] = 0xFFC9EB38;
|
||||||
defaultColors[key_stories_circle_closeFriends2] = 0xFF09C167;
|
defaultColors[key_stories_circle_closeFriends2] = 0xFF09C167;
|
||||||
|
|
||||||
defaultColors[key_code_background] = 0x20000000;
|
defaultColors[key_chat_inCodeBackground] = 0xff6F889E;
|
||||||
defaultColors[key_chat_inCodeBackground] = 0x08484848;
|
|
||||||
defaultColors[key_chat_outCodeBackground] = 0x123c7503;
|
defaultColors[key_chat_outCodeBackground] = 0x123c7503;
|
||||||
defaultColors[key_code_keyword] = 0xFFE05356;
|
defaultColors[key_code_keyword] = 0xFFE05356;
|
||||||
defaultColors[key_code_operator] = 0xFF4DBBFF;
|
defaultColors[key_code_operator] = 0xFF4DBBFF;
|
||||||
|
@ -1513,7 +1512,6 @@ public class ThemeColors {
|
||||||
colorKeysMap.put(key_stories_circle_dialog2, "stories_circle_dialog2");
|
colorKeysMap.put(key_stories_circle_dialog2, "stories_circle_dialog2");
|
||||||
colorKeysMap.put(key_stories_circle_closeFriends1, "stories_circle_closeFriends1");
|
colorKeysMap.put(key_stories_circle_closeFriends1, "stories_circle_closeFriends1");
|
||||||
colorKeysMap.put(key_stories_circle_closeFriends2, "stories_circle_closeFriends2");
|
colorKeysMap.put(key_stories_circle_closeFriends2, "stories_circle_closeFriends2");
|
||||||
colorKeysMap.put(key_code_background, "code_background");
|
|
||||||
colorKeysMap.put(key_chat_inCodeBackground, "chat_inCodeBackground");
|
colorKeysMap.put(key_chat_inCodeBackground, "chat_inCodeBackground");
|
||||||
colorKeysMap.put(key_chat_outCodeBackground, "chat_outCodeBackground");
|
colorKeysMap.put(key_chat_outCodeBackground, "chat_outCodeBackground");
|
||||||
colorKeysMap.put(key_code_keyword, "code_keyword");
|
colorKeysMap.put(key_code_keyword, "code_keyword");
|
||||||
|
|
|
@ -152,7 +152,7 @@ public class AppIconsSelectorCell extends RecyclerListView implements Notificati
|
||||||
private void updateIconsVisibility() {
|
private void updateIconsVisibility() {
|
||||||
availableIcons.clear();
|
availableIcons.clear();
|
||||||
availableIcons.addAll(Arrays.asList(LauncherIconController.LauncherIcon.values()));
|
availableIcons.addAll(Arrays.asList(LauncherIconController.LauncherIcon.values()));
|
||||||
if (MessagesController.getInstance(currentAccount).premiumLocked) {
|
if (MessagesController.getInstance(currentAccount).premiumFeaturesBlocked()) {
|
||||||
for (int i = 0; i < availableIcons.size(); i++) {
|
for (int i = 0; i < availableIcons.size(); i++) {
|
||||||
if (availableIcons.get(i).premium) {
|
if (availableIcons.get(i).premium) {
|
||||||
availableIcons.remove(i);
|
availableIcons.remove(i);
|
||||||
|
|
|
@ -9,12 +9,15 @@
|
||||||
package org.telegram.ui.Cells;
|
package org.telegram.ui.Cells;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.Canvas;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.view.HapticFeedbackConstants;
|
import android.view.HapticFeedbackConstants;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.ViewConfiguration;
|
import android.view.ViewConfiguration;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import org.telegram.ui.ActionBar.Theme;
|
||||||
|
|
||||||
public abstract class BaseCell extends ViewGroup {
|
public abstract class BaseCell extends ViewGroup {
|
||||||
|
|
||||||
private final class CheckForTap implements Runnable {
|
private final class CheckForTap implements Runnable {
|
||||||
|
@ -110,4 +113,12 @@ public abstract class BaseCell extends ViewGroup {
|
||||||
protected boolean onLongPress() {
|
protected boolean onLongPress() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getBoundsLeft() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBoundsRight() {
|
||||||
|
return getWidth();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ import android.graphics.PorterDuff;
|
||||||
import android.graphics.PorterDuffColorFilter;
|
import android.graphics.PorterDuffColorFilter;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.text.Layout;
|
import android.text.Layout;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
|
@ -42,11 +43,13 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.core.graphics.ColorUtils;
|
import androidx.core.graphics.ColorUtils;
|
||||||
|
|
||||||
import org.telegram.messenger.AndroidUtilities;
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
import org.telegram.messenger.ApplicationLoader;
|
import org.telegram.messenger.ApplicationLoader;
|
||||||
import org.telegram.messenger.BuildVars;
|
import org.telegram.messenger.BuildVars;
|
||||||
|
import org.telegram.messenger.ChatThemeController;
|
||||||
import org.telegram.messenger.DialogObject;
|
import org.telegram.messenger.DialogObject;
|
||||||
import org.telegram.messenger.DocumentObject;
|
import org.telegram.messenger.DocumentObject;
|
||||||
import org.telegram.messenger.DownloadController;
|
import org.telegram.messenger.DownloadController;
|
||||||
|
@ -65,6 +68,7 @@ import org.telegram.messenger.R;
|
||||||
import org.telegram.messenger.SharedConfig;
|
import org.telegram.messenger.SharedConfig;
|
||||||
import org.telegram.messenger.SvgHelper;
|
import org.telegram.messenger.SvgHelper;
|
||||||
import org.telegram.messenger.UserConfig;
|
import org.telegram.messenger.UserConfig;
|
||||||
|
import org.telegram.messenger.UserObject;
|
||||||
import org.telegram.messenger.Utilities;
|
import org.telegram.messenger.Utilities;
|
||||||
import org.telegram.messenger.browser.Browser;
|
import org.telegram.messenger.browser.Browser;
|
||||||
import org.telegram.tgnet.TLObject;
|
import org.telegram.tgnet.TLObject;
|
||||||
|
@ -94,6 +98,7 @@ import org.telegram.ui.PhotoViewer;
|
||||||
import org.telegram.ui.Stories.StoriesUtilities;
|
import org.telegram.ui.Stories.StoriesUtilities;
|
||||||
import org.telegram.ui.Stories.UploadingDotsSpannable;
|
import org.telegram.ui.Stories.UploadingDotsSpannable;
|
||||||
import org.telegram.ui.Stories.recorder.HintView2;
|
import org.telegram.ui.Stories.recorder.HintView2;
|
||||||
|
import org.telegram.ui.Stories.recorder.PreviewView;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -167,7 +172,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
default void didClickButton(ChatActionCell cell) {
|
default void didClickButton(ChatActionCell cell) {
|
||||||
}
|
}
|
||||||
|
|
||||||
default void didOpenPremiumGift(ChatActionCell cell, TLRPC.TL_premiumGiftOption giftOption, boolean animateConfetti) {
|
default void didOpenPremiumGift(ChatActionCell cell, TLRPC.TL_premiumGiftOption giftOption, String slug, boolean animateConfetti) {
|
||||||
}
|
}
|
||||||
|
|
||||||
default void didOpenPremiumGiftChannel(ChatActionCell cell, String slug, boolean animateConfetti) {
|
default void didOpenPremiumGiftChannel(ChatActionCell cell, String slug, boolean animateConfetti) {
|
||||||
|
@ -219,6 +224,8 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
private URLSpan pressedLink;
|
private URLSpan pressedLink;
|
||||||
private int currentAccount = UserConfig.selectedAccount;
|
private int currentAccount = UserConfig.selectedAccount;
|
||||||
private ImageReceiver imageReceiver;
|
private ImageReceiver imageReceiver;
|
||||||
|
private Drawable wallpaperPreviewDrawable;
|
||||||
|
private Path clipPath;
|
||||||
private AvatarDrawable avatarDrawable;
|
private AvatarDrawable avatarDrawable;
|
||||||
private StaticLayout textLayout;
|
private StaticLayout textLayout;
|
||||||
private int textWidth;
|
private int textWidth;
|
||||||
|
@ -267,6 +274,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
private ArrayList<Integer> lineWidths = new ArrayList<>();
|
private ArrayList<Integer> lineWidths = new ArrayList<>();
|
||||||
private ArrayList<Integer> lineHeights = new ArrayList<>();
|
private ArrayList<Integer> lineHeights = new ArrayList<>();
|
||||||
private Path backgroundPath = new Path();
|
private Path backgroundPath = new Path();
|
||||||
|
private int backgroundLeft, backgroundRight;
|
||||||
private RectF rect = new RectF();
|
private RectF rect = new RectF();
|
||||||
private boolean invalidatePath = true;
|
private boolean invalidatePath = true;
|
||||||
private boolean invalidateColors = false;
|
private boolean invalidateColors = false;
|
||||||
|
@ -449,6 +457,9 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
previousWidth = 0;
|
previousWidth = 0;
|
||||||
imageReceiver.setAutoRepeatCount(0);
|
imageReceiver.setAutoRepeatCount(0);
|
||||||
imageReceiver.clearDecorators();
|
imageReceiver.clearDecorators();
|
||||||
|
if (messageObject.type != MessageObject.TYPE_ACTION_WALLPAPER) {
|
||||||
|
wallpaperPreviewDrawable = null;
|
||||||
|
}
|
||||||
if (messageObject.isStoryMention()) {
|
if (messageObject.isStoryMention()) {
|
||||||
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(messageObject.messageOwner.media.user_id);
|
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(messageObject.messageOwner.media.user_id);
|
||||||
avatarDrawable.setInfo(currentAccount, user);
|
avatarDrawable.setInfo(currentAccount, user);
|
||||||
|
@ -470,11 +481,34 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TLRPC.WallPaper wallPaper = null;
|
||||||
|
if (messageObject.currentEvent != null && messageObject.currentEvent.action instanceof TLRPC.TL_channelAdminLogEventActionChangeWallpaper) {
|
||||||
|
wallPaper = ((TLRPC.TL_channelAdminLogEventActionChangeWallpaper) messageObject.currentEvent.action).new_value;
|
||||||
|
} else if (messageObject.messageOwner != null && messageObject.messageOwner.action != null) {
|
||||||
TLRPC.MessageAction action = messageObject.messageOwner.action;
|
TLRPC.MessageAction action = messageObject.messageOwner.action;
|
||||||
if (action.wallpaper.uploadingImage != null) {
|
wallPaper = action.wallpaper;
|
||||||
imageReceiver.setImage(ImageLocation.getForPath(action.wallpaper.uploadingImage), "150_150_wallpaper" + action.wallpaper.id + ChatBackgroundDrawable.hash(action.wallpaper.settings), null, null, ChatBackgroundDrawable.createThumb(action.wallpaper), 0, null, action.wallpaper, 1);
|
}
|
||||||
|
if (!TextUtils.isEmpty(ChatThemeController.getWallpaperEmoticon(wallPaper))) {
|
||||||
|
final boolean isDark = themeDelegate != null ? themeDelegate.isDark() : Theme.isCurrentThemeDark();
|
||||||
|
imageReceiver.clearImage();
|
||||||
|
wallpaperPreviewDrawable = PreviewView.getBackgroundDrawableFromTheme(currentAccount, ChatThemeController.getWallpaperEmoticon(wallPaper), isDark, false);
|
||||||
|
if (wallpaperPreviewDrawable != null) {
|
||||||
|
wallpaperPreviewDrawable.setCallback(this);
|
||||||
|
}
|
||||||
|
} else if (wallPaper != null && wallPaper.uploadingImage != null) {
|
||||||
|
imageReceiver.setImage(ImageLocation.getForPath(wallPaper.uploadingImage), "150_150_wallpaper" + wallPaper.id + ChatBackgroundDrawable.hash(wallPaper.settings), null, null, ChatBackgroundDrawable.createThumb(wallPaper), 0, null, wallPaper, 1);
|
||||||
|
wallpaperPreviewDrawable = null;
|
||||||
|
} else if (wallPaper != null) {
|
||||||
|
TLRPC.Document document = null;
|
||||||
|
if (messageObject.photoThumbsObject instanceof TLRPC.Document) {
|
||||||
|
document = (TLRPC.Document) messageObject.photoThumbsObject;
|
||||||
|
} else if (wallPaper != null) {
|
||||||
|
document = wallPaper.document;
|
||||||
|
}
|
||||||
|
imageReceiver.setImage(ImageLocation.getForDocument(document), "150_150_wallpaper" + wallPaper.id + ChatBackgroundDrawable.hash(wallPaper.settings), null, null, ChatBackgroundDrawable.createThumb(wallPaper), 0, null, wallPaper, 1);
|
||||||
|
wallpaperPreviewDrawable = null;
|
||||||
} else {
|
} else {
|
||||||
imageReceiver.setImage(ImageLocation.getForDocument((TLRPC.Document) messageObject.photoThumbsObject), "150_150_wallpaper" + action.wallpaper.id + ChatBackgroundDrawable.hash(action.wallpaper.settings), null, null, ChatBackgroundDrawable.createThumb(action.wallpaper), 0, null, action.wallpaper, 1);
|
wallpaperPreviewDrawable = null;
|
||||||
}
|
}
|
||||||
imageReceiver.setRoundRadius((int) (stickerSize / 2f));
|
imageReceiver.setRoundRadius((int) (stickerSize / 2f));
|
||||||
|
|
||||||
|
@ -548,12 +582,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
set = MediaDataController.getInstance(currentAccount).getStickerSetByEmojiOrName(packName);
|
set = MediaDataController.getInstance(currentAccount).getStickerSetByEmojiOrName(packName);
|
||||||
}
|
}
|
||||||
if (set != null) {
|
if (set != null) {
|
||||||
int months;
|
int months = messageObject.messageOwner.action.months;
|
||||||
if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionGiftCode) {
|
|
||||||
months = ((TLRPC.TL_messageActionGiftCode) messageObject.messageOwner.action).months;
|
|
||||||
} else {
|
|
||||||
months = messageObject.messageOwner.action.months;
|
|
||||||
}
|
|
||||||
String monthsEmoticon;
|
String monthsEmoticon;
|
||||||
if (USE_PREMIUM_GIFT_MONTHS_AS_EMOJI_NUMBERS) {
|
if (USE_PREMIUM_GIFT_MONTHS_AS_EMOJI_NUMBERS) {
|
||||||
StringBuilder monthsEmoticonBuilder = new StringBuilder();
|
StringBuilder monthsEmoticonBuilder = new StringBuilder();
|
||||||
|
@ -916,15 +945,33 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isSelfGiftCode() {
|
||||||
|
if (currentMessageObject != null && currentMessageObject.messageOwner.action instanceof TLRPC.TL_messageActionGiftCode) {
|
||||||
|
if (currentMessageObject.messageOwner.from_id instanceof TLRPC.TL_peerUser) {
|
||||||
|
return MessagesController.getInstance(currentAccount).getUser(currentMessageObject.messageOwner.from_id.user_id).self;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isGiftCode() {
|
||||||
|
return currentMessageObject != null && currentMessageObject.messageOwner.action instanceof TLRPC.TL_messageActionGiftCode;
|
||||||
|
}
|
||||||
|
|
||||||
private void openPremiumGiftPreview() {
|
private void openPremiumGiftPreview() {
|
||||||
TLRPC.TL_premiumGiftOption giftOption = new TLRPC.TL_premiumGiftOption();
|
TLRPC.TL_premiumGiftOption giftOption = new TLRPC.TL_premiumGiftOption();
|
||||||
TLRPC.MessageAction action = currentMessageObject.messageOwner.action;
|
TLRPC.MessageAction action = currentMessageObject.messageOwner.action;
|
||||||
giftOption.amount = action.amount;
|
giftOption.amount = action.amount;
|
||||||
giftOption.months = action.months;
|
giftOption.months = action.months;
|
||||||
giftOption.currency = action.currency;
|
giftOption.currency = action.currency;
|
||||||
|
String slug;
|
||||||
|
if (isGiftCode()) {
|
||||||
|
slug = isSelfGiftCode() ? null : ((TLRPC.TL_messageActionGiftCode) currentMessageObject.messageOwner.action).slug;
|
||||||
|
} else {
|
||||||
|
slug = null;
|
||||||
|
}
|
||||||
if (delegate != null) {
|
if (delegate != null) {
|
||||||
AndroidUtilities.runOnUIThread(() -> delegate.didOpenPremiumGift(ChatActionCell.this, giftOption, false));
|
AndroidUtilities.runOnUIThread(() -> delegate.didOpenPremiumGift(ChatActionCell.this, giftOption, slug, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1159,7 +1206,13 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
if (messageObject.messageOwner.media.photo != null) {
|
if (messageObject.messageOwner.media.photo != null) {
|
||||||
text = LocaleController.getString(R.string.AttachPhotoExpired);
|
text = LocaleController.getString(R.string.AttachPhotoExpired);
|
||||||
} else if (messageObject.messageOwner.media.document instanceof TLRPC.TL_documentEmpty || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument && messageObject.messageOwner.media.document == null) {
|
} else if (messageObject.messageOwner.media.document instanceof TLRPC.TL_documentEmpty || messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument && messageObject.messageOwner.media.document == null) {
|
||||||
|
if (messageObject.messageOwner.media.voice) {
|
||||||
|
text = LocaleController.getString(R.string.AttachVoiceExpired);
|
||||||
|
} else if (messageObject.messageOwner.media.round) {
|
||||||
|
text = LocaleController.getString(R.string.AttachRoundExpired);
|
||||||
|
} else {
|
||||||
text = LocaleController.getString(R.string.AttachVideoExpired);
|
text = LocaleController.getString(R.string.AttachVideoExpired);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
text = AnimatedEmojiSpan.cloneSpans(messageObject.messageText);
|
text = AnimatedEmojiSpan.cloneSpans(messageObject.messageText);
|
||||||
}
|
}
|
||||||
|
@ -1177,7 +1230,9 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
} else if (messageObject.type == MessageObject.TYPE_GIFT_PREMIUM_CHANNEL) {
|
} else if (messageObject.type == MessageObject.TYPE_GIFT_PREMIUM_CHANNEL) {
|
||||||
createGiftPremiumChannelLayouts();
|
createGiftPremiumChannelLayouts();
|
||||||
} else if (messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) {
|
} else if (messageObject.type == MessageObject.TYPE_GIFT_PREMIUM) {
|
||||||
createGiftPremiumLayouts(LocaleController.getString(R.string.ActionGiftPremiumTitle), LocaleController.formatString(R.string.ActionGiftPremiumSubtitle, LocaleController.formatPluralString("Months", messageObject.messageOwner.action.months)), LocaleController.getString(R.string.ActionGiftPremiumView), giftRectSize, true);
|
String actionName = isGiftCode() && !isSelfGiftCode() ? LocaleController.getString("GiftPremiumUseGiftBtn", R.string.GiftPremiumUseGiftBtn) :
|
||||||
|
LocaleController.getString("ActionGiftPremiumView", R.string.ActionGiftPremiumView);
|
||||||
|
createGiftPremiumLayouts(LocaleController.getString(R.string.ActionGiftPremiumTitle), LocaleController.formatString(R.string.ActionGiftPremiumSubtitle, LocaleController.formatPluralString("Months", messageObject.messageOwner.action.months)), actionName, giftRectSize, true);
|
||||||
} else if (messageObject.type == MessageObject.TYPE_SUGGEST_PHOTO) {
|
} else if (messageObject.type == MessageObject.TYPE_SUGGEST_PHOTO) {
|
||||||
TLRPC.TL_messageActionSuggestProfilePhoto actionSuggestProfilePhoto = (TLRPC.TL_messageActionSuggestProfilePhoto) messageObject.messageOwner.action;
|
TLRPC.TL_messageActionSuggestProfilePhoto actionSuggestProfilePhoto = (TLRPC.TL_messageActionSuggestProfilePhoto) messageObject.messageOwner.action;
|
||||||
String description;
|
String description;
|
||||||
|
@ -1212,11 +1267,13 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
CharSequence description;
|
CharSequence description;
|
||||||
String action = null;
|
String action = null;
|
||||||
boolean actionClickableAsImage = true;
|
boolean actionClickableAsImage = true;
|
||||||
if (!messageObject.isOutOwner() && messageObject.isWallpaperForBoth() && messageObject.isCurrentWallpaper()) {
|
if (messageObject.getDialogId() < 0) {
|
||||||
|
description = messageObject.messageText;
|
||||||
|
} else if (!messageObject.isOutOwner() && messageObject.isWallpaperForBoth() && messageObject.isCurrentWallpaper()) {
|
||||||
description = messageObject.messageText;
|
description = messageObject.messageText;
|
||||||
action = LocaleController.getString(R.string.RemoveWallpaperAction);
|
action = LocaleController.getString(R.string.RemoveWallpaperAction);
|
||||||
actionClickableAsImage = false;
|
actionClickableAsImage = false;
|
||||||
} else if (user.id == UserConfig.getInstance(currentAccount).clientUserId) {
|
} else if (user != null && user.id == UserConfig.getInstance(currentAccount).clientUserId) {
|
||||||
description = messageObject.messageText;
|
description = messageObject.messageText;
|
||||||
} else {
|
} else {
|
||||||
description = messageObject.messageText;
|
description = messageObject.messageText;
|
||||||
|
@ -1310,7 +1367,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
giftSubtitlePaint.setTextSize(dp(15));
|
giftSubtitlePaint.setTextSize(dp(15));
|
||||||
}
|
}
|
||||||
int subtitleWidth = giftPremiumSubtitleWidth = width;
|
int subtitleWidth = giftPremiumSubtitleWidth = width;
|
||||||
if (currentMessageObject != null && currentMessageObject.type == MessageObject.TYPE_ACTION_WALLPAPER) {
|
if (currentMessageObject != null && (currentMessageObject.type == MessageObject.TYPE_ACTION_WALLPAPER && currentMessageObject.getDialogId() >= 0)) {
|
||||||
final int recommendedWidthForTwoLines = HintView2.cutInFancyHalf(subtitle, giftSubtitlePaint);
|
final int recommendedWidthForTwoLines = HintView2.cutInFancyHalf(subtitle, giftSubtitlePaint);
|
||||||
if (recommendedWidthForTwoLines < subtitleWidth && recommendedWidthForTwoLines > subtitleWidth / 5f) {
|
if (recommendedWidthForTwoLines < subtitleWidth && recommendedWidthForTwoLines > subtitleWidth / 5f) {
|
||||||
subtitleWidth = recommendedWidthForTwoLines;
|
subtitleWidth = recommendedWidthForTwoLines;
|
||||||
|
@ -1384,6 +1441,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
}
|
}
|
||||||
if (giftSubtitlePaint != null && giftSubtitlePaint.getColor() != textPaint.getColor()) {
|
if (giftSubtitlePaint != null && giftSubtitlePaint.getColor() != textPaint.getColor()) {
|
||||||
giftSubtitlePaint.setColor(textPaint.getColor());
|
giftSubtitlePaint.setColor(textPaint.getColor());
|
||||||
|
giftSubtitlePaint.linkColor = textPaint.getColor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1391,7 +1449,20 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
drawBackground(canvas, false);
|
drawBackground(canvas, false);
|
||||||
|
|
||||||
if (isButtonLayout(messageObject) || (messageObject != null && messageObject.type == MessageObject.TYPE_ACTION_PHOTO)) {
|
if (isButtonLayout(messageObject) || (messageObject != null && messageObject.type == MessageObject.TYPE_ACTION_PHOTO)) {
|
||||||
if (messageObject.isStoryMention()) {
|
if (wallpaperPreviewDrawable != null) {
|
||||||
|
canvas.save();
|
||||||
|
canvas.translate(imageReceiver.getImageX(), imageReceiver.getImageY());
|
||||||
|
if (clipPath == null) {
|
||||||
|
clipPath = new Path();
|
||||||
|
} else {
|
||||||
|
clipPath.rewind();
|
||||||
|
}
|
||||||
|
clipPath.addCircle(imageReceiver.getImageWidth() / 2f, imageReceiver.getImageHeight() / 2f, imageReceiver.getImageWidth() / 2f, Path.Direction.CW);
|
||||||
|
canvas.clipPath(clipPath);
|
||||||
|
wallpaperPreviewDrawable.setBounds(0, 0, (int) imageReceiver.getImageWidth(), (int) imageReceiver.getImageHeight());
|
||||||
|
wallpaperPreviewDrawable.draw(canvas);
|
||||||
|
canvas.restore();
|
||||||
|
} else if (messageObject.isStoryMention()) {
|
||||||
long dialogId = messageObject.messageOwner.media.user_id;
|
long dialogId = messageObject.messageOwner.media.user_id;
|
||||||
avatarStoryParams.storyId = messageObject.messageOwner.media.id;
|
avatarStoryParams.storyId = messageObject.messageOwner.media.id;
|
||||||
StoriesUtilities.drawAvatarWithStory(dialogId, canvas, imageReceiver, avatarStoryParams);
|
StoriesUtilities.drawAvatarWithStory(dialogId, canvas, imageReceiver, avatarStoryParams);
|
||||||
|
@ -1519,6 +1590,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
int oldColor = giftSubtitlePaint.getColor();
|
int oldColor = giftSubtitlePaint.getColor();
|
||||||
settingWallpaperPaint.setAlpha((int) (Color.alpha(oldColor) * (1f - p)));
|
settingWallpaperPaint.setAlpha((int) (Color.alpha(oldColor) * (1f - p)));
|
||||||
giftSubtitlePaint.setAlpha((int) (Color.alpha(oldColor) * p));
|
giftSubtitlePaint.setAlpha((int) (Color.alpha(oldColor) * p));
|
||||||
|
giftSubtitlePaint.linkColor = giftSubtitlePaint.getColor();
|
||||||
|
|
||||||
float s = 0.8f + 0.2f * p;
|
float s = 0.8f + 0.2f * p;
|
||||||
canvas.save();
|
canvas.save();
|
||||||
|
@ -1528,6 +1600,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
|
|
||||||
giftSubtitlePaint.setAlpha((int) (Color.alpha(oldColor) * (1f - p)));
|
giftSubtitlePaint.setAlpha((int) (Color.alpha(oldColor) * (1f - p)));
|
||||||
|
giftSubtitlePaint.linkColor = giftSubtitlePaint.getColor();
|
||||||
s = 0.8f + 0.2f * (1f - p);
|
s = 0.8f + 0.2f * (1f - p);
|
||||||
canvas.save();
|
canvas.save();
|
||||||
canvas.scale(s, s, settingWallpaperLayout.getWidth() / 2f, settingWallpaperLayout.getHeight() / 2f);
|
canvas.scale(s, s, settingWallpaperLayout.getWidth() / 2f, settingWallpaperLayout.getHeight() / 2f);
|
||||||
|
@ -1542,6 +1615,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
|
|
||||||
|
|
||||||
giftSubtitlePaint.setColor(oldColor);
|
giftSubtitlePaint.setColor(oldColor);
|
||||||
|
giftSubtitlePaint.linkColor = oldColor;
|
||||||
} else {
|
} else {
|
||||||
settingWallpaperLayout.draw(canvas);
|
settingWallpaperLayout.draw(canvas);
|
||||||
canvas.save();
|
canvas.save();
|
||||||
|
@ -1679,6 +1753,11 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
return super.drawChild(canvas, child, drawingTime);
|
return super.drawChild(canvas, child, drawingTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkLeftRightBounds() {
|
||||||
|
backgroundLeft = (int) Math.min(backgroundLeft, rect.left);
|
||||||
|
backgroundRight = (int) Math.max(backgroundRight, rect.right);
|
||||||
|
}
|
||||||
|
|
||||||
public void drawBackground(Canvas canvas, boolean fromParent) {
|
public void drawBackground(Canvas canvas, boolean fromParent) {
|
||||||
if (canDrawInParent) {
|
if (canDrawInParent) {
|
||||||
if (hasGradientService() && !fromParent) {
|
if (hasGradientService() && !fromParent) {
|
||||||
|
@ -1706,6 +1785,8 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
}
|
}
|
||||||
if (invalidatePath) {
|
if (invalidatePath) {
|
||||||
invalidatePath = false;
|
invalidatePath = false;
|
||||||
|
backgroundLeft = getWidth();
|
||||||
|
backgroundRight = 0;
|
||||||
lineWidths.clear();
|
lineWidths.clear();
|
||||||
final int count = textLayout == null ? 0 : textLayout.getLineCount();
|
final int count = textLayout == null ? 0 : textLayout.getLineCount();
|
||||||
final int corner = dp(11);
|
final int corner = dp(11);
|
||||||
|
@ -1771,9 +1852,11 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
|
|
||||||
if (a == 0 || lineWidth > prevLineWidth) {
|
if (a == 0 || lineWidth > prevLineWidth) {
|
||||||
rect.set(startX - cornerOffset - corner, y, startX + cornerRest, y + corner * 2);
|
rect.set(startX - cornerOffset - corner, y, startX + cornerRest, y + corner * 2);
|
||||||
|
checkLeftRightBounds();
|
||||||
backgroundPath.arcTo(rect, -90, 90);
|
backgroundPath.arcTo(rect, -90, 90);
|
||||||
} else if (lineWidth < prevLineWidth) {
|
} else if (lineWidth < prevLineWidth) {
|
||||||
rect.set(startX + cornerRest, y, startX + cornerRest + innerCornerRad * 2, y + innerCornerRad * 2);
|
rect.set(startX + cornerRest, y, startX + cornerRest + innerCornerRad * 2, y + innerCornerRad * 2);
|
||||||
|
checkLeftRightBounds();
|
||||||
backgroundPath.arcTo(rect, -90, -90);
|
backgroundPath.arcTo(rect, -90, -90);
|
||||||
}
|
}
|
||||||
y += height;
|
y += height;
|
||||||
|
@ -1790,9 +1873,11 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
|
|
||||||
if (a == count - 1 || lineWidth > nextLineWidth) {
|
if (a == count - 1 || lineWidth > nextLineWidth) {
|
||||||
rect.set(startX - cornerOffset - corner, y - corner * 2, startX + cornerRest, y);
|
rect.set(startX - cornerOffset - corner, y - corner * 2, startX + cornerRest, y);
|
||||||
|
checkLeftRightBounds();
|
||||||
backgroundPath.arcTo(rect, 0, 90);
|
backgroundPath.arcTo(rect, 0, 90);
|
||||||
} else if (lineWidth < nextLineWidth) {
|
} else if (lineWidth < nextLineWidth) {
|
||||||
rect.set(startX + cornerRest, y - innerCornerRad * 2, startX + cornerRest + innerCornerRad * 2, y);
|
rect.set(startX + cornerRest, y - innerCornerRad * 2, startX + cornerRest + innerCornerRad * 2, y);
|
||||||
|
checkLeftRightBounds();
|
||||||
backgroundPath.arcTo(rect, 180, -90);
|
backgroundPath.arcTo(rect, 180, -90);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1814,9 +1899,11 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
|
|
||||||
if (a == count - 1 || lineWidth > nextLineWidth) {
|
if (a == count - 1 || lineWidth > nextLineWidth) {
|
||||||
rect.set(startX - cornerRest, y - corner * 2, startX + cornerOffset + corner, y);
|
rect.set(startX - cornerRest, y - corner * 2, startX + cornerOffset + corner, y);
|
||||||
|
checkLeftRightBounds();
|
||||||
backgroundPath.arcTo(rect, 90, 90);
|
backgroundPath.arcTo(rect, 90, 90);
|
||||||
} else if (lineWidth < nextLineWidth) {
|
} else if (lineWidth < nextLineWidth) {
|
||||||
rect.set(startX - cornerRest - innerCornerRad * 2, y - innerCornerRad * 2, startX - cornerRest, y);
|
rect.set(startX - cornerRest - innerCornerRad * 2, y - innerCornerRad * 2, startX - cornerRest, y);
|
||||||
|
checkLeftRightBounds();
|
||||||
backgroundPath.arcTo(rect, 90, -90);
|
backgroundPath.arcTo(rect, 90, -90);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1824,9 +1911,11 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
|
|
||||||
if (a == 0 || lineWidth > prevLineWidth) {
|
if (a == 0 || lineWidth > prevLineWidth) {
|
||||||
rect.set(startX - cornerRest, y, startX + cornerOffset + corner, y + corner * 2);
|
rect.set(startX - cornerRest, y, startX + cornerOffset + corner, y + corner * 2);
|
||||||
|
checkLeftRightBounds();
|
||||||
backgroundPath.arcTo(rect, 180, 90);
|
backgroundPath.arcTo(rect, 180, 90);
|
||||||
} else if (lineWidth < prevLineWidth) {
|
} else if (lineWidth < prevLineWidth) {
|
||||||
rect.set(startX - cornerRest - innerCornerRad * 2, y, startX - cornerRest, y + innerCornerRad * 2);
|
rect.set(startX - cornerRest - innerCornerRad * 2, y, startX - cornerRest, y + innerCornerRad * 2);
|
||||||
|
checkLeftRightBounds();
|
||||||
backgroundPath.arcTo(rect, 0, -90);
|
backgroundPath.arcTo(rect, 0, -90);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1896,6 +1985,30 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getBoundsLeft() {
|
||||||
|
if (isButtonLayout(currentMessageObject)) {
|
||||||
|
return (getWidth() - giftRectSize) / 2;
|
||||||
|
}
|
||||||
|
int left = backgroundLeft;
|
||||||
|
if (imageReceiver != null && imageReceiver.getVisible()) {
|
||||||
|
left = Math.min((int) imageReceiver.getImageX(), left);
|
||||||
|
}
|
||||||
|
return left;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getBoundsRight() {
|
||||||
|
if (isButtonLayout(currentMessageObject)) {
|
||||||
|
return (getWidth() + giftRectSize) / 2;
|
||||||
|
}
|
||||||
|
int right = backgroundRight;
|
||||||
|
if (imageReceiver != null && imageReceiver.getVisible()) {
|
||||||
|
right = Math.max((int) imageReceiver.getImageX2(), right);
|
||||||
|
}
|
||||||
|
return right;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean hasGradientService() {
|
public boolean hasGradientService() {
|
||||||
return overrideBackgroundPaint == null && (themeDelegate != null ? themeDelegate.hasGradientService() : Theme.hasGradientService());
|
return overrideBackgroundPaint == null && (themeDelegate != null ? themeDelegate.hasGradientService() : Theme.hasGradientService());
|
||||||
}
|
}
|
||||||
|
@ -1987,7 +2100,7 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
return Theme.getColor(key, themeDelegate);
|
return Theme.getColor(key, themeDelegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Paint getThemedPaint(String paintKey) {
|
protected Paint getThemedPaint(String paintKey) {
|
||||||
Paint paint = themeDelegate != null ? themeDelegate.getPaint(paintKey) : null;
|
Paint paint = themeDelegate != null ? themeDelegate.getPaint(paintKey) : null;
|
||||||
return paint != null ? paint : Theme.getThemePaint(paintKey);
|
return paint != null ? paint : Theme.getThemePaint(paintKey);
|
||||||
}
|
}
|
||||||
|
@ -2031,6 +2144,11 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean verifyDrawable(@NonNull Drawable who) {
|
||||||
|
return who == wallpaperPreviewDrawable || super.verifyDrawable(who);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isFloating() {
|
public boolean isFloating() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1169,6 +1169,11 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava
|
||||||
} else if (chat.fake) {
|
} else if (chat.fake) {
|
||||||
drawScam = 2;
|
drawScam = 2;
|
||||||
Theme.dialogs_fakeDrawable.checkText();
|
Theme.dialogs_fakeDrawable.checkText();
|
||||||
|
} else if (DialogObject.getEmojiStatusDocumentId(chat.emoji_status) != 0) {
|
||||||
|
drawPremium = true;
|
||||||
|
nameLayoutEllipsizeByGradient = true;
|
||||||
|
emojiStatus.center = LocaleController.isRTL;
|
||||||
|
emojiStatus.set(DialogObject.getEmojiStatusDocumentId(chat.emoji_status), false);
|
||||||
} else {
|
} else {
|
||||||
drawVerified = !forbidVerified && chat.verified;
|
drawVerified = !forbidVerified && chat.verified;
|
||||||
}
|
}
|
||||||
|
@ -1472,7 +1477,13 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava
|
||||||
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && message.messageOwner.media.photo instanceof TLRPC.TL_photoEmpty && message.messageOwner.media.ttl_seconds != 0) {
|
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && message.messageOwner.media.photo instanceof TLRPC.TL_photoEmpty && message.messageOwner.media.ttl_seconds != 0) {
|
||||||
messageString = LocaleController.getString("AttachPhotoExpired", R.string.AttachPhotoExpired);
|
messageString = LocaleController.getString("AttachPhotoExpired", R.string.AttachPhotoExpired);
|
||||||
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaDocument && (message.messageOwner.media.document instanceof TLRPC.TL_documentEmpty || message.messageOwner.media.document == null) && message.messageOwner.media.ttl_seconds != 0) {
|
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaDocument && (message.messageOwner.media.document instanceof TLRPC.TL_documentEmpty || message.messageOwner.media.document == null) && message.messageOwner.media.ttl_seconds != 0) {
|
||||||
messageString = LocaleController.getString("AttachVideoExpired", R.string.AttachVideoExpired);
|
if (message.messageOwner.media.voice) {
|
||||||
|
messageString = LocaleController.getString(R.string.AttachVoiceExpired);
|
||||||
|
} else if (message.messageOwner.media.round) {
|
||||||
|
messageString = LocaleController.getString(R.string.AttachRoundExpired);
|
||||||
|
} else {
|
||||||
|
messageString = LocaleController.getString(R.string.AttachVideoExpired);
|
||||||
|
}
|
||||||
} else if (getCaptionMessage() != null) {
|
} else if (getCaptionMessage() != null) {
|
||||||
MessageObject message = getCaptionMessage();
|
MessageObject message = getCaptionMessage();
|
||||||
String emoji;
|
String emoji;
|
||||||
|
@ -1522,8 +1533,9 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava
|
||||||
currentMessagePaint = Theme.dialogs_messagePrintingPaint[paintIndex];
|
currentMessagePaint = Theme.dialogs_messagePrintingPaint[paintIndex];
|
||||||
} else {
|
} else {
|
||||||
if (message.messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
|
if (message.messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
|
||||||
TLRPC.TL_messageMediaGiveaway mediaPoll = (TLRPC.TL_messageMediaGiveaway) message.messageOwner.media;
|
|
||||||
messageString = LocaleController.getString("BoostingGiveawayChannelStarted", R.string.BoostingGiveawayChannelStarted);
|
messageString = LocaleController.getString("BoostingGiveawayChannelStarted", R.string.BoostingGiveawayChannelStarted);
|
||||||
|
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaGiveawayResults) {
|
||||||
|
messageString = LocaleController.getString("BoostingGiveawayResults", R.string.BoostingGiveawayResults);
|
||||||
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
|
} else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) {
|
||||||
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) message.messageOwner.media;
|
TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) message.messageOwner.media;
|
||||||
messageString = "\uD83D\uDCCA " + mediaPoll.poll.question;
|
messageString = "\uD83D\uDCCA " + mediaPoll.poll.question;
|
||||||
|
@ -2722,18 +2734,30 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava
|
||||||
invalidate = true;
|
invalidate = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (user != null && (mask & MessagesController.UPDATE_MASK_EMOJI_STATUS) != 0) {
|
if ((mask & MessagesController.UPDATE_MASK_EMOJI_STATUS) != 0) {
|
||||||
|
if (user != null) {
|
||||||
user = MessagesController.getInstance(currentAccount).getUser(user.id);
|
user = MessagesController.getInstance(currentAccount).getUser(user.id);
|
||||||
Long emojiStatusId = UserObject.getEmojiStatusDocumentId(user);
|
if (user != null && DialogObject.getEmojiStatusDocumentId(user.emoji_status) != 0) {
|
||||||
if (emojiStatusId != null) {
|
|
||||||
nameLayoutEllipsizeByGradient = true;
|
nameLayoutEllipsizeByGradient = true;
|
||||||
emojiStatus.set(emojiStatusId, animated);
|
emojiStatus.set(DialogObject.getEmojiStatusDocumentId(user.emoji_status), animated);
|
||||||
} else {
|
} else {
|
||||||
nameLayoutEllipsizeByGradient = true;
|
nameLayoutEllipsizeByGradient = true;
|
||||||
emojiStatus.set(PremiumGradient.getInstance().premiumStarDrawableMini, animated);
|
emojiStatus.set(PremiumGradient.getInstance().premiumStarDrawableMini, animated);
|
||||||
}
|
}
|
||||||
invalidate = true;
|
invalidate = true;
|
||||||
}
|
}
|
||||||
|
if (chat != null) {
|
||||||
|
chat = MessagesController.getInstance(currentAccount).getChat(chat.id);
|
||||||
|
if (chat != null && DialogObject.getEmojiStatusDocumentId(chat.emoji_status) != 0) {
|
||||||
|
nameLayoutEllipsizeByGradient = true;
|
||||||
|
emojiStatus.set(DialogObject.getEmojiStatusDocumentId(chat.emoji_status), animated);
|
||||||
|
} else {
|
||||||
|
nameLayoutEllipsizeByGradient = true;
|
||||||
|
emojiStatus.set(PremiumGradient.getInstance().premiumStarDrawableMini, animated);
|
||||||
|
}
|
||||||
|
invalidate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (isDialogCell || isTopic) {
|
if (isDialogCell || isTopic) {
|
||||||
if ((mask & MessagesController.UPDATE_MASK_USER_PRINT) != 0) {
|
if ((mask & MessagesController.UPDATE_MASK_USER_PRINT) != 0) {
|
||||||
CharSequence printString = MessagesController.getInstance(currentAccount).getPrintingString(currentDialogId, getTopicId(), true);
|
CharSequence printString = MessagesController.getInstance(currentAccount).getPrintingString(currentDialogId, getTopicId(), true);
|
||||||
|
|
|
@ -17,16 +17,18 @@ import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import org.telegram.messenger.AndroidUtilities;
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
|
import org.telegram.messenger.Emoji;
|
||||||
import org.telegram.messenger.LocaleController;
|
import org.telegram.messenger.LocaleController;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
import org.telegram.ui.ActionBar.Theme;
|
import org.telegram.ui.ActionBar.Theme;
|
||||||
import org.telegram.ui.Components.LayoutHelper;
|
import org.telegram.ui.Components.LayoutHelper;
|
||||||
|
|
||||||
public class DialogsHintCell extends FrameLayout {
|
public class DialogsHintCell extends FrameLayout {
|
||||||
private LinearLayout contentView;
|
private final LinearLayout contentView;
|
||||||
private TextView titleView;
|
private final TextView titleView;
|
||||||
private TextView messageView;
|
private final TextView messageView;
|
||||||
private ImageView chevronView;
|
private final ImageView chevronView;
|
||||||
|
private final ImageView closeView;
|
||||||
|
|
||||||
public DialogsHintCell(@NonNull Context context) {
|
public DialogsHintCell(@NonNull Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
@ -43,7 +45,7 @@ public class DialogsHintCell extends FrameLayout {
|
||||||
titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
|
titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
|
||||||
titleView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
|
titleView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM));
|
||||||
titleView.setSingleLine();
|
titleView.setSingleLine();
|
||||||
contentView.addView(titleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, Gravity.TOP));
|
contentView.addView(titleView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP));
|
||||||
|
|
||||||
messageView = new TextView(context);
|
messageView = new TextView(context);
|
||||||
messageView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
messageView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
|
||||||
|
@ -55,6 +57,12 @@ public class DialogsHintCell extends FrameLayout {
|
||||||
chevronView.setImageResource(R.drawable.arrow_newchat);
|
chevronView.setImageResource(R.drawable.arrow_newchat);
|
||||||
addView(chevronView, LayoutHelper.createFrame(16, 16, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL));
|
addView(chevronView, LayoutHelper.createFrame(16, 16, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL));
|
||||||
|
|
||||||
|
closeView = new ImageView(context);
|
||||||
|
closeView.setImageResource(R.drawable.msg_close);
|
||||||
|
closeView.setPadding(dp(6), dp(6), dp(6), dp(6));
|
||||||
|
addView(closeView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, LocaleController.isRTL ? -15 : 0, 0, LocaleController.isRTL ? 0 : -15, 0));
|
||||||
|
closeView.setVisibility(GONE);
|
||||||
|
setClipToPadding(false);
|
||||||
updateColors();
|
updateColors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,12 +70,28 @@ public class DialogsHintCell extends FrameLayout {
|
||||||
titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
|
titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText));
|
||||||
messageView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText));
|
messageView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText));
|
||||||
chevronView.setColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText), PorterDuff.Mode.SRC_IN);
|
chevronView.setColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText), PorterDuff.Mode.SRC_IN);
|
||||||
|
closeView.setColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText), PorterDuff.Mode.SRC_IN);
|
||||||
|
closeView.setBackground(Theme.AdaptiveRipple.filledCircle());
|
||||||
setBackground(Theme.AdaptiveRipple.filledRect());
|
setBackground(Theme.AdaptiveRipple.filledRect());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setText(CharSequence title, CharSequence subtitle) {
|
public void setText(CharSequence title, CharSequence subtitle) {
|
||||||
titleView.setText(title);
|
titleView.setText(title);
|
||||||
|
titleView.setCompoundDrawables(null, null, null, null);
|
||||||
messageView.setText(subtitle);
|
messageView.setText(subtitle);
|
||||||
|
chevronView.setVisibility(VISIBLE);
|
||||||
|
closeView.setVisibility(GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChristmasStyle(OnClickListener closeListener) {
|
||||||
|
chevronView.setVisibility(INVISIBLE);
|
||||||
|
closeView.setVisibility(VISIBLE);
|
||||||
|
closeView.setOnClickListener(closeListener);
|
||||||
|
Emoji.EmojiDrawable drawable = Emoji.getEmojiDrawable("\uD83C\uDF84");
|
||||||
|
if (drawable != null) {
|
||||||
|
drawable.setBounds(dp(2), -dp(2), Emoji.drawImgSize + dp(2), Emoji.drawImgSize - dp(2));
|
||||||
|
titleView.setCompoundDrawables(null, null, drawable, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -29,6 +29,7 @@ import androidx.core.graphics.ColorUtils;
|
||||||
import org.telegram.messenger.AccountInstance;
|
import org.telegram.messenger.AccountInstance;
|
||||||
import org.telegram.messenger.AndroidUtilities;
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
import org.telegram.messenger.ChatObject;
|
import org.telegram.messenger.ChatObject;
|
||||||
|
import org.telegram.messenger.DialogObject;
|
||||||
import org.telegram.messenger.ImageLocation;
|
import org.telegram.messenger.ImageLocation;
|
||||||
import org.telegram.messenger.LiteMode;
|
import org.telegram.messenger.LiteMode;
|
||||||
import org.telegram.messenger.LocaleController;
|
import org.telegram.messenger.LocaleController;
|
||||||
|
@ -474,10 +475,8 @@ public class GroupCallUserCell extends FrameLayout {
|
||||||
nameTextView.setText(UserObject.getUserName(currentUser));
|
nameTextView.setText(UserObject.getUserName(currentUser));
|
||||||
if (currentUser != null && currentUser.verified) {
|
if (currentUser != null && currentUser.verified) {
|
||||||
rightDrawable.set(verifiedDrawable = (verifiedDrawable == null ? new VerifiedDrawable(getContext()) : verifiedDrawable), animated);
|
rightDrawable.set(verifiedDrawable = (verifiedDrawable == null ? new VerifiedDrawable(getContext()) : verifiedDrawable), animated);
|
||||||
} else if (currentUser != null && currentUser.emoji_status instanceof TLRPC.TL_emojiStatus) {
|
} else if (currentUser != null && DialogObject.getEmojiStatusDocumentId(currentUser.emoji_status) != 0) {
|
||||||
rightDrawable.set(((TLRPC.TL_emojiStatus) currentUser.emoji_status).document_id, animated);
|
rightDrawable.set(DialogObject.getEmojiStatusDocumentId(currentUser.emoji_status), animated);
|
||||||
} else if (currentUser != null && currentUser.emoji_status instanceof TLRPC.TL_emojiStatusUntil && ((TLRPC.TL_emojiStatusUntil) currentUser.emoji_status).until > (int) (System.currentTimeMillis() / 1000)) {
|
|
||||||
rightDrawable.set(((TLRPC.TL_emojiStatusUntil) currentUser.emoji_status).document_id, animated);
|
|
||||||
} else if (currentUser != null && currentUser.premium) {
|
} else if (currentUser != null && currentUser.premium) {
|
||||||
if (premiumDrawable == null) {
|
if (premiumDrawable == null) {
|
||||||
premiumDrawable = getContext().getResources().getDrawable(R.drawable.msg_premium_liststar).mutate();
|
premiumDrawable = getContext().getResources().getDrawable(R.drawable.msg_premium_liststar).mutate();
|
||||||
|
@ -515,6 +514,8 @@ public class GroupCallUserCell extends FrameLayout {
|
||||||
nameTextView.setText(currentChat.title);
|
nameTextView.setText(currentChat.title);
|
||||||
if (currentChat.verified) {
|
if (currentChat.verified) {
|
||||||
rightDrawable.set(verifiedDrawable = (verifiedDrawable == null ? new VerifiedDrawable(getContext()) : verifiedDrawable), animated);
|
rightDrawable.set(verifiedDrawable = (verifiedDrawable == null ? new VerifiedDrawable(getContext()) : verifiedDrawable), animated);
|
||||||
|
} else if (currentChat != null && DialogObject.getEmojiStatusDocumentId(currentChat.emoji_status) != 0) {
|
||||||
|
rightDrawable.set(DialogObject.getEmojiStatusDocumentId(currentChat.emoji_status), animated);
|
||||||
} else {
|
} else {
|
||||||
rightDrawable.set((Drawable) null, animated);
|
rightDrawable.set((Drawable) null, animated);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ import org.telegram.messenger.ChatObject;
|
||||||
import org.telegram.messenger.Emoji;
|
import org.telegram.messenger.Emoji;
|
||||||
import org.telegram.messenger.LocaleController;
|
import org.telegram.messenger.LocaleController;
|
||||||
import org.telegram.messenger.MessagesController;
|
import org.telegram.messenger.MessagesController;
|
||||||
|
import org.telegram.messenger.NotificationCenter;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
import org.telegram.messenger.UserConfig;
|
import org.telegram.messenger.UserConfig;
|
||||||
import org.telegram.messenger.UserObject;
|
import org.telegram.messenger.UserObject;
|
||||||
|
@ -106,6 +107,7 @@ public class ManageChatUserCell extends FrameLayout {
|
||||||
nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
||||||
nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP);
|
nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP);
|
||||||
addView(nameTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 20, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 28 + 18 : (68 + namePadding), 11.5f, LocaleController.isRTL ? (68 + namePadding) : 28 + 18, 0));
|
addView(nameTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 20, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 28 + 18 : (68 + namePadding), 11.5f, LocaleController.isRTL ? (68 + namePadding) : 28 + 18, 0));
|
||||||
|
NotificationCenter.listenEmojiLoading(nameTextView);
|
||||||
|
|
||||||
statusTextView = new SimpleTextView(context);
|
statusTextView = new SimpleTextView(context);
|
||||||
statusTextView.setTextSize(14);
|
statusTextView.setTextSize(14);
|
||||||
|
|
|
@ -308,7 +308,7 @@ public class ProfileSearchCell extends BaseCell implements NotificationCenter.No
|
||||||
nameLeft = AndroidUtilities.dp(11);
|
nameLeft = AndroidUtilities.dp(11);
|
||||||
}
|
}
|
||||||
nameLockTop = AndroidUtilities.dp(22.0f);
|
nameLockTop = AndroidUtilities.dp(22.0f);
|
||||||
updateStatus(false, null, false);
|
updateStatus(false, null, null, false);
|
||||||
} else if (chat != null) {
|
} else if (chat != null) {
|
||||||
dialog_id = -chat.id;
|
dialog_id = -chat.id;
|
||||||
drawCheck = chat.verified;
|
drawCheck = chat.verified;
|
||||||
|
@ -317,7 +317,7 @@ public class ProfileSearchCell extends BaseCell implements NotificationCenter.No
|
||||||
} else {
|
} else {
|
||||||
nameLeft = AndroidUtilities.dp(11);
|
nameLeft = AndroidUtilities.dp(11);
|
||||||
}
|
}
|
||||||
updateStatus(drawCheck, null, false);
|
updateStatus(drawCheck, null, chat, false);
|
||||||
} else if (user != null) {
|
} else if (user != null) {
|
||||||
dialog_id = user.id;
|
dialog_id = user.id;
|
||||||
if (!LocaleController.isRTL) {
|
if (!LocaleController.isRTL) {
|
||||||
|
@ -328,7 +328,7 @@ public class ProfileSearchCell extends BaseCell implements NotificationCenter.No
|
||||||
nameLockTop = AndroidUtilities.dp(21);
|
nameLockTop = AndroidUtilities.dp(21);
|
||||||
drawCheck = user.verified;
|
drawCheck = user.verified;
|
||||||
drawPremium = !savedMessages && MessagesController.getInstance(currentAccount).isPremiumUser(user);
|
drawPremium = !savedMessages && MessagesController.getInstance(currentAccount).isPremiumUser(user);
|
||||||
updateStatus(drawCheck, user, false);
|
updateStatus(drawCheck, user, null, false);
|
||||||
} else if (contact != null) {
|
} else if (contact != null) {
|
||||||
dialog_id = 0;
|
dialog_id = 0;
|
||||||
if (!LocaleController.isRTL) {
|
if (!LocaleController.isRTL) {
|
||||||
|
@ -587,16 +587,16 @@ public class ProfileSearchCell extends BaseCell implements NotificationCenter.No
|
||||||
nameLockLeft += getPaddingLeft();
|
nameLockLeft += getPaddingLeft();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateStatus(boolean verified, TLRPC.User user, boolean animated) {
|
public void updateStatus(boolean verified, TLRPC.User user, TLRPC.Chat chat, boolean animated) {
|
||||||
statusDrawable.center = LocaleController.isRTL;
|
statusDrawable.center = LocaleController.isRTL;
|
||||||
if (verified) {
|
if (verified) {
|
||||||
statusDrawable.set(new CombinedDrawable(Theme.dialogs_verifiedDrawable, Theme.dialogs_verifiedCheckDrawable, 0, 0), animated);
|
statusDrawable.set(new CombinedDrawable(Theme.dialogs_verifiedDrawable, Theme.dialogs_verifiedCheckDrawable, 0, 0), animated);
|
||||||
statusDrawable.setColor(null);
|
statusDrawable.setColor(null);
|
||||||
} else if (user != null && !savedMessages && user.emoji_status instanceof TLRPC.TL_emojiStatusUntil && ((TLRPC.TL_emojiStatusUntil) user.emoji_status).until > (int) (System.currentTimeMillis() / 1000)) {
|
} else if (user != null && !savedMessages && DialogObject.getEmojiStatusDocumentId(user.emoji_status) != 0) {
|
||||||
statusDrawable.set(((TLRPC.TL_emojiStatusUntil) user.emoji_status).document_id, animated);
|
statusDrawable.set(DialogObject.getEmojiStatusDocumentId(user.emoji_status), animated);
|
||||||
statusDrawable.setColor(Theme.getColor(Theme.key_chats_verifiedBackground, resourcesProvider));
|
statusDrawable.setColor(Theme.getColor(Theme.key_chats_verifiedBackground, resourcesProvider));
|
||||||
} else if (user != null && !savedMessages && user.emoji_status instanceof TLRPC.TL_emojiStatus) {
|
} else if (chat != null && !savedMessages && DialogObject.getEmojiStatusDocumentId(chat.emoji_status) != 0) {
|
||||||
statusDrawable.set(((TLRPC.TL_emojiStatus) user.emoji_status).document_id, animated);
|
statusDrawable.set(DialogObject.getEmojiStatusDocumentId(chat.emoji_status), animated);
|
||||||
statusDrawable.setColor(Theme.getColor(Theme.key_chats_verifiedBackground, resourcesProvider));
|
statusDrawable.setColor(Theme.getColor(Theme.key_chats_verifiedBackground, resourcesProvider));
|
||||||
} else if (user != null && !savedMessages && MessagesController.getInstance(currentAccount).isPremiumUser(user)) {
|
} else if (user != null && !savedMessages && MessagesController.getInstance(currentAccount).isPremiumUser(user)) {
|
||||||
statusDrawable.set(PremiumGradient.getInstance().premiumStarDrawableMini, animated);
|
statusDrawable.set(PremiumGradient.getInstance().premiumStarDrawableMini, animated);
|
||||||
|
@ -662,8 +662,8 @@ public class ProfileSearchCell extends BaseCell implements NotificationCenter.No
|
||||||
continueUpdate = true;
|
continueUpdate = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!continueUpdate && (mask & MessagesController.UPDATE_MASK_EMOJI_STATUS) != 0 && user != null) {
|
if (!continueUpdate && (mask & MessagesController.UPDATE_MASK_EMOJI_STATUS) != 0 && (user != null || chat != null)) {
|
||||||
updateStatus(user.verified, user, true);
|
updateStatus(user != null ? user.verified : chat.verified, user, chat, true);
|
||||||
}
|
}
|
||||||
if (!continueUpdate && ((mask & MessagesController.UPDATE_MASK_NAME) != 0 && user != null) || (mask & MessagesController.UPDATE_MASK_CHAT_NAME) != 0 && chat != null) {
|
if (!continueUpdate && ((mask & MessagesController.UPDATE_MASK_NAME) != 0 && user != null) || (mask & MessagesController.UPDATE_MASK_CHAT_NAME) != 0 && chat != null) {
|
||||||
String newName;
|
String newName;
|
||||||
|
|
|
@ -8,7 +8,10 @@ import android.graphics.Canvas;
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
import android.graphics.PorterDuffColorFilter;
|
import android.graphics.PorterDuffColorFilter;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.text.SpannableStringBuilder;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.text.style.RelativeSizeSpan;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -23,6 +26,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||||
import org.telegram.messenger.AndroidUtilities;
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
import org.telegram.messenger.DocumentObject;
|
import org.telegram.messenger.DocumentObject;
|
||||||
import org.telegram.messenger.Emoji;
|
import org.telegram.messenger.Emoji;
|
||||||
|
import org.telegram.messenger.FileLoader;
|
||||||
import org.telegram.messenger.ImageLocation;
|
import org.telegram.messenger.ImageLocation;
|
||||||
import org.telegram.messenger.MediaDataController;
|
import org.telegram.messenger.MediaDataController;
|
||||||
import org.telegram.messenger.MessageObject;
|
import org.telegram.messenger.MessageObject;
|
||||||
|
@ -33,12 +37,14 @@ import org.telegram.messenger.SvgHelper;
|
||||||
import org.telegram.messenger.UserObject;
|
import org.telegram.messenger.UserObject;
|
||||||
import org.telegram.tgnet.TLObject;
|
import org.telegram.tgnet.TLObject;
|
||||||
import org.telegram.tgnet.TLRPC;
|
import org.telegram.tgnet.TLRPC;
|
||||||
|
import org.telegram.tgnet.tl.TL_stories;
|
||||||
import org.telegram.ui.ActionBar.SimpleTextView;
|
import org.telegram.ui.ActionBar.SimpleTextView;
|
||||||
import org.telegram.ui.ActionBar.Theme;
|
import org.telegram.ui.ActionBar.Theme;
|
||||||
import org.telegram.ui.Components.AnimatedEmojiDrawable;
|
import org.telegram.ui.Components.AnimatedEmojiDrawable;
|
||||||
import org.telegram.ui.Components.AvatarDrawable;
|
import org.telegram.ui.Components.AvatarDrawable;
|
||||||
import org.telegram.ui.Components.BackupImageView;
|
import org.telegram.ui.Components.BackupImageView;
|
||||||
import org.telegram.ui.Components.CubicBezierInterpolator;
|
import org.telegram.ui.Components.CubicBezierInterpolator;
|
||||||
|
import org.telegram.ui.Components.DotDividerSpan;
|
||||||
import org.telegram.ui.Components.LayoutHelper;
|
import org.telegram.ui.Components.LayoutHelper;
|
||||||
import org.telegram.ui.Components.MessageSeenCheckDrawable;
|
import org.telegram.ui.Components.MessageSeenCheckDrawable;
|
||||||
import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble;
|
import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble;
|
||||||
|
@ -57,6 +63,8 @@ public class ReactedUserHolderView extends FrameLayout {
|
||||||
SimpleTextView titleView;
|
SimpleTextView titleView;
|
||||||
SimpleTextView subtitleView;
|
SimpleTextView subtitleView;
|
||||||
BackupImageView reactView;
|
BackupImageView reactView;
|
||||||
|
public BackupImageView storyPreviewView;
|
||||||
|
public int storyId;
|
||||||
AvatarDrawable avatarDrawable = new AvatarDrawable();
|
AvatarDrawable avatarDrawable = new AvatarDrawable();
|
||||||
View overlaySelectorView;
|
View overlaySelectorView;
|
||||||
StatusBadgeComponent statusBadgeComponent;
|
StatusBadgeComponent statusBadgeComponent;
|
||||||
|
@ -73,6 +81,8 @@ public class ReactedUserHolderView extends FrameLayout {
|
||||||
|
|
||||||
public static final MessageSeenCheckDrawable seenDrawable = new MessageSeenCheckDrawable(R.drawable.msg_mini_checks, Theme.key_windowBackgroundWhiteGrayText);
|
public static final MessageSeenCheckDrawable seenDrawable = new MessageSeenCheckDrawable(R.drawable.msg_mini_checks, Theme.key_windowBackgroundWhiteGrayText);
|
||||||
public static final MessageSeenCheckDrawable reactDrawable = new MessageSeenCheckDrawable(R.drawable.msg_reactions, Theme.key_windowBackgroundWhiteGrayText, 16, 16, 5.66f);
|
public static final MessageSeenCheckDrawable reactDrawable = new MessageSeenCheckDrawable(R.drawable.msg_reactions, Theme.key_windowBackgroundWhiteGrayText, 16, 16, 5.66f);
|
||||||
|
public static final MessageSeenCheckDrawable repostDrawable = new MessageSeenCheckDrawable(R.drawable.mini_repost_story, Theme.key_stories_circle1);
|
||||||
|
public static final MessageSeenCheckDrawable forwardDrawable = new MessageSeenCheckDrawable(R.drawable.mini_forward_story, Theme.key_stories_circle1);
|
||||||
|
|
||||||
public ReactedUserHolderView(int style, int currentAccount, @NonNull Context context, Theme.ResourcesProvider resourcesProvider) {
|
public ReactedUserHolderView(int style, int currentAccount, @NonNull Context context, Theme.ResourcesProvider resourcesProvider) {
|
||||||
this(style, currentAccount, context, resourcesProvider, true);
|
this(style, currentAccount, context, resourcesProvider, true);
|
||||||
|
@ -148,6 +158,9 @@ public class ReactedUserHolderView extends FrameLayout {
|
||||||
reactView = new BackupImageView(context);
|
reactView = new BackupImageView(context);
|
||||||
addView(reactView, LayoutHelper.createFrameRelatively(24, 24, Gravity.END | Gravity.CENTER_VERTICAL, 0, 0, 12, 0));
|
addView(reactView, LayoutHelper.createFrameRelatively(24, 24, Gravity.END | Gravity.CENTER_VERTICAL, 0, 0, 12, 0));
|
||||||
|
|
||||||
|
storyPreviewView = new BackupImageView(context);
|
||||||
|
addView(storyPreviewView, LayoutHelper.createFrameRelatively(22, 35, Gravity.END | Gravity.CENTER_VERTICAL, 0, 0, 12, 0));
|
||||||
|
|
||||||
if (useOverlaySelector) {
|
if (useOverlaySelector) {
|
||||||
overlaySelectorView = new View(context);
|
overlaySelectorView = new View(context);
|
||||||
overlaySelectorView.setBackground(Theme.getSelectorDrawable(false));
|
overlaySelectorView.setBackground(Theme.getSelectorDrawable(false));
|
||||||
|
@ -155,7 +168,7 @@ public class ReactedUserHolderView extends FrameLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUserReaction(TLRPC.User user, TLRPC.Chat chat, TLRPC.Reaction reaction, boolean like, long date, boolean dateIsSeen, boolean animated) {
|
public void setUserReaction(TLRPC.User user, TLRPC.Chat chat, TLRPC.Reaction reaction, boolean like, long date, TL_stories.StoryItem storyItem, boolean isForward, boolean dateIsSeen, boolean animated) {
|
||||||
TLObject u = user;
|
TLObject u = user;
|
||||||
if (u == null) {
|
if (u == null) {
|
||||||
u = chat;
|
u = chat;
|
||||||
|
@ -223,6 +236,24 @@ public class ReactedUserHolderView extends FrameLayout {
|
||||||
contentDescription = LocaleController.formatString("AccDescrPersonHasSeen", R.string.AccDescrPersonHasSeen, titleView.getText());
|
contentDescription = LocaleController.formatString("AccDescrPersonHasSeen", R.string.AccDescrPersonHasSeen, titleView.getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (storyItem != null) {
|
||||||
|
storyId = storyItem.id;
|
||||||
|
if (storyItem.media != null && storyItem.media.photo != null) {
|
||||||
|
final TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(storyItem.media.photo.sizes, 35, false, null, true);
|
||||||
|
storyPreviewView.setImage(ImageLocation.getForPhoto(photoSize, storyItem.media.photo), "22_35", null, null, -1, storyItem);
|
||||||
|
} else if (storyItem.media != null && storyItem.media.document != null) {
|
||||||
|
final TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(storyItem.media.document.thumbs, 35, false, null, true);
|
||||||
|
storyPreviewView.setImage(ImageLocation.getForDocument(photoSize, storyItem.media.document), "22_35", null, null, -1, storyItem);
|
||||||
|
}
|
||||||
|
storyPreviewView.setRoundRadius(AndroidUtilities.dp(3.33f));
|
||||||
|
if (date <= 0) {
|
||||||
|
date = storyItem.date;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
storyId = -1;
|
||||||
|
storyPreviewView.setImageDrawable(null);
|
||||||
|
}
|
||||||
|
|
||||||
if (date != 0) {
|
if (date != 0) {
|
||||||
contentDescription += " " + LocaleController.formatSeenDate(date);
|
contentDescription += " " + LocaleController.formatSeenDate(date);
|
||||||
}
|
}
|
||||||
|
@ -230,8 +261,41 @@ public class ReactedUserHolderView extends FrameLayout {
|
||||||
|
|
||||||
if (date != 0) {
|
if (date != 0) {
|
||||||
subtitleView.setVisibility(View.VISIBLE);
|
subtitleView.setVisibility(View.VISIBLE);
|
||||||
CharSequence icon = dateIsSeen ? seenDrawable.getSpanned(getContext(), resourcesProvider) : reactDrawable.getSpanned(getContext(), resourcesProvider);
|
MessageSeenCheckDrawable drawable;
|
||||||
subtitleView.setText(TextUtils.concat(icon, LocaleController.formatSeenDate(date)));
|
if (storyItem != null) {
|
||||||
|
drawable = isForward ? forwardDrawable : repostDrawable;
|
||||||
|
} else if (dateIsSeen) {
|
||||||
|
drawable = seenDrawable;
|
||||||
|
} else {
|
||||||
|
drawable = reactDrawable;
|
||||||
|
}
|
||||||
|
SpannableStringBuilder ssb = new SpannableStringBuilder();
|
||||||
|
ssb.append(drawable.getSpanned(getContext(), resourcesProvider));
|
||||||
|
ssb.append(LocaleController.formatSeenDate(date));
|
||||||
|
if (!isForward && storyItem != null && !TextUtils.isEmpty(storyItem.caption)) {
|
||||||
|
ssb.append(" ");
|
||||||
|
ssb.append(".");
|
||||||
|
DotDividerSpan dotSpan = new DotDividerSpan();
|
||||||
|
dotSpan.setSize(2.33333f);
|
||||||
|
dotSpan.setTopPadding(AndroidUtilities.dp(5));
|
||||||
|
ssb.setSpan(dotSpan, ssb.length() - 1, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
ssb.append(" ");
|
||||||
|
int index = ssb.length();
|
||||||
|
ssb.append(LocaleController.getString(R.string.StoryRepostCommented));
|
||||||
|
ssb.setSpan(new RelativeSizeSpan(.95f), index, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
} else if (!isForward && storyItem != null && storyItem.fwd_from != null && storyItem.fwd_from.modified) {
|
||||||
|
ssb.append(" ");
|
||||||
|
ssb.append(".");
|
||||||
|
DotDividerSpan dotSpan = new DotDividerSpan();
|
||||||
|
dotSpan.setSize(2.33333f);
|
||||||
|
dotSpan.setTopPadding(AndroidUtilities.dp(5));
|
||||||
|
ssb.setSpan(dotSpan, ssb.length() - 1, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
ssb.append(" ");
|
||||||
|
int index = ssb.length();
|
||||||
|
ssb.append("edited");
|
||||||
|
ssb.setSpan(new RelativeSizeSpan(.95f), index, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
}
|
||||||
|
subtitleView.setText(ssb);
|
||||||
subtitleView.setTranslationY(!dateIsSeen ? AndroidUtilities.dp(-1) : 0);
|
subtitleView.setTranslationY(!dateIsSeen ? AndroidUtilities.dp(-1) : 0);
|
||||||
titleView.setTranslationY(0);
|
titleView.setTranslationY(0);
|
||||||
if (animated) {
|
if (animated) {
|
||||||
|
@ -263,7 +327,7 @@ public class ReactedUserHolderView extends FrameLayout {
|
||||||
} else {
|
} else {
|
||||||
chat = MessagesController.getInstance(currentAccount).getChat(-dialogId);
|
chat = MessagesController.getInstance(currentAccount).getChat(-dialogId);
|
||||||
}
|
}
|
||||||
setUserReaction(user, chat, reaction.reaction, false, reaction.date, reaction.dateIsSeen, false);
|
setUserReaction(user, chat, reaction.reaction, false, reaction.date, null, false, reaction.dateIsSeen, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -12,10 +12,13 @@ import static org.telegram.messenger.AndroidUtilities.dp;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.graphics.ColorFilter;
|
import android.graphics.ColorFilter;
|
||||||
import android.graphics.LinearGradient;
|
import android.graphics.LinearGradient;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.PixelFormat;
|
import android.graphics.PixelFormat;
|
||||||
|
import android.graphics.PorterDuff;
|
||||||
|
import android.graphics.PorterDuffColorFilter;
|
||||||
import android.graphics.Shader;
|
import android.graphics.Shader;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
@ -79,12 +82,16 @@ public class ShareDialogCell extends FrameLayout {
|
||||||
private boolean topicWasVisible;
|
private boolean topicWasVisible;
|
||||||
|
|
||||||
private final int currentAccount = UserConfig.selectedAccount;
|
private final int currentAccount = UserConfig.selectedAccount;
|
||||||
private final Theme.ResourcesProvider resourcesProvider;
|
public final Theme.ResourcesProvider resourcesProvider;
|
||||||
|
|
||||||
public static final int TYPE_SHARE = 0;
|
public static final int TYPE_SHARE = 0;
|
||||||
public static final int TYPE_CALL = 1;
|
public static final int TYPE_CALL = 1;
|
||||||
public static final int TYPE_CREATE = 2;
|
public static final int TYPE_CREATE = 2;
|
||||||
|
|
||||||
|
public BackupImageView getImageView() {
|
||||||
|
return imageView;
|
||||||
|
}
|
||||||
|
|
||||||
public ShareDialogCell(Context context, int type, Theme.ResourcesProvider resourcesProvider) {
|
public ShareDialogCell(Context context, int type, Theme.ResourcesProvider resourcesProvider) {
|
||||||
super(context);
|
super(context);
|
||||||
this.resourcesProvider = resourcesProvider;
|
this.resourcesProvider = resourcesProvider;
|
||||||
|
@ -144,11 +151,15 @@ public class ShareDialogCell extends FrameLayout {
|
||||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(dp(currentType == TYPE_CREATE ? 95 : 103), MeasureSpec.EXACTLY));
|
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(dp(currentType == TYPE_CREATE ? 95 : 103), MeasureSpec.EXACTLY));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected String repostToCustomName() {
|
||||||
|
return LocaleController.getString(R.string.FwdMyStory);
|
||||||
|
}
|
||||||
|
|
||||||
public void setDialog(long uid, boolean checked, CharSequence name) {
|
public void setDialog(long uid, boolean checked, CharSequence name) {
|
||||||
if (uid == Long.MAX_VALUE) {
|
if (uid == Long.MAX_VALUE) {
|
||||||
nameTextView.setText(LocaleController.getString(R.string.FwdMyStory));
|
nameTextView.setText(repostToCustomName());
|
||||||
if (repostStoryDrawable == null) {
|
if (repostStoryDrawable == null) {
|
||||||
repostStoryDrawable = new RepostStoryDrawable(imageView, resourcesProvider);
|
repostStoryDrawable = new RepostStoryDrawable(getContext(), imageView, true, resourcesProvider);
|
||||||
}
|
}
|
||||||
imageView.setImage(null, null, repostStoryDrawable, null);
|
imageView.setImage(null, null, repostStoryDrawable, null);
|
||||||
} else if (DialogObject.isUserDialog(uid)) {
|
} else if (DialogObject.isUserDialog(uid)) {
|
||||||
|
@ -321,41 +332,62 @@ public class ShareDialogCell extends FrameLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class RepostStoryDrawable extends Drawable {
|
public static class RepostStoryDrawable extends Drawable {
|
||||||
|
|
||||||
private final LinearGradient gradient;
|
private final LinearGradient gradient;
|
||||||
private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
|
|
||||||
private final RLottieDrawable lottieDrawable;
|
private final RLottieDrawable lottieDrawable;
|
||||||
|
private final Drawable drawable;
|
||||||
|
|
||||||
public RepostStoryDrawable(View view, Theme.ResourcesProvider resourcesProvider) {
|
public RepostStoryDrawable(Context context, View parentView, boolean animate, Theme.ResourcesProvider resourcesProvider) {
|
||||||
gradient = new LinearGradient(0, 0, dp(56), dp(56), new int[] {
|
gradient = new LinearGradient(0, 0, dp(56), dp(56), new int[] {
|
||||||
Theme.getColor(Theme.key_stories_circle1, resourcesProvider),
|
Theme.getColor(Theme.key_stories_circle1, resourcesProvider),
|
||||||
Theme.getColor(Theme.key_stories_circle2, resourcesProvider)
|
Theme.getColor(Theme.key_stories_circle2, resourcesProvider)
|
||||||
}, new float[] { 0, 1 }, Shader.TileMode.CLAMP);
|
}, new float[] { 0, 1 }, Shader.TileMode.CLAMP);
|
||||||
paint.setShader(gradient);
|
paint.setShader(gradient);
|
||||||
|
|
||||||
|
if (animate) {
|
||||||
lottieDrawable = new RLottieDrawable(R.raw.story_repost, "story_repost", dp(42), dp(42), true, null);
|
lottieDrawable = new RLottieDrawable(R.raw.story_repost, "story_repost", dp(42), dp(42), true, null);
|
||||||
lottieDrawable.setMasterParent(view);
|
lottieDrawable.setMasterParent(parentView);
|
||||||
AndroidUtilities.runOnUIThread(lottieDrawable::start, 450);
|
AndroidUtilities.runOnUIThread(lottieDrawable::start, 450);
|
||||||
|
drawable = null;
|
||||||
|
} else {
|
||||||
|
lottieDrawable = null;
|
||||||
|
drawable = context.getResources().getDrawable(R.drawable.large_repost_story).mutate();
|
||||||
|
drawable.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int alpha = 0xFF;
|
||||||
@Override
|
@Override
|
||||||
public void draw(@NonNull Canvas canvas) {
|
public void draw(@NonNull Canvas canvas) {
|
||||||
canvas.save();
|
canvas.save();
|
||||||
canvas.translate(getBounds().left, getBounds().top);
|
canvas.translate(getBounds().left, getBounds().top);
|
||||||
canvas.drawCircle(getBounds().width() / 2f, getBounds().height() / 2f, getBounds().width() / 2f, paint);
|
AndroidUtilities.rectTmp.set(0, 0, getBounds().width(), getBounds().height());
|
||||||
|
paint.setAlpha(alpha);
|
||||||
|
float r2 = Math.min(getBounds().width(), getBounds().height()) / 2f * ((float) alpha / 0xFF);
|
||||||
|
canvas.drawRoundRect(AndroidUtilities.rectTmp, r2, r2, paint);
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
|
|
||||||
AndroidUtilities.rectTmp2.set(getBounds());
|
final int r = dp(lottieDrawable != null ? 20 : 15);
|
||||||
AndroidUtilities.rectTmp2.inset(dp(8), dp(8));
|
AndroidUtilities.rectTmp2.set(
|
||||||
lottieDrawable.setBounds(AndroidUtilities.rectTmp2);
|
getBounds().centerX() - r,
|
||||||
lottieDrawable.draw(canvas);
|
getBounds().centerY() - r,
|
||||||
|
getBounds().centerX() + r,
|
||||||
|
getBounds().centerY() + r
|
||||||
|
);
|
||||||
|
Drawable drawable = lottieDrawable == null ? this.drawable : lottieDrawable;
|
||||||
|
if (drawable != null) {
|
||||||
|
drawable.setBounds(AndroidUtilities.rectTmp2);
|
||||||
|
drawable.setAlpha(alpha);
|
||||||
|
drawable.draw(canvas);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAlpha(int alpha) {
|
public void setAlpha(int alpha) {
|
||||||
|
this.alpha = alpha;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
|
|
||||||
package org.telegram.ui.Cells;
|
package org.telegram.ui.Cells;
|
||||||
|
|
||||||
|
import static org.telegram.messenger.AndroidUtilities.dp;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
|
@ -33,6 +35,7 @@ import org.telegram.ui.Components.RLottieDrawable;
|
||||||
import org.telegram.ui.Components.RLottieImageView;
|
import org.telegram.ui.Components.RLottieImageView;
|
||||||
import org.telegram.ui.Components.Switch;
|
import org.telegram.ui.Components.Switch;
|
||||||
import org.telegram.ui.FilterCreateActivity;
|
import org.telegram.ui.FilterCreateActivity;
|
||||||
|
import org.telegram.ui.PeerColorActivity;
|
||||||
|
|
||||||
public class TextCell extends FrameLayout {
|
public class TextCell extends FrameLayout {
|
||||||
|
|
||||||
|
@ -94,11 +97,11 @@ public class TextCell extends FrameLayout {
|
||||||
|
|
||||||
valueTextView = new AnimatedTextView(context, false, false, true);
|
valueTextView = new AnimatedTextView(context, false, false, true);
|
||||||
valueTextView.setTextColor(Theme.getColor(dialog ? Theme.key_dialogTextBlue2 : Theme.key_windowBackgroundWhiteValueText, resourcesProvider));
|
valueTextView.setTextColor(Theme.getColor(dialog ? Theme.key_dialogTextBlue2 : Theme.key_windowBackgroundWhiteValueText, resourcesProvider));
|
||||||
valueTextView.setPadding(0, AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18));
|
valueTextView.setPadding(0, dp(18), 0, dp(18));
|
||||||
valueTextView.setTextSize(AndroidUtilities.dp(16));
|
valueTextView.setTextSize(dp(16));
|
||||||
valueTextView.setGravity(LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT);
|
valueTextView.setGravity(LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT);
|
||||||
valueTextView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
|
valueTextView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
|
||||||
valueTextView.setTranslationY(AndroidUtilities.dp(-2));
|
valueTextView.setTranslationY(dp(-2));
|
||||||
addView(valueTextView);
|
addView(valueTextView);
|
||||||
|
|
||||||
valueSpoilersTextView = new SimpleTextView(context);
|
valueSpoilersTextView = new SimpleTextView(context);
|
||||||
|
@ -166,7 +169,7 @@ public class TextCell extends FrameLayout {
|
||||||
@Override
|
@Override
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||||
int height = AndroidUtilities.dp(heightDp);
|
int height = dp(heightDp);
|
||||||
|
|
||||||
if (lastWidth != 0 && lastWidth != width && valueText != null) {
|
if (lastWidth != 0 && lastWidth != width && valueText != null) {
|
||||||
valueTextView.setText(TextUtils.ellipsize(valueText, valueTextView.getPaint(), AndroidUtilities.displaySize.x / 2.5f, TextUtils.TruncateAt.END), false);
|
valueTextView.setText(TextUtils.ellipsize(valueText, valueTextView.getPaint(), AndroidUtilities.displaySize.x / 2.5f, TextUtils.TruncateAt.END), false);
|
||||||
|
@ -175,16 +178,16 @@ public class TextCell extends FrameLayout {
|
||||||
|
|
||||||
int valueWidth;
|
int valueWidth;
|
||||||
if (prioritizeTitleOverValue) {
|
if (prioritizeTitleOverValue) {
|
||||||
textView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(71 + leftPadding), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY));
|
textView.measure(MeasureSpec.makeMeasureSpec(width - dp(71 + leftPadding), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.EXACTLY));
|
||||||
subtitleView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(71 + leftPadding), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY));
|
subtitleView.measure(MeasureSpec.makeMeasureSpec(width - dp(71 + leftPadding), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.EXACTLY));
|
||||||
valueTextView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(103 + leftPadding) - textView.getTextWidth(), LocaleController.isRTL ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY));
|
valueTextView.measure(MeasureSpec.makeMeasureSpec(width - dp(103 + leftPadding) - textView.getTextWidth(), LocaleController.isRTL ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.EXACTLY));
|
||||||
valueSpoilersTextView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(103 + leftPadding) - textView.getTextWidth(), LocaleController.isRTL ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY));
|
valueSpoilersTextView.measure(MeasureSpec.makeMeasureSpec(width - dp(103 + leftPadding) - textView.getTextWidth(), LocaleController.isRTL ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.EXACTLY));
|
||||||
} else {
|
} else {
|
||||||
valueTextView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(leftPadding), LocaleController.isRTL ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY));
|
valueTextView.measure(MeasureSpec.makeMeasureSpec(width - dp(leftPadding), LocaleController.isRTL ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.EXACTLY));
|
||||||
valueSpoilersTextView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(leftPadding), LocaleController.isRTL ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY));
|
valueSpoilersTextView.measure(MeasureSpec.makeMeasureSpec(width - dp(leftPadding), LocaleController.isRTL ? MeasureSpec.AT_MOST : MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.EXACTLY));
|
||||||
valueWidth = Math.max(valueTextView.width(), valueSpoilersTextView.getTextWidth());
|
valueWidth = Math.max(valueTextView.width(), valueSpoilersTextView.getTextWidth());
|
||||||
textView.measure(MeasureSpec.makeMeasureSpec(Math.max(0, width - AndroidUtilities.dp(71 + leftPadding) - valueWidth), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY));
|
textView.measure(MeasureSpec.makeMeasureSpec(Math.max(0, width - dp(71 + leftPadding) - valueWidth), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.EXACTLY));
|
||||||
subtitleView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(71 + leftPadding) - valueWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY));
|
subtitleView.measure(MeasureSpec.makeMeasureSpec(width - dp(71 + leftPadding) - valueWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.EXACTLY));
|
||||||
}
|
}
|
||||||
if (imageView.getVisibility() == VISIBLE) {
|
if (imageView.getVisibility() == VISIBLE) {
|
||||||
imageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
|
imageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
|
||||||
|
@ -193,7 +196,7 @@ public class TextCell extends FrameLayout {
|
||||||
valueImageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
|
valueImageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
|
||||||
}
|
}
|
||||||
if (checkBox != null) {
|
if (checkBox != null) {
|
||||||
checkBox.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(37), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY));
|
checkBox.measure(MeasureSpec.makeMeasureSpec(dp(37), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(20), MeasureSpec.EXACTLY));
|
||||||
}
|
}
|
||||||
setMeasuredDimension(width, height + (needDivider ? 1 : 0));
|
setMeasuredDimension(width, height + (needDivider ? 1 : 0));
|
||||||
}
|
}
|
||||||
|
@ -212,43 +215,43 @@ public class TextCell extends FrameLayout {
|
||||||
int width = right - left;
|
int width = right - left;
|
||||||
|
|
||||||
int viewTop = (height - Math.max(valueSpoilersTextView.getTextHeight(), valueTextView.getTextHeight())) / 2;
|
int viewTop = (height - Math.max(valueSpoilersTextView.getTextHeight(), valueTextView.getTextHeight())) / 2;
|
||||||
int viewLeft = LocaleController.isRTL ? AndroidUtilities.dp(leftPadding) : width - valueTextView.getMeasuredWidth() - AndroidUtilities.dp(leftPadding);
|
int viewLeft = LocaleController.isRTL ? dp(leftPadding) : width - valueTextView.getMeasuredWidth() - dp(leftPadding);
|
||||||
if (prioritizeTitleOverValue && !LocaleController.isRTL) {
|
if (prioritizeTitleOverValue && !LocaleController.isRTL) {
|
||||||
viewLeft = width - valueTextView.getMeasuredWidth() - AndroidUtilities.dp(leftPadding);
|
viewLeft = width - valueTextView.getMeasuredWidth() - dp(leftPadding);
|
||||||
}
|
}
|
||||||
valueTextView.layout(viewLeft, viewTop, viewLeft + valueTextView.getMeasuredWidth(), viewTop + valueTextView.getMeasuredHeight());
|
valueTextView.layout(viewLeft, viewTop, viewLeft + valueTextView.getMeasuredWidth(), viewTop + valueTextView.getMeasuredHeight());
|
||||||
viewLeft = LocaleController.isRTL ? AndroidUtilities.dp(leftPadding) : width - valueSpoilersTextView.getMeasuredWidth() - AndroidUtilities.dp(leftPadding);
|
viewLeft = LocaleController.isRTL ? dp(leftPadding) : width - valueSpoilersTextView.getMeasuredWidth() - dp(leftPadding);
|
||||||
valueSpoilersTextView.layout(viewLeft, viewTop, viewLeft + valueSpoilersTextView.getMeasuredWidth(), viewTop + valueSpoilersTextView.getMeasuredHeight());
|
valueSpoilersTextView.layout(viewLeft, viewTop, viewLeft + valueSpoilersTextView.getMeasuredWidth(), viewTop + valueSpoilersTextView.getMeasuredHeight());
|
||||||
|
|
||||||
if (LocaleController.isRTL) {
|
if (LocaleController.isRTL) {
|
||||||
viewLeft = getMeasuredWidth() - textView.getMeasuredWidth() - AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? offsetFromImage : leftPadding);
|
viewLeft = getMeasuredWidth() - textView.getMeasuredWidth() - dp(imageView.getVisibility() == VISIBLE ? offsetFromImage : leftPadding);
|
||||||
} else {
|
} else {
|
||||||
viewLeft = AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? offsetFromImage : leftPadding);
|
viewLeft = dp(imageView.getVisibility() == VISIBLE ? offsetFromImage : leftPadding);
|
||||||
}
|
}
|
||||||
if (subtitleView.getVisibility() == View.VISIBLE) {
|
if (subtitleView.getVisibility() == View.VISIBLE) {
|
||||||
int margin = heightDp > 50 ? 4 : 2;
|
int margin = heightDp > 50 ? 4 : 2;
|
||||||
viewTop = (height - textView.getTextHeight() - subtitleView.getTextHeight() - AndroidUtilities.dp(margin)) / 2;
|
viewTop = (height - textView.getTextHeight() - subtitleView.getTextHeight() - dp(margin)) / 2;
|
||||||
textView.layout(viewLeft, viewTop, viewLeft + textView.getMeasuredWidth(), viewTop + textView.getMeasuredHeight());
|
textView.layout(viewLeft, viewTop, viewLeft + textView.getMeasuredWidth(), viewTop + textView.getMeasuredHeight());
|
||||||
viewTop = viewTop + textView.getTextHeight() + AndroidUtilities.dp(margin);
|
viewTop = viewTop + textView.getTextHeight() + dp(margin);
|
||||||
subtitleView.layout(viewLeft, viewTop, viewLeft + subtitleView.getMeasuredWidth(), viewTop + subtitleView.getMeasuredHeight());
|
subtitleView.layout(viewLeft, viewTop, viewLeft + subtitleView.getMeasuredWidth(), viewTop + subtitleView.getMeasuredHeight());
|
||||||
} else {
|
} else {
|
||||||
viewTop = (height - textView.getTextHeight()) / 2;
|
viewTop = (height - textView.getTextHeight()) / 2;
|
||||||
textView.layout(viewLeft, viewTop, viewLeft + textView.getMeasuredWidth(), viewTop + textView.getMeasuredHeight());
|
textView.layout(viewLeft, viewTop, viewLeft + textView.getMeasuredWidth(), viewTop + textView.getMeasuredHeight());
|
||||||
}
|
}
|
||||||
if (imageView.getVisibility() == VISIBLE) {
|
if (imageView.getVisibility() == VISIBLE) {
|
||||||
viewTop = AndroidUtilities.dp(heightDp > 50 ? 0 : 2) + (height - imageView.getMeasuredHeight()) / 2 - imageView.getPaddingTop();
|
viewTop = dp(heightDp > 50 ? 0 : 2) + (height - imageView.getMeasuredHeight()) / 2 - imageView.getPaddingTop();
|
||||||
viewLeft = !LocaleController.isRTL ? AndroidUtilities.dp(imageLeft) : width - imageView.getMeasuredWidth() - AndroidUtilities.dp(imageLeft);
|
viewLeft = !LocaleController.isRTL ? dp(imageLeft) : width - imageView.getMeasuredWidth() - dp(imageLeft);
|
||||||
imageView.layout(viewLeft, viewTop, viewLeft + imageView.getMeasuredWidth(), viewTop + imageView.getMeasuredHeight());
|
imageView.layout(viewLeft, viewTop, viewLeft + imageView.getMeasuredWidth(), viewTop + imageView.getMeasuredHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (valueImageView.getVisibility() == VISIBLE) {
|
if (valueImageView.getVisibility() == VISIBLE) {
|
||||||
viewTop = (height - valueImageView.getMeasuredHeight()) / 2;
|
viewTop = (height - valueImageView.getMeasuredHeight()) / 2;
|
||||||
viewLeft = LocaleController.isRTL ? AndroidUtilities.dp(23) : width - valueImageView.getMeasuredWidth() - AndroidUtilities.dp(23);
|
viewLeft = LocaleController.isRTL ? dp(23) : width - valueImageView.getMeasuredWidth() - dp(23);
|
||||||
valueImageView.layout(viewLeft, viewTop, viewLeft + valueImageView.getMeasuredWidth(), viewTop + valueImageView.getMeasuredHeight());
|
valueImageView.layout(viewLeft, viewTop, viewLeft + valueImageView.getMeasuredWidth(), viewTop + valueImageView.getMeasuredHeight());
|
||||||
}
|
}
|
||||||
if (checkBox != null && checkBox.getVisibility() == VISIBLE) {
|
if (checkBox != null && checkBox.getVisibility() == VISIBLE) {
|
||||||
viewTop = (height - checkBox.getMeasuredHeight()) / 2;
|
viewTop = (height - checkBox.getMeasuredHeight()) / 2;
|
||||||
viewLeft = LocaleController.isRTL ? AndroidUtilities.dp(22) : width - checkBox.getMeasuredWidth() - AndroidUtilities.dp(22);
|
viewLeft = LocaleController.isRTL ? dp(22) : width - checkBox.getMeasuredWidth() - dp(22);
|
||||||
checkBox.layout(viewLeft, viewTop, viewLeft + checkBox.getMeasuredWidth(), viewTop + checkBox.getMeasuredHeight());
|
checkBox.layout(viewLeft, viewTop, viewLeft + checkBox.getMeasuredWidth(), viewTop + checkBox.getMeasuredHeight());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -286,6 +289,7 @@ public class TextCell extends FrameLayout {
|
||||||
public void setText(String text, boolean divider) {
|
public void setText(String text, boolean divider) {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setText(valueText = null, false);
|
valueTextView.setText(valueText = null, false);
|
||||||
imageView.setVisibility(GONE);
|
imageView.setVisibility(GONE);
|
||||||
valueTextView.setVisibility(GONE);
|
valueTextView.setVisibility(GONE);
|
||||||
|
@ -295,25 +299,32 @@ public class TextCell extends FrameLayout {
|
||||||
setWillNotDraw(!needDivider);
|
setWillNotDraw(!needDivider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTextAndIcon(String text, int resId, boolean divider) {
|
public void setLockLevel(boolean plus, int level) {
|
||||||
|
textView.setRightDrawable(new PeerColorActivity.LevelLock(getContext(), plus, level, resourcesProvider));
|
||||||
|
textView.setDrawablePadding(dp(6));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTextAndIcon(CharSequence text, int resId, boolean divider) {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setText(valueText = null, false);
|
valueTextView.setText(valueText = null, false);
|
||||||
imageView.setImageResource(resId);
|
imageView.setImageResource(resId);
|
||||||
imageView.setVisibility(VISIBLE);
|
imageView.setVisibility(VISIBLE);
|
||||||
valueTextView.setVisibility(GONE);
|
valueTextView.setVisibility(GONE);
|
||||||
valueSpoilersTextView.setVisibility(GONE);
|
valueSpoilersTextView.setVisibility(GONE);
|
||||||
valueImageView.setVisibility(GONE);
|
valueImageView.setVisibility(GONE);
|
||||||
imageView.setPadding(0, AndroidUtilities.dp(7), 0, 0);
|
imageView.setPadding(0, dp(7), 0, 0);
|
||||||
needDivider = divider;
|
needDivider = divider;
|
||||||
setWillNotDraw(!needDivider);
|
setWillNotDraw(!needDivider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTextAndColorfulIcon(String text, int resId, int color, boolean divider) {
|
public void setTextAndColorfulIcon(CharSequence text, int resId, int color, boolean divider) {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = 71;
|
offsetFromImage = 71;
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setText(valueText = null, false);
|
valueTextView.setText(valueText = null, false);
|
||||||
setColorfulIcon(color, resId);
|
setColorfulIcon(color, resId);
|
||||||
valueTextView.setVisibility(GONE);
|
valueTextView.setVisibility(GONE);
|
||||||
|
@ -326,6 +337,7 @@ public class TextCell extends FrameLayout {
|
||||||
offsetFromImage = 68;
|
offsetFromImage = 68;
|
||||||
imageLeft = 18;
|
imageLeft = 18;
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setText(valueText = null, false);
|
valueTextView.setText(valueText = null, false);
|
||||||
imageView.setColorFilter(null);
|
imageView.setColorFilter(null);
|
||||||
if (drawable instanceof RLottieDrawable) {
|
if (drawable instanceof RLottieDrawable) {
|
||||||
|
@ -336,7 +348,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageView.setVisibility(VISIBLE);
|
imageView.setVisibility(VISIBLE);
|
||||||
valueTextView.setVisibility(GONE);
|
valueTextView.setVisibility(GONE);
|
||||||
valueImageView.setVisibility(GONE);
|
valueImageView.setVisibility(GONE);
|
||||||
imageView.setPadding(0, AndroidUtilities.dp(6), 0, 0);
|
imageView.setPadding(0, dp(6), 0, 0);
|
||||||
needDivider = divider;
|
needDivider = divider;
|
||||||
setWillNotDraw(!needDivider);
|
setWillNotDraw(!needDivider);
|
||||||
}
|
}
|
||||||
|
@ -357,6 +369,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setText(TextUtils.ellipsize(valueText = value, valueTextView.getPaint(), AndroidUtilities.displaySize.x / 2.5f, TextUtils.TruncateAt.END), animated);
|
valueTextView.setText(TextUtils.ellipsize(valueText = value, valueTextView.getPaint(), AndroidUtilities.displaySize.x / 2.5f, TextUtils.TruncateAt.END), animated);
|
||||||
valueTextView.setVisibility(VISIBLE);
|
valueTextView.setVisibility(VISIBLE);
|
||||||
valueSpoilersTextView.setVisibility(GONE);
|
valueSpoilersTextView.setVisibility(GONE);
|
||||||
|
@ -373,6 +386,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setText(TextUtils.ellipsize(valueText = value, valueTextView.getPaint(), AndroidUtilities.displaySize.x / 2.5f, TextUtils.TruncateAt.END), animated);
|
valueTextView.setText(TextUtils.ellipsize(valueText = value, valueTextView.getPaint(), AndroidUtilities.displaySize.x / 2.5f, TextUtils.TruncateAt.END), animated);
|
||||||
valueTextView.setVisibility(VISIBLE);
|
valueTextView.setVisibility(VISIBLE);
|
||||||
valueSpoilersTextView.setVisibility(GONE);
|
valueSpoilersTextView.setVisibility(GONE);
|
||||||
|
@ -389,6 +403,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueSpoilersTextView.setVisibility(VISIBLE);
|
valueSpoilersTextView.setVisibility(VISIBLE);
|
||||||
valueSpoilersTextView.setText(value);
|
valueSpoilersTextView.setText(value);
|
||||||
valueTextView.setVisibility(GONE);
|
valueTextView.setVisibility(GONE);
|
||||||
|
@ -396,7 +411,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageView.setVisibility(VISIBLE);
|
imageView.setVisibility(VISIBLE);
|
||||||
imageView.setTranslationX(0);
|
imageView.setTranslationX(0);
|
||||||
imageView.setTranslationY(0);
|
imageView.setTranslationY(0);
|
||||||
imageView.setPadding(0, AndroidUtilities.dp(7), 0, 0);
|
imageView.setPadding(0, dp(7), 0, 0);
|
||||||
imageView.setImageResource(resId);
|
imageView.setImageResource(resId);
|
||||||
needDivider = divider;
|
needDivider = divider;
|
||||||
setWillNotDraw(!needDivider);
|
setWillNotDraw(!needDivider);
|
||||||
|
@ -409,6 +424,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueSpoilersTextView.setVisibility(VISIBLE);
|
valueSpoilersTextView.setVisibility(VISIBLE);
|
||||||
valueSpoilersTextView.setText(value);
|
valueSpoilersTextView.setText(value);
|
||||||
valueTextView.setVisibility(GONE);
|
valueTextView.setVisibility(GONE);
|
||||||
|
@ -429,6 +445,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setText(TextUtils.ellipsize(valueText = value, valueTextView.getPaint(), AndroidUtilities.displaySize.x / 2.5f, TextUtils.TruncateAt.END), animated);
|
valueTextView.setText(TextUtils.ellipsize(valueText = value, valueTextView.getPaint(), AndroidUtilities.displaySize.x / 2.5f, TextUtils.TruncateAt.END), animated);
|
||||||
valueTextView.setVisibility(VISIBLE);
|
valueTextView.setVisibility(VISIBLE);
|
||||||
valueSpoilersTextView.setVisibility(GONE);
|
valueSpoilersTextView.setVisibility(GONE);
|
||||||
|
@ -436,7 +453,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageView.setVisibility(VISIBLE);
|
imageView.setVisibility(VISIBLE);
|
||||||
imageView.setTranslationX(0);
|
imageView.setTranslationX(0);
|
||||||
imageView.setTranslationY(0);
|
imageView.setTranslationY(0);
|
||||||
imageView.setPadding(0, AndroidUtilities.dp(7), 0, 0);
|
imageView.setPadding(0, dp(7), 0, 0);
|
||||||
imageView.setImageResource(resId);
|
imageView.setImageResource(resId);
|
||||||
needDivider = divider;
|
needDivider = divider;
|
||||||
setWillNotDraw(!needDivider);
|
setWillNotDraw(!needDivider);
|
||||||
|
@ -445,7 +462,7 @@ public class TextCell extends FrameLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CharSequence applyNewSpan(String str) {
|
public static CharSequence applyNewSpan(CharSequence str) {
|
||||||
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(str);
|
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(str);
|
||||||
spannableStringBuilder.append(" d");
|
spannableStringBuilder.append(" d");
|
||||||
FilterCreateActivity.NewSpan span = new FilterCreateActivity.NewSpan(10);
|
FilterCreateActivity.NewSpan span = new FilterCreateActivity.NewSpan(10);
|
||||||
|
@ -457,17 +474,18 @@ public class TextCell extends FrameLayout {
|
||||||
public void setColorfulIcon(int color, int resId) {
|
public void setColorfulIcon(int color, int resId) {
|
||||||
offsetFromImage = getOffsetFromImage(true);
|
offsetFromImage = getOffsetFromImage(true);
|
||||||
imageView.setVisibility(VISIBLE);
|
imageView.setVisibility(VISIBLE);
|
||||||
imageView.setPadding(AndroidUtilities.dp(2), AndroidUtilities.dp(2), AndroidUtilities.dp(2), AndroidUtilities.dp(2));
|
imageView.setPadding(dp(2), dp(2), dp(2), dp(2));
|
||||||
imageView.setTranslationX(AndroidUtilities.dp(LocaleController.isRTL ? 0 : -3));
|
imageView.setTranslationX(dp(LocaleController.isRTL ? 0 : -3));
|
||||||
imageView.setImageResource(resId);
|
imageView.setImageResource(resId);
|
||||||
imageView.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN));
|
imageView.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN));
|
||||||
imageView.setBackground(Theme.createRoundRectDrawable(AndroidUtilities.dp(9), color));
|
imageView.setBackground(Theme.createRoundRectDrawable(dp(9), color));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTextAndCheck(CharSequence text, boolean checked, boolean divider) {
|
public void setTextAndCheck(CharSequence text, boolean checked, boolean divider) {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
imageView.setVisibility(GONE);
|
imageView.setVisibility(GONE);
|
||||||
valueImageView.setVisibility(GONE);
|
valueImageView.setVisibility(GONE);
|
||||||
needDivider = divider;
|
needDivider = divider;
|
||||||
|
@ -482,6 +500,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setVisibility(GONE);
|
valueTextView.setVisibility(GONE);
|
||||||
valueSpoilersTextView.setVisibility(GONE);
|
valueSpoilersTextView.setVisibility(GONE);
|
||||||
valueImageView.setVisibility(GONE);
|
valueImageView.setVisibility(GONE);
|
||||||
|
@ -490,7 +509,7 @@ public class TextCell extends FrameLayout {
|
||||||
checkBox.setChecked(checked, false);
|
checkBox.setChecked(checked, false);
|
||||||
}
|
}
|
||||||
imageView.setVisibility(VISIBLE);
|
imageView.setVisibility(VISIBLE);
|
||||||
imageView.setPadding(0, AndroidUtilities.dp(7), 0, 0);
|
imageView.setPadding(0, dp(7), 0, 0);
|
||||||
imageView.setImageResource(resId);
|
imageView.setImageResource(resId);
|
||||||
needDivider = divider;
|
needDivider = divider;
|
||||||
setWillNotDraw(!needDivider);
|
setWillNotDraw(!needDivider);
|
||||||
|
@ -500,6 +519,7 @@ public class TextCell extends FrameLayout {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setVisibility(GONE);
|
valueTextView.setVisibility(GONE);
|
||||||
valueSpoilersTextView.setVisibility(GONE);
|
valueSpoilersTextView.setVisibility(GONE);
|
||||||
valueImageView.setVisibility(GONE);
|
valueImageView.setVisibility(GONE);
|
||||||
|
@ -508,7 +528,7 @@ public class TextCell extends FrameLayout {
|
||||||
checkBox.setChecked(checked, false);
|
checkBox.setChecked(checked, false);
|
||||||
}
|
}
|
||||||
imageView.setVisibility(VISIBLE);
|
imageView.setVisibility(VISIBLE);
|
||||||
imageView.setPadding(0, AndroidUtilities.dp(7), 0, 0);
|
imageView.setPadding(0, dp(7), 0, 0);
|
||||||
imageView.setImageDrawable(resDrawable);
|
imageView.setImageDrawable(resDrawable);
|
||||||
needDivider = divider;
|
needDivider = divider;
|
||||||
setWillNotDraw(!needDivider);
|
setWillNotDraw(!needDivider);
|
||||||
|
@ -518,13 +538,14 @@ public class TextCell extends FrameLayout {
|
||||||
imageLeft = 21;
|
imageLeft = 21;
|
||||||
offsetFromImage = getOffsetFromImage(false);
|
offsetFromImage = getOffsetFromImage(false);
|
||||||
textView.setText(text);
|
textView.setText(text);
|
||||||
|
textView.setRightDrawable(null);
|
||||||
valueTextView.setText(valueText = null, false);
|
valueTextView.setText(valueText = null, false);
|
||||||
valueImageView.setVisibility(VISIBLE);
|
valueImageView.setVisibility(VISIBLE);
|
||||||
valueImageView.setImageDrawable(drawable);
|
valueImageView.setImageDrawable(drawable);
|
||||||
valueTextView.setVisibility(GONE);
|
valueTextView.setVisibility(GONE);
|
||||||
valueSpoilersTextView.setVisibility(GONE);
|
valueSpoilersTextView.setVisibility(GONE);
|
||||||
imageView.setVisibility(GONE);
|
imageView.setVisibility(GONE);
|
||||||
imageView.setPadding(0, AndroidUtilities.dp(7), 0, 0);
|
imageView.setPadding(0, dp(7), 0, 0);
|
||||||
needDivider = divider;
|
needDivider = divider;
|
||||||
setWillNotDraw(!needDivider);
|
setWillNotDraw(!needDivider);
|
||||||
if (checkBox != null) {
|
if (checkBox != null) {
|
||||||
|
@ -543,7 +564,7 @@ public class TextCell extends FrameLayout {
|
||||||
if (paint == null) {
|
if (paint == null) {
|
||||||
paint = Theme.dividerPaint;
|
paint = Theme.dividerPaint;
|
||||||
}
|
}
|
||||||
canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? (inDialogs ? 72 : 68) : 20), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? (inDialogs ? 72 : 68) : 20) : 0), getMeasuredHeight() - 1, paint);
|
canvas.drawLine(LocaleController.isRTL ? 0 : dp(imageView.getVisibility() == VISIBLE ? (inDialogs ? 72 : 68) : 20), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? dp(imageView.getVisibility() == VISIBLE ? (inDialogs ? 72 : 68) : 20) : 0), getMeasuredHeight() - 1, paint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -693,16 +714,16 @@ public class TextCell extends FrameLayout {
|
||||||
paint.setAlpha((int) (255 * alpha));
|
paint.setAlpha((int) (255 * alpha));
|
||||||
int cy = getMeasuredHeight() >> 1;
|
int cy = getMeasuredHeight() >> 1;
|
||||||
AndroidUtilities.rectTmp.set(
|
AndroidUtilities.rectTmp.set(
|
||||||
getMeasuredWidth() - AndroidUtilities.dp(21) - AndroidUtilities.dp(loadingSize),
|
getMeasuredWidth() - dp(21) - dp(loadingSize),
|
||||||
cy - AndroidUtilities.dp(3),
|
cy - dp(3),
|
||||||
getMeasuredWidth() - AndroidUtilities.dp(21),
|
getMeasuredWidth() - dp(21),
|
||||||
cy + AndroidUtilities.dp(3)
|
cy + dp(3)
|
||||||
);
|
);
|
||||||
if (LocaleController.isRTL) {
|
if (LocaleController.isRTL) {
|
||||||
AndroidUtilities.rectTmp.left = getMeasuredWidth() - AndroidUtilities.rectTmp.left;
|
AndroidUtilities.rectTmp.left = getMeasuredWidth() - AndroidUtilities.rectTmp.left;
|
||||||
AndroidUtilities.rectTmp.right = getMeasuredWidth() - AndroidUtilities.rectTmp.right;
|
AndroidUtilities.rectTmp.right = getMeasuredWidth() - AndroidUtilities.rectTmp.right;
|
||||||
}
|
}
|
||||||
canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(3), AndroidUtilities.dp(3), paint);
|
canvas.drawRoundRect(AndroidUtilities.rectTmp, dp(3), dp(3), paint);
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
valueTextView.setAlpha(1f - drawLoadingProgress);
|
valueTextView.setAlpha(1f - drawLoadingProgress);
|
||||||
|
|
|
@ -385,10 +385,13 @@ public class TextCheckCell extends FrameLayout {
|
||||||
canvas.drawCircle(cx, cy, animatedRad, animationPaint);
|
canvas.drawCircle(cx, cy, animatedRad, animationPaint);
|
||||||
}
|
}
|
||||||
if (needDivider) {
|
if (needDivider) {
|
||||||
|
Paint dividerPaint = resourcesProvider != null ? resourcesProvider.getPaint(Theme.key_paint_divider) : Theme.dividerPaint;
|
||||||
|
if (dividerPaint != null) {
|
||||||
if (imageView != null) {
|
if (imageView != null) {
|
||||||
canvas.drawLine(LocaleController.isRTL ? 0 : padding, getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? padding : 0), getMeasuredHeight() - 1, Theme.dividerPaint);
|
canvas.drawLine(LocaleController.isRTL ? 0 : padding, getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? padding : 0), getMeasuredHeight() - 1, dividerPaint);
|
||||||
} else {
|
} else {
|
||||||
canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(20), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(20) : 0), getMeasuredHeight() - 1, Theme.dividerPaint);
|
canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(20), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(20) : 0), getMeasuredHeight() - 1, dividerPaint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import android.view.MotionEvent;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
import org.telegram.messenger.AndroidUtilities;
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
|
@ -30,7 +31,9 @@ import org.telegram.ui.ActionBar.BaseFragment;
|
||||||
import org.telegram.ui.ActionBar.INavigationLayout;
|
import org.telegram.ui.ActionBar.INavigationLayout;
|
||||||
import org.telegram.ui.ActionBar.Theme;
|
import org.telegram.ui.ActionBar.Theme;
|
||||||
import org.telegram.ui.ChatActivity;
|
import org.telegram.ui.ChatActivity;
|
||||||
|
import org.telegram.ui.ChatBackgroundDrawable;
|
||||||
import org.telegram.ui.Components.AnimatedColor;
|
import org.telegram.ui.Components.AnimatedColor;
|
||||||
|
import org.telegram.ui.Components.AnimatedFloat;
|
||||||
import org.telegram.ui.Components.AvatarDrawable;
|
import org.telegram.ui.Components.AvatarDrawable;
|
||||||
import org.telegram.ui.Components.BackgroundGradientDrawable;
|
import org.telegram.ui.Components.BackgroundGradientDrawable;
|
||||||
import org.telegram.ui.Components.CubicBezierInterpolator;
|
import org.telegram.ui.Components.CubicBezierInterpolator;
|
||||||
|
@ -38,6 +41,7 @@ import org.telegram.ui.Components.LayoutHelper;
|
||||||
import org.telegram.ui.Components.MotionBackgroundDrawable;
|
import org.telegram.ui.Components.MotionBackgroundDrawable;
|
||||||
import org.telegram.ui.Components.Reactions.ReactionsEffectOverlay;
|
import org.telegram.ui.Components.Reactions.ReactionsEffectOverlay;
|
||||||
import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble;
|
import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble;
|
||||||
|
import org.telegram.ui.Stories.recorder.StoryEntry;
|
||||||
|
|
||||||
public class ThemePreviewMessagesCell extends LinearLayout {
|
public class ThemePreviewMessagesCell extends LinearLayout {
|
||||||
|
|
||||||
|
@ -340,10 +344,7 @@ public class ThemePreviewMessagesCell extends LinearLayout {
|
||||||
if (getMessageObject() != null && getMessageObject().overrideLinkColor >= 0) {
|
if (getMessageObject() != null && getMessageObject().overrideLinkColor >= 0) {
|
||||||
final int colorId = getMessageObject().overrideLinkColor;
|
final int colorId = getMessageObject().overrideLinkColor;
|
||||||
final int color1, color2;
|
final int color1, color2;
|
||||||
if (getMessageObject().overrideProfilePeerColor != null) {
|
if (colorId >= 14) {
|
||||||
color1 = getMessageObject().overrideProfilePeerColor.getAvatarColor1();
|
|
||||||
color2 = getMessageObject().overrideProfilePeerColor.getAvatarColor2();
|
|
||||||
} else if (colorId >= 14) {
|
|
||||||
MessagesController messagesController = MessagesController.getInstance(UserConfig.selectedAccount);
|
MessagesController messagesController = MessagesController.getInstance(UserConfig.selectedAccount);
|
||||||
MessagesController.PeerColors peerColors = messagesController != null ? messagesController.peerColors : null;
|
MessagesController.PeerColors peerColors = messagesController != null ? messagesController.peerColors : null;
|
||||||
MessagesController.PeerColor peerColor = peerColors != null ? peerColors.getColor(colorId) : null;
|
MessagesController.PeerColor peerColor = peerColors != null ? peerColors.getColor(colorId) : null;
|
||||||
|
@ -443,9 +444,32 @@ public class ThemePreviewMessagesCell extends LinearLayout {
|
||||||
private Drawable overrideDrawable;
|
private Drawable overrideDrawable;
|
||||||
public void setOverrideBackground(Drawable drawable) {
|
public void setOverrideBackground(Drawable drawable) {
|
||||||
overrideDrawable = drawable;
|
overrideDrawable = drawable;
|
||||||
|
if (overrideDrawable != null) {
|
||||||
|
overrideDrawable.setCallback(this);
|
||||||
|
}
|
||||||
|
if (overrideDrawable instanceof ChatBackgroundDrawable) {
|
||||||
|
if (isAttachedToWindow()) {
|
||||||
|
((ChatBackgroundDrawable) overrideDrawable).onAttachedToWindow(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onAttachedToWindow() {
|
||||||
|
super.onAttachedToWindow();
|
||||||
|
if (overrideDrawable instanceof ChatBackgroundDrawable) {
|
||||||
|
((ChatBackgroundDrawable) overrideDrawable).onAttachedToWindow(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean verifyDrawable(@NonNull Drawable who) {
|
||||||
|
return who == overrideDrawable || who == oldBackgroundDrawable || super.verifyDrawable(who);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean customAnimation;
|
||||||
|
private final AnimatedFloat overrideDrawableUpdate = new AnimatedFloat(this, 0, 350, CubicBezierInterpolator.EASE_OUT_QUINT);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDraw(Canvas canvas) {
|
protected void onDraw(Canvas canvas) {
|
||||||
|
@ -454,7 +478,7 @@ public class ThemePreviewMessagesCell extends LinearLayout {
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
if (newDrawable != backgroundDrawable && newDrawable != null) {
|
if (newDrawable != backgroundDrawable && newDrawable != null) {
|
||||||
if (Theme.isAnimatingColor()) {
|
if (Theme.isAnimatingColor() || customAnimation) {
|
||||||
oldBackgroundDrawable = backgroundDrawable;
|
oldBackgroundDrawable = backgroundDrawable;
|
||||||
oldBackgroundGradientDisposable = backgroundGradientDisposable;
|
oldBackgroundGradientDisposable = backgroundGradientDisposable;
|
||||||
} else if (backgroundGradientDisposable != null) {
|
} else if (backgroundGradientDisposable != null) {
|
||||||
|
@ -462,15 +486,16 @@ public class ThemePreviewMessagesCell extends LinearLayout {
|
||||||
backgroundGradientDisposable = null;
|
backgroundGradientDisposable = null;
|
||||||
}
|
}
|
||||||
backgroundDrawable = newDrawable;
|
backgroundDrawable = newDrawable;
|
||||||
|
overrideDrawableUpdate.set(0, true);
|
||||||
}
|
}
|
||||||
float themeAnimationValue = parentLayout.getThemeAnimationValue();
|
float themeAnimationValue = customAnimation ? overrideDrawableUpdate.set(1) : parentLayout.getThemeAnimationValue();
|
||||||
for (int a = 0; a < 2; a++) {
|
for (int a = 0; a < 2; a++) {
|
||||||
Drawable drawable = a == 0 ? oldBackgroundDrawable : backgroundDrawable;
|
Drawable drawable = a == 0 ? oldBackgroundDrawable : backgroundDrawable;
|
||||||
if (drawable == null) {
|
if (drawable == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int alpha;
|
int alpha;
|
||||||
if (a == 1 && oldBackgroundDrawable != null && parentLayout != null) {
|
if (a == 1 && oldBackgroundDrawable != null && (parentLayout != null || customAnimation)) {
|
||||||
alpha = (int) (255 * themeAnimationValue);
|
alpha = (int) (255 * themeAnimationValue);
|
||||||
} else {
|
} else {
|
||||||
alpha = 255;
|
alpha = 255;
|
||||||
|
@ -510,6 +535,8 @@ public class ThemePreviewMessagesCell extends LinearLayout {
|
||||||
}
|
}
|
||||||
drawable.draw(canvas);
|
drawable.draw(canvas);
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
|
} else {
|
||||||
|
StoryEntry.drawBackgroundDrawable(canvas, drawable, getWidth(), getHeight());
|
||||||
}
|
}
|
||||||
if (a == 0 && oldBackgroundDrawable != null && themeAnimationValue >= 1.0f) {
|
if (a == 0 && oldBackgroundDrawable != null && themeAnimationValue >= 1.0f) {
|
||||||
if (oldBackgroundGradientDisposable != null) {
|
if (oldBackgroundGradientDisposable != null) {
|
||||||
|
@ -539,6 +566,9 @@ public class ThemePreviewMessagesCell extends LinearLayout {
|
||||||
oldBackgroundGradientDisposable.dispose();
|
oldBackgroundGradientDisposable.dispose();
|
||||||
oldBackgroundGradientDisposable = null;
|
oldBackgroundGradientDisposable = null;
|
||||||
}
|
}
|
||||||
|
if (overrideDrawable instanceof ChatBackgroundDrawable) {
|
||||||
|
((ChatBackgroundDrawable) overrideDrawable).onDetachedFromWindow(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -354,7 +354,7 @@ public class WallpaperCell extends FrameLayout {
|
||||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||||
int availableWidth = width - AndroidUtilities.dp(14 * 2 + 6 * (spanCount - 1));
|
int availableWidth = width - AndroidUtilities.dp(14 * 2 + 6 * (spanCount - 1));
|
||||||
int itemWidth = availableWidth / spanCount;
|
int itemWidth = availableWidth / spanCount;
|
||||||
int height = currentType == WallpapersListActivity.TYPE_ALL ? AndroidUtilities.dp(180) : itemWidth;
|
int height = currentType == WallpapersListActivity.TYPE_ALL || currentType == WallpapersListActivity.TYPE_CHANNEL_PATTERNS || currentType == WallpapersListActivity.TYPE_CHANNEL_CUSTOM ? AndroidUtilities.dp(180) : itemWidth;
|
||||||
setMeasuredDimension(width, height + (isTop ? AndroidUtilities.dp(14) : 0) + (AndroidUtilities.dp(isBottom ? 14 : 6)));
|
setMeasuredDimension(width, height + (isTop ? AndroidUtilities.dp(14) : 0) + (AndroidUtilities.dp(isBottom ? 14 : 6)));
|
||||||
|
|
||||||
for (int a = 0; a < spanCount; a++) {
|
for (int a = 0; a < spanCount; a++) {
|
||||||
|
|
|
@ -2377,7 +2377,7 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needPlayMessage(MessageObject messageObject, boolean muted) {
|
public boolean needPlayMessage(ChatMessageCell cell, MessageObject messageObject, boolean muted) {
|
||||||
if (messageObject.isVoice() || messageObject.isRoundVideo()) {
|
if (messageObject.isVoice() || messageObject.isRoundVideo()) {
|
||||||
boolean result = MediaController.getInstance().playMessage(messageObject, muted);
|
boolean result = MediaController.getInstance().playMessage(messageObject, muted);
|
||||||
MediaController.getInstance().setVoiceMessagesPlaylist(null, false);
|
MediaController.getInstance().setVoiceMessagesPlaylist(null, false);
|
||||||
|
@ -2674,6 +2674,10 @@ public class ChannelAdminLogActivity extends BaseFragment implements Notificatio
|
||||||
@Override
|
@Override
|
||||||
public void didClickImage(ChatActionCell cell) {
|
public void didClickImage(ChatActionCell cell) {
|
||||||
MessageObject message = cell.getMessageObject();
|
MessageObject message = cell.getMessageObject();
|
||||||
|
if (message.type == MessageObject.TYPE_ACTION_WALLPAPER) {
|
||||||
|
presentFragment(new ChannelColorActivity(getDialogId()).setOnApplied(ChannelAdminLogActivity.this));
|
||||||
|
return;
|
||||||
|
}
|
||||||
PhotoViewer.getInstance().setParentActivity(ChannelAdminLogActivity.this);
|
PhotoViewer.getInstance().setParentActivity(ChannelAdminLogActivity.this);
|
||||||
TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, 640);
|
TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, 640);
|
||||||
if (photoSize != null) {
|
if (photoSize != null) {
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,491 @@
|
||||||
|
package org.telegram.ui;
|
||||||
|
|
||||||
|
import static org.telegram.messenger.AndroidUtilities.dp;
|
||||||
|
|
||||||
|
import android.animation.Animator;
|
||||||
|
import android.animation.AnimatorListenerAdapter;
|
||||||
|
import android.animation.ValueAnimator;
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapShader;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.PorterDuff;
|
||||||
|
import android.graphics.PorterDuffXfermode;
|
||||||
|
import android.graphics.Shader;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.DefaultItemAnimator;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
|
import org.telegram.messenger.ChatThemeController;
|
||||||
|
import org.telegram.messenger.DialogObject;
|
||||||
|
import org.telegram.messenger.LocaleController;
|
||||||
|
import org.telegram.messenger.MessagesController;
|
||||||
|
import org.telegram.messenger.R;
|
||||||
|
import org.telegram.messenger.Utilities;
|
||||||
|
import org.telegram.tgnet.TLRPC;
|
||||||
|
import org.telegram.tgnet.tl.TL_stories;
|
||||||
|
import org.telegram.ui.ActionBar.ActionBar;
|
||||||
|
import org.telegram.ui.ActionBar.ActionBarMenuItem;
|
||||||
|
import org.telegram.ui.ActionBar.BaseFragment;
|
||||||
|
import org.telegram.ui.ActionBar.Theme;
|
||||||
|
import org.telegram.ui.Cells.TextCell;
|
||||||
|
import org.telegram.ui.Cells.TextInfoPrivacyCell;
|
||||||
|
import org.telegram.ui.Components.ChatThemeBottomSheet;
|
||||||
|
import org.telegram.ui.Components.CubicBezierInterpolator;
|
||||||
|
import org.telegram.ui.Components.Easings;
|
||||||
|
import org.telegram.ui.Components.LayoutHelper;
|
||||||
|
import org.telegram.ui.Components.RLottieDrawable;
|
||||||
|
import org.telegram.ui.Components.RecyclerListView;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public class ChannelWallpaperActivity extends BaseFragment {
|
||||||
|
|
||||||
|
public final long dialogId;
|
||||||
|
public int currentLevel;
|
||||||
|
public TL_stories.TL_premium_boostsStatus boostsStatus;
|
||||||
|
public TLRPC.WallPaper galleryWallpaper;
|
||||||
|
public TLRPC.WallPaper currentWallpaper, selectedWallpaper;
|
||||||
|
|
||||||
|
public ChannelWallpaperActivity(long dialogId, TL_stories.TL_premium_boostsStatus boostsStatus) {
|
||||||
|
super();
|
||||||
|
this.dialogId = dialogId;
|
||||||
|
TLRPC.Chat chat = getMessagesController().getChat(-dialogId);
|
||||||
|
if (chat != null) {
|
||||||
|
currentLevel = chat.level;
|
||||||
|
}
|
||||||
|
this.boostsStatus = boostsStatus;
|
||||||
|
if (boostsStatus == null) {
|
||||||
|
MessagesController.getInstance(currentAccount).getBoostsController().getBoostsStats(dialogId, loadedBoostsStatus -> {
|
||||||
|
this.boostsStatus = loadedBoostsStatus;
|
||||||
|
if (boostsStatus != null) {
|
||||||
|
this.currentLevel = boostsStatus.level;
|
||||||
|
if (chat != null) {
|
||||||
|
chat.flags |= 1024;
|
||||||
|
chat.level = currentLevel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
currentLevel = boostsStatus.level;
|
||||||
|
}
|
||||||
|
|
||||||
|
TLRPC.ChatFull chatFull = getMessagesController().getChatFull(-dialogId);
|
||||||
|
if (chatFull != null) {
|
||||||
|
currentWallpaper = selectedWallpaper = chatFull.wallpaper;
|
||||||
|
if (ChatThemeController.isNotEmoticonWallpaper(selectedWallpaper)) {
|
||||||
|
galleryWallpaper = selectedWallpaper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedWallpaper(TLRPC.WallPaper wallpaper, TLRPC.WallPaper galleryWallpaper) {
|
||||||
|
selectedWallpaper = wallpaper;
|
||||||
|
this.galleryWallpaper = galleryWallpaper;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Utilities.Callback3<TLRPC.WallPaper, TLRPC.WallPaper, TLRPC.WallPaper> onSelectedWallpaperChange;
|
||||||
|
public void setOnSelectedWallpaperChange(Utilities.Callback3<TLRPC.WallPaper, TLRPC.WallPaper, TLRPC.WallPaper> listener) {
|
||||||
|
onSelectedWallpaperChange = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FrameLayout contentView;
|
||||||
|
public RecyclerListView listView;
|
||||||
|
public Adapter adapter;
|
||||||
|
public boolean isDark() {
|
||||||
|
return resourceProvider != null ? resourceProvider.isDark() : Theme.isCurrentThemeDark();
|
||||||
|
}
|
||||||
|
|
||||||
|
private RLottieDrawable sunDrawable;
|
||||||
|
private ActionBarMenuItem dayNightItem;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View createView(Context context) {
|
||||||
|
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
|
||||||
|
actionBar.setTitle(LocaleController.getString(R.string.ChannelWallpaper));
|
||||||
|
actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() {
|
||||||
|
@Override
|
||||||
|
public void onItemClick(int id) {
|
||||||
|
if (id == -1) {
|
||||||
|
finishFragment();
|
||||||
|
} else if (id == 1) {
|
||||||
|
toggleTheme();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
sunDrawable = new RLottieDrawable(R.raw.sun, "" + R.raw.sun, dp(28), dp(28), true, null);
|
||||||
|
sunDrawable.setPlayInDirectionOfCustomEndFrame(true);
|
||||||
|
if (!isDark()) {
|
||||||
|
sunDrawable.setCustomEndFrame(0);
|
||||||
|
sunDrawable.setCurrentFrame(0);
|
||||||
|
} else {
|
||||||
|
sunDrawable.setCurrentFrame(35);
|
||||||
|
sunDrawable.setCustomEndFrame(36);
|
||||||
|
}
|
||||||
|
sunDrawable.beginApplyLayerColors();
|
||||||
|
int color = Theme.getColor(Theme.key_chats_menuName, resourceProvider);
|
||||||
|
sunDrawable.setLayerColor("Sunny.**", color);
|
||||||
|
sunDrawable.setLayerColor("Path 6.**", color);
|
||||||
|
sunDrawable.setLayerColor("Path.**", color);
|
||||||
|
sunDrawable.setLayerColor("Path 5.**", color);
|
||||||
|
if (resourceProvider instanceof ChannelColorActivity.ThemeDelegate) {
|
||||||
|
dayNightItem = actionBar.createMenu().addItem(1, sunDrawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
contentView = new FrameLayout(context);
|
||||||
|
|
||||||
|
updateRows();
|
||||||
|
listView = new RecyclerListView(context, resourceProvider);
|
||||||
|
listView.setAdapter(adapter = new Adapter());
|
||||||
|
listView.setLayoutManager(new LinearLayoutManager(context));
|
||||||
|
contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL));
|
||||||
|
listView.setOnItemClickListener((view, position) -> {
|
||||||
|
if (position == removeRow) {
|
||||||
|
galleryWallpaper = null;
|
||||||
|
selectedWallpaper = null;
|
||||||
|
if (onSelectedWallpaperChange != null) {
|
||||||
|
onSelectedWallpaperChange.run(currentWallpaper, selectedWallpaper, galleryWallpaper);
|
||||||
|
}
|
||||||
|
|
||||||
|
View themesView = findChildAt(themesRow);
|
||||||
|
if (themesView instanceof ChannelColorActivity.ThemeChooser) {
|
||||||
|
((ChannelColorActivity.ThemeChooser) themesView).setGalleryWallpaper(galleryWallpaper);
|
||||||
|
}
|
||||||
|
updateRows();
|
||||||
|
} else if (position == galleryRow) {
|
||||||
|
ChatThemeBottomSheet.openGalleryForBackground(getParentActivity(), this, dialogId, resourceProvider, wallpaper -> {
|
||||||
|
galleryWallpaper = currentWallpaper = selectedWallpaper = wallpaper;
|
||||||
|
if (onSelectedWallpaperChange != null) {
|
||||||
|
onSelectedWallpaperChange.run(currentWallpaper, selectedWallpaper, galleryWallpaper);
|
||||||
|
}
|
||||||
|
finishFragment();
|
||||||
|
}, toggleThemeDelegate, boostsStatus);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
DefaultItemAnimator itemAnimator = new DefaultItemAnimator();
|
||||||
|
itemAnimator.setDurations(350);
|
||||||
|
itemAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT);
|
||||||
|
itemAnimator.setDelayAnimations(false);
|
||||||
|
itemAnimator.setSupportsChangeAnimations(false);
|
||||||
|
listView.setItemAnimator(itemAnimator);
|
||||||
|
|
||||||
|
updateColors();
|
||||||
|
|
||||||
|
return fragmentView = contentView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public View findChildAt(int position) {
|
||||||
|
for (int i = 0; i < listView.getChildCount(); ++i) {
|
||||||
|
View child = listView.getChildAt(i);
|
||||||
|
if (listView.getChildAdapterPosition(child) == position) {
|
||||||
|
return child;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int VIEW_TYPE_BUTTON = 0;
|
||||||
|
public static final int VIEW_TYPE_INFO = 1;
|
||||||
|
public static final int VIEW_TYPE_THEMES = 2;
|
||||||
|
|
||||||
|
public int rowsCount = 0;
|
||||||
|
public int galleryRow = -1;
|
||||||
|
public int removeRow = -1;
|
||||||
|
public int infoRow = -1;
|
||||||
|
public int themesRow = -1;
|
||||||
|
|
||||||
|
public void updateRows() {
|
||||||
|
rowsCount = 0;
|
||||||
|
galleryRow = rowsCount++;
|
||||||
|
final int wasRemoveRow = removeRow;
|
||||||
|
if (galleryWallpaper != null) {
|
||||||
|
removeRow = rowsCount++;
|
||||||
|
} else {
|
||||||
|
removeRow = -1;
|
||||||
|
}
|
||||||
|
if (adapter != null) {
|
||||||
|
if (removeRow != -1 && wasRemoveRow == -1) {
|
||||||
|
adapter.notifyItemInserted(removeRow);
|
||||||
|
}
|
||||||
|
if (removeRow == -1 && wasRemoveRow != -1) {
|
||||||
|
adapter.notifyItemRemoved(wasRemoveRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
infoRow = rowsCount++;
|
||||||
|
themesRow = rowsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Adapter extends RecyclerListView.SelectionAdapter {
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
View view;
|
||||||
|
if (viewType == VIEW_TYPE_BUTTON) {
|
||||||
|
TextCell textCell = new TextCell(getContext(), resourceProvider);
|
||||||
|
textCell.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite));
|
||||||
|
view = textCell;
|
||||||
|
} else if (viewType == VIEW_TYPE_THEMES) {
|
||||||
|
ChannelColorActivity.ThemeChooser themesWallpaper = new ChannelColorActivity.ThemeChooser(getContext(), true, currentAccount, resourceProvider);
|
||||||
|
themesWallpaper.setSelectedEmoticon(ChatThemeController.getWallpaperEmoticon(selectedWallpaper), false);
|
||||||
|
themesWallpaper.setGalleryWallpaper(galleryWallpaper);
|
||||||
|
themesWallpaper.setOnEmoticonSelected(emoticon -> {
|
||||||
|
if (emoticon == null) {
|
||||||
|
selectedWallpaper = galleryWallpaper;
|
||||||
|
themesWallpaper.setSelectedEmoticon(null, false);
|
||||||
|
if (onSelectedWallpaperChange != null) {
|
||||||
|
onSelectedWallpaperChange.run(currentWallpaper, selectedWallpaper, galleryWallpaper);
|
||||||
|
}
|
||||||
|
updateRows();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemePreviewActivity themePreviewActivity = new ThemePreviewActivity(new WallpapersListActivity.EmojiWallpaper(emoticon), null) {
|
||||||
|
@Override
|
||||||
|
public boolean insideBottomSheet() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
themePreviewActivity.boostsStatus = boostsStatus;
|
||||||
|
themePreviewActivity.setOnSwitchDayNightDelegate(toggleThemeDelegate);
|
||||||
|
themePreviewActivity.setResourceProvider(resourceProvider);
|
||||||
|
themePreviewActivity.setInitialModes(false, false, .20f);
|
||||||
|
themePreviewActivity.setDialogId(dialogId);
|
||||||
|
themePreviewActivity.setDelegate(wallPaper -> {
|
||||||
|
selectedWallpaper = new TLRPC.TL_wallPaperNoFile();
|
||||||
|
selectedWallpaper.id = 0;
|
||||||
|
selectedWallpaper.flags |= 4;
|
||||||
|
selectedWallpaper.settings = new TLRPC.TL_wallPaperSettings();
|
||||||
|
selectedWallpaper.settings.emoticon = emoticon;
|
||||||
|
themesWallpaper.setSelectedEmoticon(emoticon, false);
|
||||||
|
if (onSelectedWallpaperChange != null) {
|
||||||
|
onSelectedWallpaperChange.run(currentWallpaper, selectedWallpaper, galleryWallpaper);
|
||||||
|
}
|
||||||
|
updateRows();
|
||||||
|
finishFragment();
|
||||||
|
});
|
||||||
|
BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams();
|
||||||
|
params.transitionFromLeft = true;
|
||||||
|
params.allowNestedScroll = false;
|
||||||
|
params.occupyNavigationBar = true;
|
||||||
|
showAsSheet(themePreviewActivity, params);
|
||||||
|
});
|
||||||
|
themesWallpaper.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite));
|
||||||
|
view = themesWallpaper;
|
||||||
|
} else {
|
||||||
|
view = new TextInfoPrivacyCell(getContext());
|
||||||
|
}
|
||||||
|
return new RecyclerListView.Holder(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position) {
|
||||||
|
if (position == galleryRow || position == removeRow) {
|
||||||
|
return VIEW_TYPE_BUTTON;
|
||||||
|
}
|
||||||
|
if (position == themesRow) {
|
||||||
|
return VIEW_TYPE_THEMES;
|
||||||
|
}
|
||||||
|
return VIEW_TYPE_INFO;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
|
if (position == galleryRow) {
|
||||||
|
((TextCell) holder.itemView).setTextAndIcon(LocaleController.getString(R.string.ChooseFromGallery2), R.drawable.msg_background, removeRow != -1);
|
||||||
|
((TextCell) holder.itemView).setColors(Theme.key_windowBackgroundWhiteBlueIcon, Theme.key_windowBackgroundWhiteBlueButton);
|
||||||
|
} else if (position == removeRow) {
|
||||||
|
((TextCell) holder.itemView).setTextAndIcon(LocaleController.getString(R.string.ChannelWallpaperRemove), R.drawable.msg_delete, false);
|
||||||
|
((TextCell) holder.itemView).setColors(Theme.key_text_RedRegular, Theme.key_text_RedRegular);
|
||||||
|
} else if (position == infoRow) {
|
||||||
|
((TextInfoPrivacyCell) holder.itemView).setText(LocaleController.getString(R.string.ChannelWallpaperInfo));
|
||||||
|
((TextInfoPrivacyCell) holder.itemView).setBackgroundColor(getThemedColor(Theme.key_windowBackgroundGray));
|
||||||
|
((TextInfoPrivacyCell) holder.itemView).setForeground(Theme.getThemedDrawableByKey(getContext(), R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow, resourceProvider));
|
||||||
|
} else if (position == themesRow) {
|
||||||
|
((ChannelColorActivity.ThemeChooser) holder.itemView).setGalleryWallpaper(galleryWallpaper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) {
|
||||||
|
if (holder.itemView instanceof ChannelColorActivity.ThemeChooser) {
|
||||||
|
((ChannelColorActivity.ThemeChooser) holder.itemView).setGalleryWallpaper(galleryWallpaper);
|
||||||
|
}
|
||||||
|
super.onViewAttachedToWindow(holder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return rowsCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled(RecyclerView.ViewHolder holder) {
|
||||||
|
return holder.getItemViewType() == VIEW_TYPE_BUTTON;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateColors() {
|
||||||
|
actionBar.setBackgroundColor(getThemedColor(Theme.key_actionBarDefault));
|
||||||
|
actionBar.setTitleColor(getThemedColor(Theme.key_actionBarDefaultTitle));
|
||||||
|
actionBar.setItemsColor(getThemedColor(Theme.key_actionBarDefaultIcon), false);
|
||||||
|
actionBar.setItemsBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSelector), false);
|
||||||
|
listView.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundGray));
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
AndroidUtilities.forEachViews(listView, this::updateColors);
|
||||||
|
setNavigationBarColor(getNavigationBarColor());
|
||||||
|
contentView.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateColors(View view) {
|
||||||
|
if (view instanceof TextInfoPrivacyCell) {
|
||||||
|
((TextInfoPrivacyCell) view).setBackgroundColor(getThemedColor(Theme.key_windowBackgroundGray));
|
||||||
|
((TextInfoPrivacyCell) view).setForeground(Theme.getThemedDrawableByKey(getContext(), R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow, resourceProvider));
|
||||||
|
} else {
|
||||||
|
view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite));
|
||||||
|
if (view instanceof TextCell) {
|
||||||
|
((TextCell) view).updateColors();
|
||||||
|
} else if (view instanceof ChannelColorActivity.ThemeChooser) {
|
||||||
|
((ChannelColorActivity.ThemeChooser) view).updateColors();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThemePreviewActivity.DayNightSwitchDelegate toggleThemeDelegate = new ThemePreviewActivity.DayNightSwitchDelegate() {
|
||||||
|
@Override
|
||||||
|
public boolean isDark() {
|
||||||
|
return ChannelWallpaperActivity.this.isDark();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void switchDayNight(boolean animated) {
|
||||||
|
if (resourceProvider instanceof ChannelColorActivity.ThemeDelegate) {
|
||||||
|
((ChannelColorActivity.ThemeDelegate) resourceProvider).toggle();
|
||||||
|
}
|
||||||
|
setForceDark(isDark(), false);
|
||||||
|
updateColors();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsAnimation() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private View changeDayNightView;
|
||||||
|
private float changeDayNightViewProgress;
|
||||||
|
private ValueAnimator changeDayNightViewAnimator;
|
||||||
|
|
||||||
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
|
public void toggleTheme() {
|
||||||
|
FrameLayout decorView1 = (FrameLayout) getParentActivity().getWindow().getDecorView();
|
||||||
|
Bitmap bitmap = Bitmap.createBitmap(decorView1.getWidth(), decorView1.getHeight(), Bitmap.Config.ARGB_8888);
|
||||||
|
Canvas bitmapCanvas = new Canvas(bitmap);
|
||||||
|
dayNightItem.setAlpha(0f);
|
||||||
|
decorView1.draw(bitmapCanvas);
|
||||||
|
dayNightItem.setAlpha(1f);
|
||||||
|
|
||||||
|
Paint xRefPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
|
xRefPaint.setColor(0xff000000);
|
||||||
|
xRefPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
|
||||||
|
|
||||||
|
Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
|
bitmapPaint.setFilterBitmap(true);
|
||||||
|
int[] position = new int[2];
|
||||||
|
dayNightItem.getLocationInWindow(position);
|
||||||
|
float x = position[0];
|
||||||
|
float y = position[1];
|
||||||
|
float cx = x + dayNightItem.getMeasuredWidth() / 2f;
|
||||||
|
float cy = y + dayNightItem.getMeasuredHeight() / 2f;
|
||||||
|
|
||||||
|
float r = Math.max(bitmap.getHeight(), bitmap.getWidth()) + AndroidUtilities.navigationBarHeight;
|
||||||
|
|
||||||
|
Shader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
|
||||||
|
bitmapPaint.setShader(bitmapShader);
|
||||||
|
changeDayNightView = new View(getContext()) {
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas canvas) {
|
||||||
|
super.onDraw(canvas);
|
||||||
|
if (isDark()) {
|
||||||
|
if (changeDayNightViewProgress > 0f) {
|
||||||
|
bitmapCanvas.drawCircle(cx, cy, r * changeDayNightViewProgress, xRefPaint);
|
||||||
|
}
|
||||||
|
canvas.drawBitmap(bitmap, 0, 0, bitmapPaint);
|
||||||
|
} else {
|
||||||
|
canvas.drawCircle(cx, cy, r * (1f - changeDayNightViewProgress), bitmapPaint);
|
||||||
|
}
|
||||||
|
canvas.save();
|
||||||
|
canvas.translate(x, y);
|
||||||
|
dayNightItem.draw(canvas);
|
||||||
|
canvas.restore();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
changeDayNightView.setOnTouchListener((v, event) -> true);
|
||||||
|
changeDayNightViewProgress = 0f;
|
||||||
|
changeDayNightViewAnimator = ValueAnimator.ofFloat(0, 1f);
|
||||||
|
changeDayNightViewAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
|
||||||
|
boolean changedNavigationBarColor = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationUpdate(ValueAnimator valueAnimator) {
|
||||||
|
changeDayNightViewProgress = (float) valueAnimator.getAnimatedValue();
|
||||||
|
changeDayNightView.invalidate();
|
||||||
|
if (!changedNavigationBarColor && changeDayNightViewProgress > .5f) {
|
||||||
|
changedNavigationBarColor = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
changeDayNightViewAnimator.addListener(new AnimatorListenerAdapter() {
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(Animator animation) {
|
||||||
|
if (changeDayNightView != null) {
|
||||||
|
if (changeDayNightView.getParent() != null) {
|
||||||
|
((ViewGroup) changeDayNightView.getParent()).removeView(changeDayNightView);
|
||||||
|
}
|
||||||
|
changeDayNightView = null;
|
||||||
|
}
|
||||||
|
changeDayNightViewAnimator = null;
|
||||||
|
super.onAnimationEnd(animation);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
changeDayNightViewAnimator.setDuration(400);
|
||||||
|
changeDayNightViewAnimator.setInterpolator(Easings.easeInOutQuad);
|
||||||
|
changeDayNightViewAnimator.start();
|
||||||
|
|
||||||
|
decorView1.addView(changeDayNightView, new ViewGroup.LayoutParams(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
||||||
|
|
||||||
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
if (resourceProvider instanceof ChannelColorActivity.ThemeDelegate) {
|
||||||
|
((ChannelColorActivity.ThemeDelegate) resourceProvider).toggle();
|
||||||
|
}
|
||||||
|
setForceDark(isDark(), true);
|
||||||
|
updateColors();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setForceDark(boolean isDark, boolean playAnimation) {
|
||||||
|
if (playAnimation) {
|
||||||
|
sunDrawable.setCustomEndFrame(isDark ? sunDrawable.getFramesCount() : 0);
|
||||||
|
if (sunDrawable != null) {
|
||||||
|
sunDrawable.start();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int frame = isDark ? sunDrawable.getFramesCount() - 1 : 0;
|
||||||
|
sunDrawable.setCurrentFrame(frame, false, true);
|
||||||
|
sunDrawable.setCustomEndFrame(frame);
|
||||||
|
if (dayNightItem != null) {
|
||||||
|
dayNightItem.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -73,17 +73,17 @@ public class ChartHorizontalLinesData {
|
||||||
boolean skipFloatValues = step / k < 1;
|
boolean skipFloatValues = step / k < 1;
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
values[i] = newMinHeight + (int) (i * step);
|
values[i] = newMinHeight + (int) (i * step);
|
||||||
valuesStr[i] = AndroidUtilities.formatWholeNumber(values[i], dif);
|
valuesStr[i] = AndroidUtilities.formatWholeNumber(values[i], 0);
|
||||||
if (k > 0) {
|
if (k > 0) {
|
||||||
float v = (values[i] / k);
|
float v = (values[i] / k);
|
||||||
if (skipFloatValues) {
|
if (skipFloatValues) {
|
||||||
if (v - ((int) v) < 0.01f) {
|
if (v - ((int) v) < 0.01f) {
|
||||||
valuesStr2[i] = AndroidUtilities.formatWholeNumber((int) v, (int) (dif / k));
|
valuesStr2[i] = AndroidUtilities.formatWholeNumber((int) v, 0);
|
||||||
} else {
|
} else {
|
||||||
valuesStr2[i] = "";
|
valuesStr2[i] = "";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
valuesStr2[i] = AndroidUtilities.formatWholeNumber((int) v, (int) (dif / k));
|
valuesStr2[i] = AndroidUtilities.formatWholeNumber((int) v, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ import android.graphics.Typeface;
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.graphics.drawable.ColorDrawable;
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.media.AudioManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -199,122 +200,33 @@ import org.telegram.ui.Cells.CheckBoxCell;
|
||||||
import org.telegram.ui.Cells.ContextLinkCell;
|
import org.telegram.ui.Cells.ContextLinkCell;
|
||||||
import org.telegram.ui.Cells.DialogCell;
|
import org.telegram.ui.Cells.DialogCell;
|
||||||
import org.telegram.ui.Cells.MentionCell;
|
import org.telegram.ui.Cells.MentionCell;
|
||||||
|
import org.telegram.ui.Cells.ShareDialogCell;
|
||||||
import org.telegram.ui.Cells.StickerCell;
|
import org.telegram.ui.Cells.StickerCell;
|
||||||
import org.telegram.ui.Cells.TextSelectionHelper;
|
import org.telegram.ui.Cells.TextSelectionHelper;
|
||||||
import org.telegram.ui.Components.AlertsCreator;
|
import org.telegram.ui.Components.*;
|
||||||
import org.telegram.ui.Components.AnimatedEmojiDrawable;
|
|
||||||
import org.telegram.ui.Components.AnimatedEmojiSpan;
|
|
||||||
import org.telegram.ui.Components.AnimatedFileDrawable;
|
|
||||||
import org.telegram.ui.Components.AnimationProperties;
|
|
||||||
import org.telegram.ui.Components.AttachBotIntroTopView;
|
|
||||||
import org.telegram.ui.Components.AudioPlayerAlert;
|
|
||||||
import org.telegram.ui.Components.AutoDeletePopupWrapper;
|
|
||||||
import org.telegram.ui.Components.BackButtonMenu;
|
|
||||||
import org.telegram.ui.Components.BackupImageView;
|
|
||||||
import org.telegram.ui.Components.BlurBehindDrawable;
|
|
||||||
import org.telegram.ui.Components.BluredView;
|
|
||||||
import org.telegram.ui.Components.BlurredFrameLayout;
|
|
||||||
import org.telegram.ui.Components.BotCommandsMenuView;
|
|
||||||
import org.telegram.ui.Components.BotWebViewSheet;
|
|
||||||
import org.telegram.ui.Components.Bulletin;
|
|
||||||
import org.telegram.ui.Components.BulletinFactory;
|
|
||||||
import org.telegram.ui.Components.ChatActivityEnterTopView;
|
|
||||||
import org.telegram.ui.Components.ChatActivityEnterView;
|
|
||||||
import org.telegram.ui.Components.ChatActivityInterface;
|
|
||||||
import org.telegram.ui.Components.ChatAttachAlert;
|
|
||||||
import org.telegram.ui.Components.ChatAttachAlertDocumentLayout;
|
|
||||||
import org.telegram.ui.Components.ChatAvatarContainer;
|
|
||||||
import org.telegram.ui.Components.ChatBigEmptyView;
|
|
||||||
import org.telegram.ui.Components.ChatGreetingsView;
|
|
||||||
import org.telegram.ui.Components.ChatNotificationsPopupWrapper;
|
|
||||||
import org.telegram.ui.Components.ChatScrimPopupContainerLayout;
|
|
||||||
import org.telegram.ui.Components.ChatThemeBottomSheet;
|
|
||||||
import org.telegram.ui.Components.ChecksHintView;
|
|
||||||
import org.telegram.ui.Components.CircularProgressDrawable;
|
|
||||||
import org.telegram.ui.Components.ClippingImageView;
|
|
||||||
import org.telegram.ui.Components.CombinedDrawable;
|
|
||||||
import org.telegram.ui.Components.CounterView;
|
|
||||||
import org.telegram.ui.Components.CrossfadeDrawable;
|
|
||||||
import org.telegram.ui.Components.CubicBezierInterpolator;
|
|
||||||
import org.telegram.ui.Components.EditTextBoldCursor;
|
|
||||||
import org.telegram.ui.Components.EditTextCaption;
|
|
||||||
import org.telegram.ui.Components.EmbedBottomSheet;
|
|
||||||
import org.telegram.ui.Components.EmojiPacksAlert;
|
|
||||||
import org.telegram.ui.Components.EmojiView;
|
|
||||||
import org.telegram.ui.Components.ExtendedGridLayoutManager;
|
|
||||||
import org.telegram.ui.Components.FireworksOverlay;
|
|
||||||
import org.telegram.ui.Components.FloatingDebug.FloatingDebugController;
|
import org.telegram.ui.Components.FloatingDebug.FloatingDebugController;
|
||||||
import org.telegram.ui.Components.FloatingDebug.FloatingDebugProvider;
|
import org.telegram.ui.Components.FloatingDebug.FloatingDebugProvider;
|
||||||
import org.telegram.ui.Components.Forum.ForumUtilities;
|
import org.telegram.ui.Components.Forum.ForumUtilities;
|
||||||
import org.telegram.ui.Components.FragmentContextView;
|
|
||||||
import org.telegram.ui.Components.GigagroupConvertAlert;
|
|
||||||
import org.telegram.ui.Components.HideViewAfterAnimation;
|
|
||||||
import org.telegram.ui.Components.HintView;
|
|
||||||
import org.telegram.ui.Components.ImageUpdater;
|
|
||||||
import org.telegram.ui.Components.ImportingAlert;
|
|
||||||
import org.telegram.ui.Components.InstantCameraView;
|
|
||||||
import org.telegram.ui.Components.InviteMembersBottomSheet;
|
|
||||||
import org.telegram.ui.Components.JoinGroupAlert;
|
|
||||||
import org.telegram.ui.Components.LayoutHelper;
|
|
||||||
import org.telegram.ui.Components.LinkSpanDrawable;
|
|
||||||
import org.telegram.ui.Components.MediaActivity;
|
|
||||||
import org.telegram.ui.Components.MentionsContainerView;
|
|
||||||
import org.telegram.ui.Components.MessageBackgroundDrawable;
|
|
||||||
import org.telegram.ui.Components.MessageContainsEmojiButton;
|
|
||||||
import org.telegram.ui.Components.MessagePreviewView;
|
|
||||||
import org.telegram.ui.Components.MotionBackgroundDrawable;
|
|
||||||
import org.telegram.ui.Components.NumberTextView;
|
|
||||||
import org.telegram.ui.Components.PhonebookShareAlert;
|
|
||||||
import org.telegram.ui.Components.PinnedLineView;
|
|
||||||
import org.telegram.ui.Components.PipRoundVideoView;
|
|
||||||
import org.telegram.ui.Components.PollVotesAlert;
|
|
||||||
import org.telegram.ui.Components.PopupSwipeBackLayout;
|
|
||||||
import org.telegram.ui.Components.Premium.GiftPremiumBottomSheet;
|
import org.telegram.ui.Components.Premium.GiftPremiumBottomSheet;
|
||||||
|
import org.telegram.ui.Components.Premium.LimitReachedBottomSheet;
|
||||||
import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet;
|
import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet;
|
||||||
import org.telegram.ui.Components.Premium.PremiumPreviewBottomSheet;
|
import org.telegram.ui.Components.Premium.PremiumPreviewBottomSheet;
|
||||||
import org.telegram.ui.Components.Premium.boosts.BoostDialogs;
|
import org.telegram.ui.Components.Premium.boosts.BoostDialogs;
|
||||||
import org.telegram.ui.Components.Premium.boosts.GiftInfoBottomSheet;
|
import org.telegram.ui.Components.Premium.boosts.GiftInfoBottomSheet;
|
||||||
import org.telegram.ui.Components.RLottieDrawable;
|
import org.telegram.ui.Components.Premium.boosts.PremiumPreviewGiftLinkBottomSheet;
|
||||||
import org.telegram.ui.Components.RLottieImageView;
|
|
||||||
import org.telegram.ui.Components.RadialProgressView;
|
|
||||||
import org.telegram.ui.Components.ReactedHeaderView;
|
|
||||||
import org.telegram.ui.Components.ReactedUsersListView;
|
|
||||||
import org.telegram.ui.Components.ReactionTabHolderView;
|
|
||||||
import org.telegram.ui.Components.Reactions.ChatSelectionReactionMenuOverlay;
|
import org.telegram.ui.Components.Reactions.ChatSelectionReactionMenuOverlay;
|
||||||
import org.telegram.ui.Components.Reactions.ReactionsEffectOverlay;
|
import org.telegram.ui.Components.Reactions.ReactionsEffectOverlay;
|
||||||
import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble;
|
import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble;
|
||||||
import org.telegram.ui.Components.ReactionsContainerLayout;
|
|
||||||
import org.telegram.ui.Components.RecyclerAnimationScrollHelper;
|
|
||||||
import org.telegram.ui.Components.RecyclerListView;
|
|
||||||
import org.telegram.ui.Components.ReportAlert;
|
|
||||||
import org.telegram.ui.Components.SearchCounterView;
|
|
||||||
import org.telegram.ui.Components.ShareAlert;
|
|
||||||
import org.telegram.ui.Components.SharedMediaLayout;
|
|
||||||
import org.telegram.ui.Components.SizeNotifierFrameLayout;
|
|
||||||
import org.telegram.ui.Components.StickersAlert;
|
|
||||||
import org.telegram.ui.Components.SuggestEmojiView;
|
|
||||||
import org.telegram.ui.Components.TextSelectionHint;
|
|
||||||
import org.telegram.ui.Components.TextStyleSpan;
|
|
||||||
import org.telegram.ui.Components.ThemeEditorView;
|
|
||||||
import org.telegram.ui.Components.TranscribeButton;
|
|
||||||
import org.telegram.ui.Components.TranslateAlert2;
|
|
||||||
import org.telegram.ui.Components.TranslateButton;
|
|
||||||
import org.telegram.ui.Components.TrendingStickersAlert;
|
|
||||||
import org.telegram.ui.Components.TypefaceSpan;
|
|
||||||
import org.telegram.ui.Components.URLSpanBotCommand;
|
|
||||||
import org.telegram.ui.Components.URLSpanMono;
|
|
||||||
import org.telegram.ui.Components.URLSpanNoUnderline;
|
|
||||||
import org.telegram.ui.Components.URLSpanReplacement;
|
|
||||||
import org.telegram.ui.Components.URLSpanUserMention;
|
|
||||||
import org.telegram.ui.Components.UndoView;
|
|
||||||
import org.telegram.ui.Components.UnreadCounterTextView;
|
|
||||||
import org.telegram.ui.Components.ViewHelper;
|
|
||||||
import org.telegram.ui.Components.spoilers.SpoilerEffect;
|
import org.telegram.ui.Components.spoilers.SpoilerEffect;
|
||||||
import org.telegram.ui.Components.voip.CellFlickerDrawable;
|
import org.telegram.ui.Components.voip.CellFlickerDrawable;
|
||||||
import org.telegram.ui.Components.voip.VoIPHelper;
|
import org.telegram.ui.Components.voip.VoIPHelper;
|
||||||
import org.telegram.ui.Delegates.ChatActivityMemberRequestsDelegate;
|
import org.telegram.ui.Delegates.ChatActivityMemberRequestsDelegate;
|
||||||
|
import org.telegram.ui.Stories.DialogStoriesCell;
|
||||||
import org.telegram.ui.Stories.StoriesListPlaceProvider;
|
import org.telegram.ui.Stories.StoriesListPlaceProvider;
|
||||||
import org.telegram.ui.Stories.StoriesUtilities;
|
import org.telegram.ui.Stories.StoriesUtilities;
|
||||||
|
import org.telegram.ui.Stories.recorder.PreviewView;
|
||||||
|
import org.telegram.ui.Stories.recorder.StoryEntry;
|
||||||
|
import org.telegram.ui.Stories.recorder.StoryRecorder;
|
||||||
|
|
||||||
import java.io.BufferedWriter;
|
import java.io.BufferedWriter;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -393,6 +305,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
private ActionBarMenuItem.Item closeTopicItem;
|
private ActionBarMenuItem.Item closeTopicItem;
|
||||||
private ActionBarMenuItem.Item openForumItem;
|
private ActionBarMenuItem.Item openForumItem;
|
||||||
private ClippingImageView animatingImageView;
|
private ClippingImageView animatingImageView;
|
||||||
|
private ThanosEffect chatListThanosEffect;
|
||||||
private RecyclerListView chatListView;
|
private RecyclerListView chatListView;
|
||||||
private ChatListItemAnimator chatListItemAnimator;
|
private ChatListItemAnimator chatListItemAnimator;
|
||||||
private GridLayoutManagerFixed chatLayoutManager;
|
private GridLayoutManagerFixed chatLayoutManager;
|
||||||
|
@ -920,8 +833,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
|
|
||||||
private boolean openImport;
|
private boolean openImport;
|
||||||
|
|
||||||
private float chatListViewPaddingTop;
|
public float chatListViewPaddingTop;
|
||||||
private int chatListViewPaddingVisibleOffset;
|
public int chatListViewPaddingVisibleOffset;
|
||||||
|
|
||||||
private int contentPaddingTop;
|
private int contentPaddingTop;
|
||||||
private float contentPanTranslation;
|
private float contentPanTranslation;
|
||||||
|
@ -965,6 +878,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
};
|
};
|
||||||
|
|
||||||
private ChatSelectionReactionMenuOverlay selectionReactionsOverlay;
|
private ChatSelectionReactionMenuOverlay selectionReactionsOverlay;
|
||||||
|
private SecretVoicePlayer secretVoicePlayer;
|
||||||
|
|
||||||
private boolean isPauseOnThemePreview;
|
private boolean isPauseOnThemePreview;
|
||||||
private ChatThemeBottomSheet chatThemeBottomSheet;
|
private ChatThemeBottomSheet chatThemeBottomSheet;
|
||||||
|
@ -1209,7 +1123,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1696,7 +1609,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
chatActivityEnterView.getEmojiView().onMessageSend();
|
chatActivityEnterView.getEmojiView().onMessageSend();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!getMessagesController().premiumLocked && getMessagesController().transcribeAudioTrialWeeklyNumber <= 0 && !getMessagesController().didPressTranscribeButtonEnough() && !getUserConfig().isPremium() && !TextUtils.isEmpty(message) && messages != null) {
|
if (!getMessagesController().premiumFeaturesBlocked() && getMessagesController().transcribeAudioTrialWeeklyNumber <= 0 && !getMessagesController().didPressTranscribeButtonEnough() && !getUserConfig().isPremium() && !TextUtils.isEmpty(message) && messages != null) {
|
||||||
for (int i = 1; i < Math.min(5, messages.size()); ++i) {
|
for (int i = 1; i < Math.min(5, messages.size()); ++i) {
|
||||||
MessageObject msg = messages.get(i);
|
MessageObject msg = messages.get(i);
|
||||||
if (msg != null && !msg.isOutOwner() && (msg.isVoice() || msg.isRoundVideo()) && msg.isContentUnread()) {
|
if (msg != null && !msg.isOutOwner() && (msg.isVoice() || msg.isRoundVideo()) && msg.isContentUnread()) {
|
||||||
|
@ -1992,7 +1905,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void needStartRecordVideo(int state, boolean notify, int scheduleDate) {
|
public void needStartRecordVideo(int state, boolean notify, int scheduleDate, int ttl) {
|
||||||
checkInstantCameraView();
|
checkInstantCameraView();
|
||||||
if (instantCameraView != null) {
|
if (instantCameraView != null) {
|
||||||
if (state == 0) {
|
if (state == 0) {
|
||||||
|
@ -2000,7 +1913,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
chatListView.stopScroll();
|
chatListView.stopScroll();
|
||||||
chatAdapter.updateRowsSafe();
|
chatAdapter.updateRowsSafe();
|
||||||
} else if (state == 1 || state == 3 || state == 4) {
|
} else if (state == 1 || state == 3 || state == 4) {
|
||||||
instantCameraView.send(state, notify, scheduleDate);
|
instantCameraView.send(state, notify, scheduleDate, ttl);
|
||||||
} else if (state == 2 || state == 5) {
|
} else if (state == 2 || state == 5) {
|
||||||
instantCameraView.cancel(state == 2);
|
instantCameraView.cancel(state == 2);
|
||||||
}
|
}
|
||||||
|
@ -2134,6 +2047,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
checkAdjustResize();
|
checkAdjustResize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onceVoiceAvailable() {
|
||||||
|
return currentUser != null && !UserObject.isUserSelf(currentUser) && !currentUser.bot && currentEncryptedChat == null && chatMode == 0;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ReplyQuote getReplyQuote() {
|
public ReplyQuote getReplyQuote() {
|
||||||
return replyingQuote;
|
return replyingQuote;
|
||||||
|
@ -2561,7 +2479,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
|
|
||||||
themeDelegate = new ThemeDelegate();
|
themeDelegate = new ThemeDelegate();
|
||||||
if (themeDelegate.isThemeChangeAvailable()) {
|
if (themeDelegate.isThemeChangeAvailable(false)) {
|
||||||
NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.needSetDayNightTheme);
|
NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.needSetDayNightTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3566,7 +3484,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
if (currentChat != null && !isTopic) {
|
if (currentChat != null && !isTopic) {
|
||||||
viewAsTopics = headerItem.lazilyAddSubItem(view_as_topics, R.drawable.msg_topics, LocaleController.getString("TopicViewAsTopics", R.string.TopicViewAsTopics));
|
viewAsTopics = headerItem.lazilyAddSubItem(view_as_topics, R.drawable.msg_topics, LocaleController.getString("TopicViewAsTopics", R.string.TopicViewAsTopics));
|
||||||
}
|
}
|
||||||
if (themeDelegate.isThemeChangeAvailable()) {
|
if (themeDelegate.isThemeChangeAvailable(true)) {
|
||||||
headerItem.lazilyAddSubItem(change_colors, R.drawable.msg_colors, LocaleController.getString("SetWallpapers", R.string.SetWallpapers));
|
headerItem.lazilyAddSubItem(change_colors, R.drawable.msg_colors, LocaleController.getString("SetWallpapers", R.string.SetWallpapers));
|
||||||
}
|
}
|
||||||
if (!isTopic) {
|
if (!isTopic) {
|
||||||
|
@ -3767,6 +3685,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean allowSelectChildAtPosition(View child) {
|
||||||
|
if (child != null && child.getVisibility() == View.INVISIBLE) return false;
|
||||||
|
return super.allowSelectChildAtPosition(child);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onMeasure(int widthSpec, int heightSpec) {
|
protected void onMeasure(int widthSpec, int heightSpec) {
|
||||||
saveScrollPosition();
|
saveScrollPosition();
|
||||||
|
@ -4625,6 +4549,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
|
|
||||||
for (int a = 0; a < count; a++) {
|
for (int a = 0; a < count; a++) {
|
||||||
View child = getChildAt(a);
|
View child = getChildAt(a);
|
||||||
|
if (child.getVisibility() == View.INVISIBLE || child.getVisibility() == View.GONE) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (chatAdapter.isBot && child instanceof BotHelpCell) {
|
if (chatAdapter.isBot && child instanceof BotHelpCell) {
|
||||||
BotHelpCell botCell = (BotHelpCell) child;
|
BotHelpCell botCell = (BotHelpCell) child;
|
||||||
float top = (getMeasuredHeight() - chatListViewPaddingTop - blurredViewBottomOffset) / 2 - child.getMeasuredHeight() / 2 + chatListViewPaddingTop;
|
float top = (getMeasuredHeight() - chatListViewPaddingTop - blurredViewBottomOffset) / 2 - child.getMeasuredHeight() / 2 + chatListViewPaddingTop;
|
||||||
|
@ -4756,7 +4683,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
View child = chatListView.getChildAt(i);
|
View child = chatListView.getChildAt(i);
|
||||||
if (child instanceof ChatMessageCell) {
|
if (child instanceof ChatMessageCell) {
|
||||||
ChatMessageCell cell = (ChatMessageCell) child;
|
ChatMessageCell cell = (ChatMessageCell) child;
|
||||||
if (child.getY() > chatListView.getHeight() || child.getY() + child.getHeight() < 0) {
|
if (child.getY() > chatListView.getHeight() || child.getY() + child.getHeight() < 0 || cell.getVisibility() == View.GONE) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
MessageObject.GroupedMessages group = cell.getCurrentMessagesGroup();
|
MessageObject.GroupedMessages group = cell.getCurrentMessagesGroup();
|
||||||
|
@ -4889,7 +4816,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
ChatActionCell actionCell = null;
|
ChatActionCell actionCell = null;
|
||||||
float cilpTop = chatListViewPaddingTop - chatListViewPaddingVisibleOffset - AndroidUtilities.dp(4);
|
float cilpTop = chatListViewPaddingTop - chatListViewPaddingVisibleOffset - AndroidUtilities.dp(4);
|
||||||
|
|
||||||
if (child.getY() > getMeasuredHeight() || child.getY() + child.getMeasuredHeight() < cilpTop) {
|
if (child.getY() > getMeasuredHeight() || child.getY() + child.getMeasuredHeight() < cilpTop || child.getVisibility() == View.INVISIBLE || child.getVisibility() == View.GONE) {
|
||||||
skipDraw = true;
|
skipDraw = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5031,7 +4958,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
ImageReceiver imageReceiver = cell.getAvatarImage();
|
ImageReceiver imageReceiver = cell.getAvatarImage();
|
||||||
if (imageReceiver != null) {
|
if (imageReceiver != null) {
|
||||||
MessageObject.GroupedMessages groupedMessages = getValidGroupedMessage(message);
|
MessageObject.GroupedMessages groupedMessages = getValidGroupedMessage(message);
|
||||||
if (cell.getMessageObject().deleted) {
|
if (cell.getMessageObject().deleted && !cell.getMessageObject().deletedByThanos) {
|
||||||
if (child.getTranslationY() != 0) {
|
if (child.getTranslationY() != 0) {
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
}
|
}
|
||||||
|
@ -5361,6 +5288,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
chatListItemAnimator.setOnSnapMessage(this::supportsThanosEffect, this::getChatThanosEffect);
|
||||||
}
|
}
|
||||||
|
|
||||||
chatLayoutManager = new GridLayoutManagerFixed(context, 1000, LinearLayoutManager.VERTICAL, true) {
|
chatLayoutManager = new GridLayoutManagerFixed(context, 1000, LinearLayoutManager.VERTICAL, true) {
|
||||||
|
@ -5662,6 +5590,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
@Override
|
@Override
|
||||||
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
|
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
|
||||||
chatListView.invalidate();
|
chatListView.invalidate();
|
||||||
|
if (chatListThanosEffect != null) {
|
||||||
|
chatListThanosEffect.scroll(dx, dy);
|
||||||
|
}
|
||||||
scrollUp = dy < 0;
|
scrollUp = dy < 0;
|
||||||
int firstVisibleItem = chatLayoutManager.findFirstVisibleItemPosition();
|
int firstVisibleItem = chatLayoutManager.findFirstVisibleItemPosition();
|
||||||
if (dy != 0 && (scrollByTouch && recyclerView.getScrollState() == RecyclerView.SCROLL_STATE_SETTLING) || recyclerView.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING) {
|
if (dy != 0 && (scrollByTouch && recyclerView.getScrollState() == RecyclerView.SCROLL_STATE_SETTLING) || recyclerView.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING) {
|
||||||
|
@ -11211,6 +11142,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
textToCheck = charSequence;
|
textToCheck = charSequence;
|
||||||
}
|
}
|
||||||
|
final String firstUrl = urls == null || urls.isEmpty() ? null : urls.get(0).toString();
|
||||||
|
|
||||||
if (currentEncryptedChat != null && messagesController.secretWebpagePreview == 2) {
|
if (currentEncryptedChat != null && messagesController.secretWebpagePreview == 2) {
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
@ -11983,7 +11915,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
messageObjectToReply = messageObjectsToForward.get(0);
|
messageObjectToReply = messageObjectsToForward.get(0);
|
||||||
}
|
}
|
||||||
} else if (type == MessageObject.TYPE_GIVEAWAY) {
|
} else if (type == MessageObject.TYPE_GIVEAWAY) {
|
||||||
text = LocaleController.getString("BoostingGiveaway", R.string.BoostingGiveaway);;
|
text = LocaleController.getString("BoostingGiveaway", R.string.BoostingGiveaway);
|
||||||
|
} else if (type == MessageObject.TYPE_GIVEAWAY_RESULTS) {
|
||||||
|
text = LocaleController.getString("BoostingGiveawayResults", R.string.BoostingGiveawayResults);
|
||||||
} else if (type == MessageObject.TYPE_GEO) {
|
} else if (type == MessageObject.TYPE_GEO) {
|
||||||
text = LocaleController.formatPluralString("PreviewForwardLocation", messageObjectsToForward.size());
|
text = LocaleController.formatPluralString("PreviewForwardLocation", messageObjectsToForward.size());
|
||||||
} else if (type == MessageObject.TYPE_VIDEO) {
|
} else if (type == MessageObject.TYPE_VIDEO) {
|
||||||
|
@ -13546,6 +13480,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
|
|
||||||
public class ChatActivityFragmentView extends SizeNotifierFrameLayout {
|
public class ChatActivityFragmentView extends SizeNotifierFrameLayout {
|
||||||
|
|
||||||
|
public ChatActivity getChatActivity() {
|
||||||
|
return ChatActivity.this;
|
||||||
|
}
|
||||||
|
|
||||||
public ChatActivityFragmentView(Context context, INavigationLayout parentLayout) {
|
public ChatActivityFragmentView(Context context, INavigationLayout parentLayout) {
|
||||||
super(context, parentLayout);
|
super(context, parentLayout);
|
||||||
adjustPanLayoutHelper = new AdjustPanLayoutHelper(this) {
|
adjustPanLayoutHelper = new AdjustPanLayoutHelper(this) {
|
||||||
|
@ -14491,7 +14429,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
int contentWidthSpec = View.MeasureSpec.makeMeasureSpec(widthSize, View.MeasureSpec.EXACTLY);
|
int contentWidthSpec = View.MeasureSpec.makeMeasureSpec(widthSize, View.MeasureSpec.EXACTLY);
|
||||||
int contentHeightSpec = View.MeasureSpec.makeMeasureSpec(h, View.MeasureSpec.EXACTLY);
|
int contentHeightSpec = View.MeasureSpec.makeMeasureSpec(h, View.MeasureSpec.EXACTLY);
|
||||||
child.measure(contentWidthSpec, contentHeightSpec);
|
child.measure(contentWidthSpec, contentHeightSpec);
|
||||||
} else if (child == chatListView) {
|
} else if (child == chatListView || child == chatListThanosEffect) {
|
||||||
int contentWidthSpec = View.MeasureSpec.makeMeasureSpec(widthSize, View.MeasureSpec.EXACTLY);
|
int contentWidthSpec = View.MeasureSpec.makeMeasureSpec(widthSize, View.MeasureSpec.EXACTLY);
|
||||||
int h = heightSize - listViewTopHeight - (inPreviewMode && Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0) + blurredViewTopOffset + blurredViewBottomOffset;
|
int h = heightSize - listViewTopHeight - (inPreviewMode && Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0) + blurredViewTopOffset + blurredViewBottomOffset;
|
||||||
if (keyboardSize > AndroidUtilities.dp(20) && getLayoutParams().height < 0) {
|
if (keyboardSize > AndroidUtilities.dp(20) && getLayoutParams().height < 0) {
|
||||||
|
@ -14710,7 +14648,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
} else if (child == gifHintTextView || child == voiceHintTextView || child == mediaBanTooltip || child == emojiHintTextView) {
|
} else if (child == gifHintTextView || child == voiceHintTextView || child == mediaBanTooltip || child == emojiHintTextView) {
|
||||||
childTop -= inputFieldHeight;
|
childTop -= inputFieldHeight;
|
||||||
} else if (child == chatListView || child == floatingDateView || child == infoTopView) {
|
} else if (child == chatListView || child == chatListThanosEffect || child == floatingDateView || child == infoTopView) {
|
||||||
childTop -= blurredViewTopOffset;
|
childTop -= blurredViewTopOffset;
|
||||||
if (!inPreviewMode) {
|
if (!inPreviewMode) {
|
||||||
childTop -= (inputFieldHeight - AndroidUtilities.dp(51));
|
childTop -= (inputFieldHeight - AndroidUtilities.dp(51));
|
||||||
|
@ -15569,7 +15507,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
} else if (chatMode == MODE_PINNED) {
|
} else if (chatMode == MODE_PINNED) {
|
||||||
avatarContainer.setTitle(LocaleController.formatPluralString("PinnedMessagesCount", getPinnedMessagesCount()));
|
avatarContainer.setTitle(LocaleController.formatPluralString("PinnedMessagesCount", getPinnedMessagesCount()));
|
||||||
} else if (currentChat != null) {
|
} else if (currentChat != null) {
|
||||||
avatarContainer.setTitle(currentChat.title, currentChat.scam, currentChat.fake, currentChat.verified, false, null, animated);
|
avatarContainer.setTitle(currentChat.title, currentChat.scam, currentChat.fake, currentChat.verified, false, currentChat.emoji_status, animated);
|
||||||
} else if (currentUser != null) {
|
} else if (currentUser != null) {
|
||||||
if (currentUser.self) {
|
if (currentUser.self) {
|
||||||
avatarContainer.setTitle(LocaleController.getString("SavedMessages", R.string.SavedMessages));
|
avatarContainer.setTitle(LocaleController.getString("SavedMessages", R.string.SavedMessages));
|
||||||
|
@ -18825,7 +18763,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
if (chatActivityEnterView != null) {
|
if (chatActivityEnterView != null) {
|
||||||
chatActivityEnterView.setBotsCount(botsCount, hasBotsCommands, true);
|
chatActivityEnterView.setBotsCount(botsCount, hasBotsCommands, true);
|
||||||
hasBotWebView = getMessagesController().getUser(info.user_id).bot_menu_webview;
|
TLRPC.User bot = getMessagesController().getUser(info.user_id);
|
||||||
|
hasBotWebView = bot != null && bot.bot_menu_webview;
|
||||||
chatActivityEnterView.updateBotWebView(true);
|
chatActivityEnterView.updateBotWebView(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20802,6 +20741,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
|
|
||||||
private void processDeletedMessages(ArrayList<Integer> markAsDeletedMessages, long channelId) {
|
private void processDeletedMessages(ArrayList<Integer> markAsDeletedMessages, long channelId) {
|
||||||
ArrayList<Integer> removedIndexes = new ArrayList<>();
|
ArrayList<Integer> removedIndexes = new ArrayList<>();
|
||||||
|
ArrayList<Integer> messagesIndexes = new ArrayList<>();
|
||||||
int loadIndex = 0;
|
int loadIndex = 0;
|
||||||
if (ChatObject.isChannel(currentChat)) {
|
if (ChatObject.isChannel(currentChat)) {
|
||||||
if (channelId == 0 && mergeDialogId != 0) {
|
if (channelId == 0 && mergeDialogId != 0) {
|
||||||
|
@ -20902,6 +20842,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
MessageObject removed = messages.remove(index);
|
MessageObject removed = messages.remove(index);
|
||||||
if (chatAdapter != null) {
|
if (chatAdapter != null) {
|
||||||
removedIndexes.add(chatAdapter.messagesStartRow + index);
|
removedIndexes.add(chatAdapter.messagesStartRow + index);
|
||||||
|
if (removed != null && removed.messageOwner != null && removed.messageOwner.send_state == MessageObject.MESSAGE_SEND_STATE_SENT) {
|
||||||
|
messagesIndexes.add(chatAdapter.messagesStartRow + index);
|
||||||
|
removed.deletedByThanos = LiteMode.isEnabled(LiteMode.FLAG_CHAT_THANOS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (removed.getGroupId() != 0) {
|
if (removed.getGroupId() != 0) {
|
||||||
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(removed.getGroupId());
|
MessageObject.GroupedMessages groupedMessages = groupedMessagesMap.get(removed.getGroupId());
|
||||||
|
@ -21017,7 +20961,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
int prevLoadingUpRow = chatAdapter.loadingUpRow;
|
int prevLoadingUpRow = chatAdapter.loadingUpRow;
|
||||||
int prevLoadingDownRow = chatAdapter.loadingDownRow;
|
int prevLoadingDownRow = chatAdapter.loadingDownRow;
|
||||||
for (int a = 0, N = removedIndexes.size(); a < N; a++) {
|
for (int a = 0, N = removedIndexes.size(); a < N; a++) {
|
||||||
chatAdapter.notifyItemRemoved(removedIndexes.get(a));
|
final int pos = removedIndexes.get(a);
|
||||||
|
chatAdapter.notifyItemRemoved(pos, messagesIndexes.contains(pos));
|
||||||
}
|
}
|
||||||
if (!isThreadChat() || messages.size() <= 3) {
|
if (!isThreadChat() || messages.size() <= 3) {
|
||||||
removeUnreadPlane(false);
|
removeUnreadPlane(false);
|
||||||
|
@ -21383,7 +21328,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBecomeFullyHidden() {
|
public void onBecomeFullyHidden() {
|
||||||
if (!getMessagesController().premiumLocked && getMessagesController().transcribeAudioTrialWeeklyNumber <= 0 && !getMessagesController().didPressTranscribeButtonEnough() && !getUserConfig().isPremium() && messages != null) {
|
if (!getMessagesController().premiumFeaturesBlocked() && getMessagesController().transcribeAudioTrialWeeklyNumber <= 0 && !getMessagesController().didPressTranscribeButtonEnough() && !getUserConfig().isPremium() && messages != null) {
|
||||||
for (int i = 0; i < messages.size(); ++i) {
|
for (int i = 0; i < messages.size(); ++i) {
|
||||||
MessageObject msg = messages.get(i);
|
MessageObject msg = messages.get(i);
|
||||||
if (msg != null && !msg.isOutOwner() && (msg.isVoice() || msg.isRoundVideo()) && !msg.isUnread() && (msg.isContentUnread() || ChatObject.isChannelAndNotMegaGroup(currentChat))) {
|
if (msg != null && !msg.isOutOwner() && (msg.isVoice() || msg.isRoundVideo()) && !msg.isUnread() && (msg.isContentUnread() || ChatObject.isChannelAndNotMegaGroup(currentChat))) {
|
||||||
|
@ -23174,7 +23119,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
boolean showTranslate = (
|
boolean showTranslate = (
|
||||||
getUserConfig().isPremium() ?
|
getUserConfig().isPremium() ?
|
||||||
getMessagesController().getTranslateController().isDialogTranslatable(getDialogId()) && !getMessagesController().getTranslateController().isTranslateDialogHidden(getDialogId()) :
|
getMessagesController().getTranslateController().isDialogTranslatable(getDialogId()) && !getMessagesController().getTranslateController().isTranslateDialogHidden(getDialogId()) :
|
||||||
!getMessagesController().premiumLocked && preferences.getInt("dialog_show_translate_count" + did, 5) <= 0
|
!getMessagesController().premiumFeaturesBlocked() && preferences.getInt("dialog_show_translate_count" + did, 5) <= 0
|
||||||
);
|
);
|
||||||
if (showRestartTopic) {
|
if (showRestartTopic) {
|
||||||
shownRestartTopic = true;
|
shownRestartTopic = true;
|
||||||
|
@ -24459,13 +24404,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
final int type = getMessageType(message);
|
final int type = getMessageType(message);
|
||||||
if (single) {
|
if (single) {
|
||||||
boolean isGiveawayResultsMessage = false;
|
boolean isGiveawayResultsMessage = false;
|
||||||
if (message.messageOwner.action instanceof TLRPC.TL_messageActionCustomAction) {
|
if (message.messageOwner.action instanceof TLRPC.TL_messageActionGiveawayResults) {
|
||||||
TLRPC.TL_messageActionCustomAction customAction = (TLRPC.TL_messageActionCustomAction) message.messageOwner.action;
|
|
||||||
if (customAction.message != null && customAction.message.contains("giveaway")) {
|
|
||||||
//fallback for old versions
|
|
||||||
isGiveawayResultsMessage = true;
|
|
||||||
}
|
|
||||||
} else if (message.messageOwner.action instanceof TLRPC.TL_messageActionGiveawayResults) {
|
|
||||||
isGiveawayResultsMessage = true;
|
isGiveawayResultsMessage = true;
|
||||||
}
|
}
|
||||||
if (message.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage || isGiveawayResultsMessage) {
|
if (message.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage || isGiveawayResultsMessage) {
|
||||||
|
@ -24520,7 +24459,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (message.messageOwner.action instanceof TLRPC.TL_messageActionSetChatTheme) {
|
} else if (message.messageOwner.action instanceof TLRPC.TL_messageActionSetChatTheme) {
|
||||||
|
if (currentChat == null || ChatObject.canChangeChatInfo(currentChat)) {
|
||||||
showChatThemeBottomSheet();
|
showChatThemeBottomSheet();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24606,7 +24547,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
icons.add(R.drawable.msg_user_search);
|
icons.add(R.drawable.msg_user_search);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!getUserConfig().isPremium() && !getMessagesController().premiumLocked && message.getDocument() != null && message.getDocument().size >= 150 * 1024 * 1024 && FileLoader.getInstance(currentAccount).isLoadingFile(FileLoader.getAttachFileName(message.getDocument()))) {
|
if (!getUserConfig().isPremium() && !getMessagesController().premiumFeaturesBlocked() && message.getDocument() != null && message.getDocument().size >= 150 * 1024 * 1024 && FileLoader.getInstance(currentAccount).isLoadingFile(FileLoader.getAttachFileName(message.getDocument()))) {
|
||||||
items.add(LocaleController.getString(R.string.PremiumSpeedPromo));
|
items.add(LocaleController.getString(R.string.PremiumSpeedPromo));
|
||||||
options.add(OPTION_SPEED_PROMO);
|
options.add(OPTION_SPEED_PROMO);
|
||||||
icons.add(R.drawable.msg_speed);
|
icons.add(R.drawable.msg_speed);
|
||||||
|
@ -24680,7 +24621,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
messageTextToTranslate = null;
|
messageTextToTranslate = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.isSponsored() && !getMessagesController().premiumLocked) {
|
if (message.isSponsored() && !getUserConfig().isPremium() && !getMessagesController().premiumFeaturesBlocked()) {
|
||||||
items.add(LocaleController.getString("HideAd", R.string.HideAd));
|
items.add(LocaleController.getString("HideAd", R.string.HideAd));
|
||||||
options.add(OPTION_HIDE_SPONSORED_MESSAGE);
|
options.add(OPTION_HIDE_SPONSORED_MESSAGE);
|
||||||
icons.add(R.drawable.msg_block2);
|
icons.add(R.drawable.msg_block2);
|
||||||
|
@ -26056,7 +25997,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stickerSets.size() > 0 && !getMessagesController().premiumLocked) {
|
if (stickerSets.size() > 0 && !getMessagesController().premiumFeaturesBlocked()) {
|
||||||
View gap = new FrameLayout(contentView.getContext());
|
View gap = new FrameLayout(contentView.getContext());
|
||||||
gap.setBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSubmenuSeparator));
|
gap.setBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSubmenuSeparator));
|
||||||
popupLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8));
|
popupLayout.addView(gap, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8));
|
||||||
|
@ -27617,7 +27558,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onBackPressed() {
|
public boolean onBackPressed() {
|
||||||
if (closeStoryViewer()) {
|
if (secretVoicePlayer != null && secretVoicePlayer.isShown()) {
|
||||||
|
secretVoicePlayer.dismiss();
|
||||||
|
return false;
|
||||||
|
} else if (closeStoryViewer()) {
|
||||||
return false;
|
return false;
|
||||||
} else if (selectionReactionsOverlay != null && !selectionReactionsOverlay.onBackPressed()) {
|
} else if (selectionReactionsOverlay != null && !selectionReactionsOverlay.onBackPressed()) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -27856,7 +27800,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
if (messageObject.getDialogId() == mergeDialogId && startMessageObject.getDialogId() != mergeDialogId) {
|
if (messageObject.getDialogId() == mergeDialogId && startMessageObject.getDialogId() != mergeDialogId) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((currentEncryptedChat == null && messageObject.getId() > messageId || currentEncryptedChat != null && messageObject.getId() < messageId) && (messageObject.isVoice() || messageObject.isRoundVideo()) && (!playingUnreadMedia || messageObject.isContentUnread() && !messageObject.isOut())) {
|
if ((currentEncryptedChat == null && messageObject.getId() > messageId || currentEncryptedChat != null && messageObject.getId() < messageId) && (messageObject.isVoice() || messageObject.isRoundVideo()) && !messageObject.isVoiceOnce() && !messageObject.isRoundOnce() && (!playingUnreadMedia || messageObject.isContentUnread() && !messageObject.isOut())) {
|
||||||
messageObjects.add(messageObject);
|
messageObjects.add(messageObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29238,14 +29182,24 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
((ChatActionCell) view).setInvalidateColors(true);
|
((ChatActionCell) view).setInvalidateColors(true);
|
||||||
((ChatActionCell) view).setDelegate(new ChatActionCell.ChatActionCellDelegate() {
|
((ChatActionCell) view).setDelegate(new ChatActionCell.ChatActionCellDelegate() {
|
||||||
@Override
|
@Override
|
||||||
public void didOpenPremiumGift(ChatActionCell cell, TLRPC.TL_premiumGiftOption giftOption, boolean animateConfetti) {
|
public void didOpenPremiumGift(ChatActionCell cell, TLRPC.TL_premiumGiftOption giftOption, String slug, boolean animateConfetti) {
|
||||||
|
if (slug != null) {
|
||||||
|
initGiftProgressDialog(cell);
|
||||||
|
PremiumPreviewGiftLinkBottomSheet.show(slug, giftOption, getCurrentUser(), progressDialogCurrent);
|
||||||
|
} else {
|
||||||
showDialog(new PremiumPreviewBottomSheet(ChatActivity.this, currentAccount, getCurrentUser(), new GiftPremiumBottomSheet.GiftTier(giftOption), themeDelegate)
|
showDialog(new PremiumPreviewBottomSheet(ChatActivity.this, currentAccount, getCurrentUser(), new GiftPremiumBottomSheet.GiftTier(giftOption), themeDelegate)
|
||||||
.setAnimateConfetti(animateConfetti)
|
.setAnimateConfetti(animateConfetti)
|
||||||
.setOutboundGift(cell.getMessageObject().isOut()));
|
.setOutboundGift(cell.getMessageObject().isOut()));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void didOpenPremiumGiftChannel(ChatActionCell cell, String slug, boolean animateConfetti) {
|
public void didOpenPremiumGiftChannel(ChatActionCell cell, String slug, boolean animateConfetti) {
|
||||||
|
initGiftProgressDialog(cell);
|
||||||
|
GiftInfoBottomSheet.show(getBaseFragment(), slug, progressDialogCurrent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initGiftProgressDialog(ChatActionCell cell) {
|
||||||
if (progressDialogCurrent != null) {
|
if (progressDialogCurrent != null) {
|
||||||
progressDialogCurrent.cancel(true);
|
progressDialogCurrent.cancel(true);
|
||||||
}
|
}
|
||||||
|
@ -29270,7 +29224,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
GiftInfoBottomSheet.show(getBaseFragment(), slug, progressDialogCurrent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -29320,7 +29273,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
if (cell.hasButton()) {
|
if (cell.hasButton()) {
|
||||||
ThemePreviewActivity.showFor(ChatActivity.this, message);
|
ThemePreviewActivity.showFor(ChatActivity.this, message);
|
||||||
} else {
|
} else if (currentChat == null || ChatObject.canChangeChatInfo(currentChat)) {
|
||||||
showChatThemeBottomSheet();
|
showChatThemeBottomSheet();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -30263,6 +30216,26 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void notifyItemRemoved(int position, boolean thanos) {
|
||||||
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
|
FileLog.d("notify item removed " + position + (thanos ? " with thanos effect" : ""));
|
||||||
|
}
|
||||||
|
if (!fragmentBeginToShow) {
|
||||||
|
chatListView.setItemAnimator(null);
|
||||||
|
} else if (chatListView.getItemAnimator() != chatListItemAnimator) {
|
||||||
|
chatListView.setItemAnimator(chatListItemAnimator);
|
||||||
|
}
|
||||||
|
if (thanos && chatListItemAnimator != null && chatListView.getItemAnimator() == chatListItemAnimator) {
|
||||||
|
chatListItemAnimator.prepareThanos(chatListView.findViewHolderForAdapterPosition(position));
|
||||||
|
}
|
||||||
|
updateRowsInternal();
|
||||||
|
try {
|
||||||
|
super.notifyItemRemoved(position);
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyItemRangeRemoved(int positionStart, int itemCount) {
|
public void notifyItemRangeRemoved(int positionStart, int itemCount) {
|
||||||
if (BuildVars.LOGS_ENABLED) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
|
@ -30555,7 +30528,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
arrayList = new ArrayList<>();
|
arrayList = new ArrayList<>();
|
||||||
arrayList.add(messageObject);
|
arrayList.add(messageObject);
|
||||||
}
|
}
|
||||||
showDialog(new ShareAlert(getContext(), ChatActivity.this, arrayList, null, null, ChatObject.isChannel(currentChat), null, null, false, false, false, themeDelegate) {
|
final boolean includeStory = getMessagesController().storiesEnabled() && StoryEntry.canRepostMessage(messageObject);
|
||||||
|
showDialog(new ShareAlert(getContext(), ChatActivity.this, arrayList, null, null, ChatObject.isChannel(currentChat), null, null, false, false, includeStory, themeDelegate) {
|
||||||
|
{ includeStoryFromMessage = includeStory; }
|
||||||
@Override
|
@Override
|
||||||
public void dismissInternal() {
|
public void dismissInternal() {
|
||||||
super.dismissInternal();
|
super.dismissInternal();
|
||||||
|
@ -30565,6 +30540,50 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onShareStory(View cell) {
|
||||||
|
StoryRecorder.SourceView sourceView = null;
|
||||||
|
if (cell instanceof ShareDialogCell) {
|
||||||
|
sourceView = StoryRecorder.SourceView.fromShareCell((ShareDialogCell) cell);
|
||||||
|
}
|
||||||
|
final ArrayList<MessageObject> messageObjects = new ArrayList<>();
|
||||||
|
MessageObject.GroupedMessages groupedMessages = messageObject.getGroupId() != 0 ? groupedMessagesMap.get(messageObject.getGroupId()) : null;
|
||||||
|
if (groupedMessages != null) {
|
||||||
|
messageObjects.addAll(groupedMessages.messages);
|
||||||
|
} else {
|
||||||
|
messageObjects.add(messageObject);
|
||||||
|
}
|
||||||
|
StoryRecorder editor = StoryRecorder.getInstance(getParentActivity(), currentAccount);
|
||||||
|
editor.setOnPrepareCloseListener((t, close, sent, did) -> {
|
||||||
|
if (sent) {
|
||||||
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
String chatTitle = "";
|
||||||
|
if (did < 0) {
|
||||||
|
TLRPC.Chat chat = getMessagesController().getChat(-did);
|
||||||
|
if (chat != null) {
|
||||||
|
chatTitle = chat.title;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BulletinFactory.of(ChatActivity.this).createSimpleBulletin(R.raw.contact_check, AndroidUtilities.replaceTags(
|
||||||
|
TextUtils.isEmpty(chatTitle) ?
|
||||||
|
LocaleController.getString(R.string.RepostedToProfile) :
|
||||||
|
LocaleController.formatString(R.string.RepostedToChannelProfile, chatTitle)
|
||||||
|
)).show();
|
||||||
|
});
|
||||||
|
dismiss();
|
||||||
|
editor.replaceSourceView(null);
|
||||||
|
} else {
|
||||||
|
StoryRecorder.SourceView sourceView2 = null;
|
||||||
|
if (cell instanceof ShareDialogCell && cell.isAttachedToWindow()) {
|
||||||
|
sourceView2 = StoryRecorder.SourceView.fromShareCell((ShareDialogCell) cell);
|
||||||
|
}
|
||||||
|
editor.replaceSourceView(sourceView2);
|
||||||
|
}
|
||||||
|
AndroidUtilities.runOnUIThread(close);
|
||||||
|
});
|
||||||
|
editor.openRepost(sourceView, StoryEntry.repostMessage(messageObjects));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onSend(LongSparseArray<TLRPC.Dialog> dids, int count, TLRPC.TL_forumTopic topic) {
|
protected void onSend(LongSparseArray<TLRPC.Dialog> dids, int count, TLRPC.TL_forumTopic topic) {
|
||||||
createUndoView();
|
createUndoView();
|
||||||
|
@ -30584,8 +30603,30 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needPlayMessage(MessageObject messageObject, boolean muted) {
|
public boolean needPlayMessage(ChatMessageCell cell, MessageObject messageObject, boolean muted) {
|
||||||
if (messageObject.isVoice() || messageObject.isRoundVideo()) {
|
if (messageObject.isVoiceOnce()) {
|
||||||
|
if (secretVoicePlayer != null && secretVoicePlayer.isShown()) return false;
|
||||||
|
try {
|
||||||
|
AudioManager audioManager = (AudioManager) ApplicationLoader.applicationContext.getSystemService(Context.AUDIO_SERVICE);
|
||||||
|
int stream = AudioManager.STREAM_MUSIC;
|
||||||
|
int volume = audioManager.getStreamVolume(stream);
|
||||||
|
if (volume == 0) {
|
||||||
|
audioManager.adjustStreamVolume(stream, volume, AudioManager.FLAG_SHOW_UI);
|
||||||
|
if (!messageObject.isOutOwner()) {
|
||||||
|
BulletinFactory.of(ChatActivity.this).createImageBulletin(R.drawable.tooltip_sound, LocaleController.getString(R.string.VoiceOnceTurnOnSound)).show(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ignore) {}
|
||||||
|
secretVoicePlayer = new SecretVoicePlayer(getContext());
|
||||||
|
secretVoicePlayer.setCell(
|
||||||
|
cell,
|
||||||
|
!messageObject.isOutOwner() ? sendSecretMessageRead(messageObject, true) : null,
|
||||||
|
!messageObject.isOutOwner() ? sendSecretMediaDelete(messageObject) : null
|
||||||
|
);
|
||||||
|
showDialog(secretVoicePlayer);
|
||||||
|
return false;
|
||||||
|
} else if (messageObject.isVoice() || messageObject.isRoundVideo()) {
|
||||||
boolean result = MediaController.getInstance().playMessage(messageObject, muted);
|
boolean result = MediaController.getInstance().playMessage(messageObject, muted);
|
||||||
MediaController.getInstance().setVoiceMessagesPlaylist(result ? createVoiceMessagesPlaylist(messageObject, false) : null, false);
|
MediaController.getInstance().setVoiceMessagesPlaylist(result ? createVoiceMessagesPlaylist(messageObject, false) : null, false);
|
||||||
return result;
|
return result;
|
||||||
|
@ -31286,7 +31327,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean didPressAnimatedEmoji(ChatMessageCell cell, AnimatedEmojiSpan span) {
|
public boolean didPressAnimatedEmoji(ChatMessageCell cell, AnimatedEmojiSpan span) {
|
||||||
if (getMessagesController().premiumLocked || span == null || span.standard) {
|
if (getMessagesController().premiumFeaturesBlocked() || span == null || span.standard) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
long documentId = span.getDocumentId();
|
long documentId = span.getDocumentId();
|
||||||
|
@ -31350,6 +31391,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
if (uri == null) {
|
if (uri == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!safe && Browser.isTelegraphUrl(url, false)) {
|
||||||
|
safe = true;
|
||||||
|
}
|
||||||
if (progressDialogCurrent != null) {
|
if (progressDialogCurrent != null) {
|
||||||
progressDialogCurrent.cancel(true);
|
progressDialogCurrent.cancel(true);
|
||||||
}
|
}
|
||||||
|
@ -31842,6 +31886,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void didPressGiveawayChatButton(ChatMessageCell cell, int pressedPos) {
|
public void didPressGiveawayChatButton(ChatMessageCell cell, int pressedPos) {
|
||||||
|
if (cell.getMessageObject().messageOwner.media instanceof TLRPC.TL_messageMediaGiveaway) {
|
||||||
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) cell.getMessageObject().messageOwner.media;
|
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) cell.getMessageObject().messageOwner.media;
|
||||||
long channelId = giveaway.channels.get(pressedPos);
|
long channelId = giveaway.channels.get(pressedPos);
|
||||||
if (dialog_id != -channelId) {
|
if (dialog_id != -channelId) {
|
||||||
|
@ -31852,6 +31897,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
BotWebViewVibrationEffect.APP_ERROR.vibrate();
|
BotWebViewVibrationEffect.APP_ERROR.vibrate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (cell.getMessageObject().messageOwner.media instanceof TLRPC.TL_messageMediaGiveawayResults) {
|
||||||
|
TLRPC.TL_messageMediaGiveawayResults giveaway = (TLRPC.TL_messageMediaGiveawayResults) cell.getMessageObject().messageOwner.media;
|
||||||
|
long id = giveaway.winners.get(pressedPos);
|
||||||
|
presentFragment(ProfileActivity.of(id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void didPressCommentButton(ChatMessageCell cell) {
|
public void didPressCommentButton(ChatMessageCell cell) {
|
||||||
|
@ -32366,7 +32417,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
|
|
||||||
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{msgOutDrawable, msgOutMediaDrawable}, null, Theme.key_chat_outBubble));
|
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{msgOutDrawable, msgOutMediaDrawable}, null, Theme.key_chat_outBubble));
|
||||||
if (!themeDelegate.isThemeChangeAvailable()) {
|
if (!themeDelegate.isThemeChangeAvailable(false)) {
|
||||||
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{msgOutDrawable, msgOutMediaDrawable}, null, Theme.key_chat_outBubbleGradient1));
|
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{msgOutDrawable, msgOutMediaDrawable}, null, Theme.key_chat_outBubbleGradient1));
|
||||||
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{msgOutDrawable, msgOutMediaDrawable}, null, Theme.key_chat_outBubbleGradient2));
|
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{msgOutDrawable, msgOutMediaDrawable}, null, Theme.key_chat_outBubbleGradient2));
|
||||||
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{msgOutDrawable, msgOutMediaDrawable}, null, Theme.key_chat_outBubbleGradient3));
|
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{msgOutDrawable, msgOutMediaDrawable}, null, Theme.key_chat_outBubbleGradient3));
|
||||||
|
@ -32540,7 +32591,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_psaHelpDrawable[0]}, null, Theme.key_chat_inViews));
|
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_psaHelpDrawable[0]}, null, Theme.key_chat_inViews));
|
||||||
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_psaHelpDrawable[1]}, null, Theme.key_chat_outViews));
|
themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_psaHelpDrawable[1]}, null, Theme.key_chat_outViews));
|
||||||
|
|
||||||
if (!themeDelegate.isThemeChangeAvailable()) {
|
if (!themeDelegate.isThemeChangeAvailable(false)) {
|
||||||
themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, Theme.avatarDrawables, null, Theme.key_avatar_text));
|
themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, Theme.avatarDrawables, null, Theme.key_avatar_text));
|
||||||
themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, Theme.dialogs_countPaint, null, null, Theme.key_chats_unreadCounter));
|
themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, Theme.dialogs_countPaint, null, null, Theme.key_chats_unreadCounter));
|
||||||
themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, new Paint[]{Theme.dialogs_namePaint[0], Theme.dialogs_namePaint[1], Theme.dialogs_searchNamePaint}, null, null, Theme.key_chats_name));
|
themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, new Paint[]{Theme.dialogs_namePaint[0], Theme.dialogs_namePaint[1], Theme.dialogs_searchNamePaint}, null, null, Theme.key_chats_name));
|
||||||
|
@ -33030,6 +33081,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showChatThemeBottomSheet() {
|
private void showChatThemeBottomSheet() {
|
||||||
|
if (currentChat != null) {
|
||||||
|
presentFragment(new ChannelColorActivity(getDialogId()).setOnApplied(ChatActivity.this));
|
||||||
|
return;
|
||||||
|
}
|
||||||
chatThemeBottomSheet = new ChatThemeBottomSheet(ChatActivity.this, themeDelegate);
|
chatThemeBottomSheet = new ChatThemeBottomSheet(ChatActivity.this, themeDelegate);
|
||||||
chatListView.setOnInterceptTouchListener(event -> true);
|
chatListView.setOnInterceptTouchListener(event -> true);
|
||||||
setChildrenEnabled(contentView, false);
|
setChildrenEnabled(contentView, false);
|
||||||
|
@ -33059,9 +33114,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
if (userInfo != null) {
|
if (userInfo != null) {
|
||||||
emoticon = userInfo.theme_emoticon;
|
emoticon = userInfo.theme_emoticon;
|
||||||
}
|
}
|
||||||
if (emoticon == null && chatInfo != null) {
|
// if (emoticon == null && chatInfo != null) {
|
||||||
emoticon = chatInfo.theme_emoticon;
|
// emoticon = chatInfo.theme_emoticon;
|
||||||
}
|
// }
|
||||||
setChatThemeEmoticon(emoticon);
|
setChatThemeEmoticon(emoticon);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -33077,13 +33132,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
themeDelegate.setCurrentTheme(result, themeDelegate.wallpaper,openAnimationStartTime != 0, null);
|
themeDelegate.setCurrentTheme(result, themeDelegate.wallpaper,openAnimationStartTime != 0, null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
TLRPC.WallPaper wallPaper = null;
|
TLRPC.WallPaper wallPaper = chatThemeController.getDialogWallpaper(dialog_id);
|
||||||
if (dialog_id >= 0) {
|
|
||||||
TLRPC.UserFull userFull = getMessagesController().getUserFull(dialog_id);
|
|
||||||
if (userFull != null) {
|
|
||||||
wallPaper = userFull.wallpaper;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
themeDelegate.setCurrentTheme(themeDelegate.chatTheme, wallPaper, openAnimationStartTime != 0, null);
|
themeDelegate.setCurrentTheme(themeDelegate.chatTheme, wallPaper, openAnimationStartTime != 0, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33143,7 +33192,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
ThemeDelegate() {
|
ThemeDelegate() {
|
||||||
isDark = Theme.getActiveTheme().isDark();
|
isDark = Theme.getActiveTheme().isDark();
|
||||||
boolean setup = false;
|
boolean setup = false;
|
||||||
if (isThemeChangeAvailable()) {
|
if (isThemeChangeAvailable(false)) {
|
||||||
chatTheme = ChatThemeController.getInstance(currentAccount).getDialogTheme(dialog_id);
|
chatTheme = ChatThemeController.getInstance(currentAccount).getDialogTheme(dialog_id);
|
||||||
wallpaper = ChatThemeController.getInstance(currentAccount).getDialogWallpaper(dialog_id);
|
wallpaper = ChatThemeController.getInstance(currentAccount).getDialogWallpaper(dialog_id);
|
||||||
if (chatTheme != null || wallpaper != null) {
|
if (chatTheme != null || wallpaper != null) {
|
||||||
|
@ -33257,8 +33306,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
return chatTheme != null || backgroundDrawable != null ? currentPaints.get(paintKey) : null;
|
return chatTheme != null || backgroundDrawable != null ? currentPaints.get(paintKey) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isThemeChangeAvailable() {
|
public boolean isThemeChangeAvailable(boolean canEdit) {
|
||||||
return currentChat == null && currentEncryptedChat == null && !currentUser.bot && dialog_id >= 0;
|
return currentEncryptedChat == null && (
|
||||||
|
(!canEdit /*|| currentChat != null && ChatObject.isChannelAndNotMegaGroup(currentChat) && ChatObject.canChangeChatInfo(currentChat)*/) ||
|
||||||
|
currentChat == null && currentUser != null && !currentUser.bot
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public EmojiThemes getCurrentTheme() {
|
public EmojiThemes getCurrentTheme() {
|
||||||
|
@ -33287,7 +33339,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
String newEmoticon = chatTheme != null ? chatTheme.getEmoticon() : null;
|
String newEmoticon = chatTheme != null ? chatTheme.getEmoticon() : null;
|
||||||
String oldEmoticon = this.chatTheme != null ? this.chatTheme.getEmoticon() : null;
|
String oldEmoticon = this.chatTheme != null ? this.chatTheme.getEmoticon() : null;
|
||||||
TLRPC.WallPaper oldWallpaper = this.wallpaper;
|
TLRPC.WallPaper oldWallpaper = this.wallpaper;
|
||||||
if (!force && (!isThemeChangeAvailable() || (TextUtils.equals(oldEmoticon, newEmoticon) && this.isDark == newIsDark && ChatThemeController.equals(newWallpaper, oldWallpaper)))) {
|
if (!force && (!isThemeChangeAvailable(false) || (TextUtils.equals(oldEmoticon, newEmoticon) && this.isDark == newIsDark && ChatThemeController.equals(newWallpaper, oldWallpaper)))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33323,6 +33375,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
|
|
||||||
animationSettings.applyTheme = false;
|
animationSettings.applyTheme = false;
|
||||||
|
if (dialog_id < 0)
|
||||||
|
animationSettings.applyTrulyTheme = false;
|
||||||
animationSettings.afterStartDescriptionsAddedRunnable = () -> {
|
animationSettings.afterStartDescriptionsAddedRunnable = () -> {
|
||||||
setupChatTheme(chatTheme, newWallpaper, animated, true);
|
setupChatTheme(chatTheme, newWallpaper, animated, true);
|
||||||
initServiceMessageColors(backgroundDrawable);
|
initServiceMessageColors(backgroundDrawable);
|
||||||
|
@ -33422,7 +33476,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
} else {
|
} else {
|
||||||
currentColors = chatTheme.createColors(currentAccount, isDark ? 1 : 0);
|
currentColors = chatTheme.createColors(currentAccount, isDark ? 1 : 0);
|
||||||
}
|
}
|
||||||
if (wallPaper != null) {
|
if (!TextUtils.isEmpty(ChatThemeController.getWallpaperEmoticon(wallpaper))) {
|
||||||
|
backgroundDrawable = PreviewView.getBackgroundDrawable(backgroundDrawable, currentAccount, wallpaper, isDark);
|
||||||
|
} else if (wallPaper != null) {
|
||||||
backgroundDrawable = ChatBackgroundDrawable.getOrCreate(backgroundDrawable, wallPaper, isDark);
|
backgroundDrawable = ChatBackgroundDrawable.getOrCreate(backgroundDrawable, wallPaper, isDark);
|
||||||
} else {
|
} else {
|
||||||
backgroundDrawable = getBackgroundDrawableFromTheme(chatTheme, prevPhase);
|
backgroundDrawable = getBackgroundDrawableFromTheme(chatTheme, prevPhase);
|
||||||
|
@ -33464,7 +33520,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
patternAlphaAnimator.start();
|
patternAlphaAnimator.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chatTheme == null) {
|
if (chatTheme == null && dialog_id >= 0) {
|
||||||
Theme.ThemeInfo activeTheme;
|
Theme.ThemeInfo activeTheme;
|
||||||
if (Theme.getActiveTheme().isDark() == isDark) {
|
if (Theme.getActiveTheme().isDark() == isDark) {
|
||||||
activeTheme = Theme.getActiveTheme();
|
activeTheme = Theme.getActiveTheme();
|
||||||
|
@ -34023,4 +34079,28 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean supportsThanosEffect() {
|
||||||
|
return ThanosEffect.supports() && LiteMode.isEnabled(LiteMode.FLAG_CHAT_THANOS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThanosEffect getChatThanosEffect() {
|
||||||
|
if (!LiteMode.isEnabled(LiteMode.FLAG_CHAT_THANOS) || !ThanosEffect.supports()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (chatListThanosEffect == null) {
|
||||||
|
if (getContext() == null || !ThanosEffect.supports() || chatListView == null || contentView == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
chatListThanosEffect = new ThanosEffect(getContext(), () -> {
|
||||||
|
ThanosEffect thisThanosEffect = chatListThanosEffect;
|
||||||
|
if (thisThanosEffect != null) {
|
||||||
|
chatListThanosEffect = null;
|
||||||
|
contentView.removeView(thisThanosEffect);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
contentView.addView(chatListThanosEffect, 1 + contentView.indexOfChild(chatListView), LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
|
||||||
|
}
|
||||||
|
return chatListThanosEffect;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,7 @@ public class ChatBackgroundDrawable extends Drawable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (wallPaper.settings.intensity < 0) {
|
if (wallPaper.settings == null || wallPaper.settings.intensity < 0) {
|
||||||
thumb = bitmapDrawableOf(new ColorDrawable(Color.BLACK));
|
thumb = bitmapDrawableOf(new ColorDrawable(Color.BLACK));
|
||||||
} else {
|
} else {
|
||||||
if (wallPaper.settings.second_background_color == 0) { //one color
|
if (wallPaper.settings.second_background_color == 0) { //one color
|
||||||
|
|
|
@ -45,6 +45,7 @@ import android.widget.ScrollView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import org.telegram.messenger.AndroidUtilities;
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
|
import org.telegram.messenger.ChannelBoostsController;
|
||||||
import org.telegram.messenger.ChatObject;
|
import org.telegram.messenger.ChatObject;
|
||||||
import org.telegram.messenger.ContactsController;
|
import org.telegram.messenger.ContactsController;
|
||||||
import org.telegram.messenger.Emoji;
|
import org.telegram.messenger.Emoji;
|
||||||
|
@ -888,11 +889,15 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ChatObject.isChannelAndNotMegaGroup(currentChat) && ChatObject.canChangeChatInfo(currentChat)) {
|
if (ChatObject.isChannelAndNotMegaGroup(currentChat) && ChatObject.canChangeChatInfo(currentChat)) {
|
||||||
colorCell = new PeerColorActivity.ChangeNameColorCell(currentAccount, true, context, getResourceProvider());
|
colorCell = new PeerColorActivity.ChangeNameColorCell(currentAccount, -currentChat.id, context, getResourceProvider());
|
||||||
colorCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
|
colorCell.setBackgroundDrawable(Theme.getSelectorDrawable(true));
|
||||||
typeEditContainer.addView(colorCell, LayoutHelper.createLinear(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
typeEditContainer.addView(colorCell, LayoutHelper.createLinear(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||||
colorCell.setOnClickListener(v -> {
|
colorCell.setOnClickListener(v -> {
|
||||||
presentFragment(new PeerColorActivity(-currentChat.id).setOnApplied(this));
|
presentFragment(new ChannelColorActivity(-currentChat.id).setOnApplied(this));
|
||||||
|
|
||||||
|
MessagesController.getInstance(currentAccount).getMainSettings().edit().putInt("boostingappearance",
|
||||||
|
MessagesController.getInstance(currentAccount).getMainSettings().getInt("boostingappearance", 0) + 1
|
||||||
|
).apply();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1925,7 +1930,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateColorCell() {
|
public void updateColorCell() {
|
||||||
if (colorCell != null) {
|
if (colorCell != null) {
|
||||||
colorCell.set(currentChat, (historyCell != null && historyCell.getVisibility() == View.VISIBLE) || (signCell != null && signCell.getVisibility() == View.VISIBLE) || (forumsCell != null && forumsCell.getVisibility() == View.VISIBLE));
|
colorCell.set(currentChat, (historyCell != null && historyCell.getVisibility() == View.VISIBLE) || (signCell != null && signCell.getVisibility() == View.VISIBLE) || (forumsCell != null && forumsCell.getVisibility() == View.VISIBLE));
|
||||||
}
|
}
|
||||||
|
@ -2034,12 +2039,8 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image
|
||||||
} else {
|
} else {
|
||||||
finalString = LocaleController.getString("ReactionsAll", R.string.ReactionsAll);
|
finalString = LocaleController.getString("ReactionsAll", R.string.ReactionsAll);
|
||||||
}
|
}
|
||||||
if (isChannelAndNotMegaGroup) {
|
|
||||||
reactionsCell.setTextAndValueAndIcon(TextCell.applyNewSpan(LocaleController.getString("Reactions", R.string.Reactions)), finalString, animated, R.drawable.msg_reactions2, true);
|
|
||||||
} else {
|
|
||||||
reactionsCell.setTextAndValueAndIcon(LocaleController.getString("Reactions", R.string.Reactions), finalString, animated, R.drawable.msg_reactions2, true);
|
reactionsCell.setTextAndValueAndIcon(LocaleController.getString("Reactions", R.string.Reactions), finalString, animated, R.drawable.msg_reactions2, true);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<ThemeDescription> getThemeDescriptions() {
|
public ArrayList<ThemeDescription> getThemeDescriptions() {
|
||||||
|
|
|
@ -263,6 +263,9 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe
|
||||||
if (id == -1) {
|
if (id == -1) {
|
||||||
finishFragment();
|
finishFragment();
|
||||||
} else if (id == done_button) {
|
} else if (id == done_button) {
|
||||||
|
if (doneButtonDrawable != null && doneButtonDrawable.getProgress() > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
processDone();
|
processDone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -683,10 +686,7 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe
|
||||||
|
|
||||||
private void processDone() {
|
private void processDone() {
|
||||||
AndroidUtilities.runOnUIThread(enableDoneLoading, 200);
|
AndroidUtilities.runOnUIThread(enableDoneLoading, 200);
|
||||||
if (currentChat.noforwards != isSaveRestricted) {
|
if (trySetUsername() && trySetRestrict() && tryUpdateJoinSettings()) {
|
||||||
getMessagesController().toggleChatNoForwards(chatId, currentChat.noforwards = isSaveRestricted);
|
|
||||||
}
|
|
||||||
if (trySetUsername() && tryUpdateJoinSettings()) {
|
|
||||||
finishFragment();
|
finishFragment();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1117,6 +1117,26 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean trySetRestrict() {
|
||||||
|
if (currentChat.noforwards != isSaveRestricted) {
|
||||||
|
if (!ChatObject.isChannel(currentChat)) {
|
||||||
|
updateDoneProgress(true);
|
||||||
|
getMessagesController().convertToMegaGroup(getParentActivity(), chatId, this, param -> {
|
||||||
|
if (param != 0) {
|
||||||
|
chatId = param;
|
||||||
|
currentChat = getMessagesController().getChat(param);
|
||||||
|
getMessagesController().toggleChatNoForwards(chatId, currentChat.noforwards = isSaveRestricted);
|
||||||
|
processDone();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
getMessagesController().toggleChatNoForwards(chatId, currentChat.noforwards = isSaveRestricted);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean trySetUsername() {
|
private boolean trySetUsername() {
|
||||||
if (getParentActivity() == null) {
|
if (getParentActivity() == null) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -1165,7 +1185,7 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe
|
||||||
|
|
||||||
private boolean deactivatingLinks = false;
|
private boolean deactivatingLinks = false;
|
||||||
private boolean tryDeactivateAllLinks() {
|
private boolean tryDeactivateAllLinks() {
|
||||||
if (!isPrivate || currentChat.usernames == null) {
|
if (!isPrivate || currentChat.usernames == null || currentChat.usernames.isEmpty()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (deactivatingLinks) {
|
if (deactivatingLinks) {
|
||||||
|
@ -1182,7 +1202,7 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe
|
||||||
if (hasActive) {
|
if (hasActive) {
|
||||||
TLRPC.TL_channels_deactivateAllUsernames req = new TLRPC.TL_channels_deactivateAllUsernames();
|
TLRPC.TL_channels_deactivateAllUsernames req = new TLRPC.TL_channels_deactivateAllUsernames();
|
||||||
req.channel = MessagesController.getInputChannel(currentChat);
|
req.channel = MessagesController.getInputChannel(currentChat);
|
||||||
getConnectionsManager().sendRequest(req, (res, err) -> {
|
getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> {
|
||||||
if (res instanceof TLRPC.TL_boolTrue) {
|
if (res instanceof TLRPC.TL_boolTrue) {
|
||||||
for (int i = 0; i < currentChat.usernames.size(); ++i) {
|
for (int i = 0; i < currentChat.usernames.size(); ++i) {
|
||||||
final TLRPC.TL_username username = currentChat.usernames.get(i);
|
final TLRPC.TL_username username = currentChat.usernames.get(i);
|
||||||
|
@ -1193,7 +1213,9 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe
|
||||||
}
|
}
|
||||||
deactivatingLinks = false;
|
deactivatingLinks = false;
|
||||||
AndroidUtilities.runOnUIThread(this::processDone);
|
AndroidUtilities.runOnUIThread(this::processDone);
|
||||||
});
|
}));
|
||||||
|
} else {
|
||||||
|
deactivatingLinks = false;
|
||||||
}
|
}
|
||||||
return !hasActive;
|
return !hasActive;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5768,28 +5768,32 @@ public class AlertsCreator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isGiveawayAndOwner = false;
|
boolean isActiveGiveawayAndOwner = false;
|
||||||
String giveawayEndDate = null;
|
String giveawayEndDate = null;
|
||||||
if (selectedMessage != null) {
|
if (selectedMessage != null) {
|
||||||
isGiveawayAndOwner = selectedMessage.isGiveaway() && !selectedMessage.isForwarded();
|
isActiveGiveawayAndOwner = selectedMessage.isGiveaway() && !selectedMessage.isForwarded();
|
||||||
if (isGiveawayAndOwner) {
|
if (isActiveGiveawayAndOwner) {
|
||||||
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) selectedMessage.messageOwner.media;
|
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) selectedMessage.messageOwner.media;
|
||||||
giveawayEndDate = LocaleController.getInstance().formatterGiveawayMonthDayYear.format(new Date(giveaway.until_date * 1000L));
|
long untilDate = giveaway.until_date * 1000L;
|
||||||
|
giveawayEndDate = LocaleController.getInstance().formatterGiveawayMonthDayYear.format(new Date(untilDate));
|
||||||
|
isActiveGiveawayAndOwner = System.currentTimeMillis() < untilDate;
|
||||||
}
|
}
|
||||||
} else if (count == 1) {
|
} else if (count == 1) {
|
||||||
for (int a = 1; a >= 0; a--) {
|
for (int a = 1; a >= 0; a--) {
|
||||||
for (int b = 0; b < selectedMessages[a].size(); b++) {
|
for (int b = 0; b < selectedMessages[a].size(); b++) {
|
||||||
MessageObject msg = selectedMessages[a].valueAt(b);
|
MessageObject msg = selectedMessages[a].valueAt(b);
|
||||||
isGiveawayAndOwner = msg.isGiveaway() && !msg.isForwarded();
|
isActiveGiveawayAndOwner = msg.isGiveaway() && !msg.isForwarded();
|
||||||
if (isGiveawayAndOwner) {
|
if (isActiveGiveawayAndOwner) {
|
||||||
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) msg.messageOwner.media;
|
TLRPC.TL_messageMediaGiveaway giveaway = (TLRPC.TL_messageMediaGiveaway) msg.messageOwner.media;
|
||||||
giveawayEndDate = LocaleController.getInstance().formatterGiveawayMonthDayYear.format(new Date(giveaway.until_date * 1000L));
|
long untilDate = giveaway.until_date * 1000L;
|
||||||
|
giveawayEndDate = LocaleController.getInstance().formatterGiveawayMonthDayYear.format(new Date(untilDate));
|
||||||
|
isActiveGiveawayAndOwner = System.currentTimeMillis() < untilDate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isGiveawayAndOwner) {
|
if (isActiveGiveawayAndOwner) {
|
||||||
builder.setTitle(LocaleController.getString("BoostingGiveawayDeleteMsgTitle", R.string.BoostingGiveawayDeleteMsgTitle));
|
builder.setTitle(LocaleController.getString("BoostingGiveawayDeleteMsgTitle", R.string.BoostingGiveawayDeleteMsgTitle));
|
||||||
builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("BoostingGiveawayDeleteMsgText", R.string.BoostingGiveawayDeleteMsgText, giveawayEndDate)));
|
builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("BoostingGiveawayDeleteMsgText", R.string.BoostingGiveawayDeleteMsgText, giveawayEndDate)));
|
||||||
builder.setNeutralButton(LocaleController.getString("Delete", R.string.Delete), deleteAction);
|
builder.setNeutralButton(LocaleController.getString("Delete", R.string.Delete), deleteAction);
|
||||||
|
|
|
@ -71,6 +71,7 @@ public class AnimatedEmojiDrawable extends Drawable {
|
||||||
public static final int CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW = 14;
|
public static final int CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW = 14;
|
||||||
public static final int CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW2 = 15;
|
public static final int CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW2 = 15;
|
||||||
public static final int CACHE_TYPE_ALERT_PREVIEW_STATIC_WITH_THUMB = 16;
|
public static final int CACHE_TYPE_ALERT_PREVIEW_STATIC_WITH_THUMB = 16;
|
||||||
|
public static final int CACHE_TYPE_EMOJI_CALL = 17;
|
||||||
|
|
||||||
public int rawDrawIndex;
|
public int rawDrawIndex;
|
||||||
|
|
||||||
|
@ -463,7 +464,7 @@ public class AnimatedEmojiDrawable extends Drawable {
|
||||||
sizedp = (int) ((Math.abs(Theme.chat_msgTextPaintEmoji[2].ascent()) + Math.abs(Theme.chat_msgTextPaintEmoji[2].descent())) * 1.15f / AndroidUtilities.density);
|
sizedp = (int) ((Math.abs(Theme.chat_msgTextPaintEmoji[2].ascent()) + Math.abs(Theme.chat_msgTextPaintEmoji[2].descent())) * 1.15f / AndroidUtilities.density);
|
||||||
} else if (this.cacheType == STANDARD_LOTTIE_FRAME) {
|
} else if (this.cacheType == STANDARD_LOTTIE_FRAME) {
|
||||||
sizedp = (int) ((Math.abs(Theme.chat_msgTextPaintEmoji[0].ascent()) + Math.abs(Theme.chat_msgTextPaintEmoji[0].descent())) * 1.15f / AndroidUtilities.density);
|
sizedp = (int) ((Math.abs(Theme.chat_msgTextPaintEmoji[0].ascent()) + Math.abs(Theme.chat_msgTextPaintEmoji[0].descent())) * 1.15f / AndroidUtilities.density);
|
||||||
} else if (cacheType == CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW || cacheType == CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW2) {
|
} else if (cacheType == CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW || cacheType == CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW2 || cacheType == CACHE_TYPE_EMOJI_CALL) {
|
||||||
sizedp = 100;
|
sizedp = 100;
|
||||||
} else {
|
} else {
|
||||||
sizedp = 34;
|
sizedp = 34;
|
||||||
|
@ -528,10 +529,10 @@ public class AnimatedEmojiDrawable extends Drawable {
|
||||||
if (cacheType == CACHE_TYPE_RENDERING_VIDEO) {
|
if (cacheType == CACHE_TYPE_RENDERING_VIDEO) {
|
||||||
filter += "_d_nostream";
|
filter += "_d_nostream";
|
||||||
}
|
}
|
||||||
if (cacheType != CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW2 && cacheType != CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW && cacheType != STANDARD_LOTTIE_FRAME && (cacheType != CACHE_TYPE_MESSAGES_LARGE || SharedConfig.getDevicePerformanceClass() < SharedConfig.PERFORMANCE_CLASS_HIGH) && cacheType != CACHE_TYPE_RENDERING_VIDEO) {
|
if (cacheType != CACHE_TYPE_EMOJI_CALL && cacheType != CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW2 && cacheType != CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW && cacheType != STANDARD_LOTTIE_FRAME && (cacheType != CACHE_TYPE_MESSAGES_LARGE || SharedConfig.getDevicePerformanceClass() < SharedConfig.PERFORMANCE_CLASS_HIGH) && cacheType != CACHE_TYPE_RENDERING_VIDEO) {
|
||||||
filter += "_pcache";
|
filter += "_pcache";
|
||||||
}
|
}
|
||||||
if (cacheType != CACHE_TYPE_MESSAGES && cacheType != CACHE_TYPE_MESSAGES_LARGE && cacheType != CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW && cacheType != CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW2) {
|
if (cacheType != CACHE_TYPE_EMOJI_CALL && cacheType != CACHE_TYPE_MESSAGES && cacheType != CACHE_TYPE_MESSAGES_LARGE && cacheType != CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW && cacheType != CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW2) {
|
||||||
filter += "_compress";
|
filter += "_compress";
|
||||||
}
|
}
|
||||||
if (cacheType == STANDARD_LOTTIE_FRAME) {
|
if (cacheType == STANDARD_LOTTIE_FRAME) {
|
||||||
|
@ -585,7 +586,11 @@ public class AnimatedEmojiDrawable extends Drawable {
|
||||||
imageReceiver.setImage(ImageLocation.getForDocument(thumb, document), sizedp + "_" + sizedp, thumbLocation, null, thumbDrawable, document.size, null, document, 1);
|
imageReceiver.setImage(ImageLocation.getForDocument(thumb, document), sizedp + "_" + sizedp, thumbLocation, null, thumbDrawable, document.size, null, document, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
imageReceiver.setImage(mediaLocation, mediaFilter, ImageLocation.getForDocument(thumb, document), sizedp + "_" + sizedp, null, null, thumbDrawable, document.size, null, document, 1);
|
ImageLocation thumbLocation = null;
|
||||||
|
if (cacheType == CACHE_TYPE_EMOJI_CALL) {
|
||||||
|
thumbLocation = ImageLocation.getForDocument(thumb, document);
|
||||||
|
}
|
||||||
|
imageReceiver.setImage(mediaLocation, mediaFilter, ImageLocation.getForDocument(thumb, document), sizedp + "_" + sizedp, thumbLocation, null, thumbDrawable, document.size, null, document, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -622,6 +627,8 @@ public class AnimatedEmojiDrawable extends Drawable {
|
||||||
imageReceiver.setAutoRepeatCount(2);
|
imageReceiver.setAutoRepeatCount(2);
|
||||||
} else if (cacheType == CACHE_TYPE_FORUM_TOPIC_LARGE || cacheType == CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW || cacheType == CACHE_TYPE_TAB_STRIP || cacheType == CACHE_TYPE_ALERT_PREVIEW_TAB_STRIP) {
|
} else if (cacheType == CACHE_TYPE_FORUM_TOPIC_LARGE || cacheType == CACHE_TYPE_AVATAR_CONSTRUCTOR_PREVIEW || cacheType == CACHE_TYPE_TAB_STRIP || cacheType == CACHE_TYPE_ALERT_PREVIEW_TAB_STRIP) {
|
||||||
imageReceiver.setAutoRepeatCount(1);
|
imageReceiver.setAutoRepeatCount(1);
|
||||||
|
} else if (cacheType == CACHE_TYPE_EMOJI_CALL){
|
||||||
|
imageReceiver.setAutoRepeatCount(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,13 @@ public class BitmapShaderTools {
|
||||||
updateBounds();
|
updateBounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BitmapShaderTools(int width, int height) {
|
||||||
|
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||||
|
canvas = new Canvas(bitmap);
|
||||||
|
paint.setShader(shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
|
||||||
|
updateBounds();
|
||||||
|
}
|
||||||
|
|
||||||
public Bitmap getBitmap() {
|
public Bitmap getBitmap() {
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
@ -64,4 +71,12 @@ public class BitmapShaderTools {
|
||||||
AndroidUtilities.rectTmp.set(left, top, right, bottom);
|
AndroidUtilities.rectTmp.set(left, top, right, bottom);
|
||||||
setBounds(AndroidUtilities.rectTmp);
|
setBounds(AndroidUtilities.rectTmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setMatrix(float offsetX, float offsetY, float scale, float degrees) {
|
||||||
|
matrix.reset();
|
||||||
|
matrix.postRotate(degrees, bitmap.getWidth() / 2f, bitmap.getHeight() / 2f);
|
||||||
|
matrix.postScale(scale, scale);
|
||||||
|
matrix.postTranslate(offsetX, offsetY);
|
||||||
|
shader.setLocalMatrix(matrix);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,26 +40,26 @@ public class BlobDrawable {
|
||||||
private Path path = new Path();
|
private Path path = new Path();
|
||||||
public Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
public Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
|
|
||||||
private float[] radius;
|
protected float[] radius;
|
||||||
private float[] angle;
|
protected float[] angle;
|
||||||
private float[] radiusNext;
|
protected float[] radiusNext;
|
||||||
private float[] angleNext;
|
protected float[] angleNext;
|
||||||
private float[] progress;
|
protected float[] progress;
|
||||||
private float[] speed;
|
protected float[] speed;
|
||||||
|
|
||||||
|
|
||||||
private float[] pointStart = new float[4];
|
private float[] pointStart = new float[4];
|
||||||
private float[] pointEnd = new float[4];
|
private float[] pointEnd = new float[4];
|
||||||
|
|
||||||
final Random random = new Random();
|
protected final Random random = new Random();
|
||||||
|
|
||||||
private final float N;
|
protected final float N;
|
||||||
private final float L;
|
private final float L;
|
||||||
public float cubicBezierK = 1f;
|
public float cubicBezierK = 1f;
|
||||||
|
|
||||||
private final Matrix m = new Matrix();
|
private final Matrix m = new Matrix();
|
||||||
|
|
||||||
private final int liteFlag;
|
protected final int liteFlag;
|
||||||
|
|
||||||
public BlobDrawable(int n) {
|
public BlobDrawable(int n) {
|
||||||
this(n, LiteMode.FLAG_CALLS_ANIMATIONS);
|
this(n, LiteMode.FLAG_CALLS_ANIMATIONS);
|
||||||
|
@ -85,7 +85,7 @@ public class BlobDrawable {
|
||||||
this.liteFlag = liteFlag;
|
this.liteFlag = liteFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateBlob(float[] radius, float[] angle, int i) {
|
protected void generateBlob(float[] radius, float[] angle, int i) {
|
||||||
float angleDif = 360f / N * 0.05f;
|
float angleDif = 360f / N * 0.05f;
|
||||||
float radDif = maxRadius - minRadius;
|
float radDif = maxRadius - minRadius;
|
||||||
radius[i] = minRadius + Math.abs(((random.nextInt() % 100f) / 100f)) * radDif;
|
radius[i] = minRadius + Math.abs(((random.nextInt() % 100f) / 100f)) * radDif;
|
||||||
|
|
|
@ -555,7 +555,10 @@ public class BlurringShader {
|
||||||
|
|
||||||
private int i = 0;
|
private int i = 0;
|
||||||
public void setFallbackBlur(Bitmap bitmap, int orientation) {
|
public void setFallbackBlur(Bitmap bitmap, int orientation) {
|
||||||
fallbackBitmap = thumbBlurer.getBitmap(bitmap, "" + i++, orientation, 0);
|
setFallbackBlur(bitmap, orientation, false);
|
||||||
|
}
|
||||||
|
public void setFallbackBlur(Bitmap bitmap, int orientation, boolean recycleAfter) {
|
||||||
|
fallbackBitmap = thumbBlurer.getBitmap(bitmap, "" + i++, orientation, 0, recycleAfter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resetBitmap() {
|
public void resetBitmap() {
|
||||||
|
@ -603,7 +606,7 @@ public class BlurringShader {
|
||||||
thumbBitmap = null;
|
thumbBitmap = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap getBitmap(Bitmap bitmap, String key, int orientation, int invert) {
|
public Bitmap getBitmap(Bitmap bitmap, String key, int orientation, int invert, boolean recycleAfter) {
|
||||||
if (bitmap == null) {
|
if (bitmap == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -666,6 +669,10 @@ public class BlurringShader {
|
||||||
} else {
|
} else {
|
||||||
resultBitmap.recycle();
|
resultBitmap.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (recycleAfter) {
|
||||||
|
bitmap.recycle();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return thumbBitmap;
|
return thumbBitmap;
|
||||||
|
@ -675,14 +682,14 @@ public class BlurringShader {
|
||||||
if (imageReceiver == null) {
|
if (imageReceiver == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return getBitmap(imageReceiver.getBitmap(), imageReceiver.getImageKey(), imageReceiver.getOrientation(), imageReceiver.getInvert());
|
return getBitmap(imageReceiver.getBitmap(), imageReceiver.getImageKey(), imageReceiver.getOrientation(), imageReceiver.getInvert(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap getBitmap(ImageReceiver.BitmapHolder bitmapHolder) {
|
public Bitmap getBitmap(ImageReceiver.BitmapHolder bitmapHolder) {
|
||||||
if (bitmapHolder == null) {
|
if (bitmapHolder == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return getBitmap(bitmapHolder.bitmap, bitmapHolder.getKey(), bitmapHolder.orientation, 0);
|
return getBitmap(bitmapHolder.bitmap, bitmapHolder.getKey(), bitmapHolder.orientation, 0, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -698,6 +705,7 @@ public class BlurringShader {
|
||||||
public static final int BLUR_TYPE_EMOJI_VIEW = 7;
|
public static final int BLUR_TYPE_EMOJI_VIEW = 7;
|
||||||
public static final int BLUR_TYPE_REPLY_BACKGROUND = 8;
|
public static final int BLUR_TYPE_REPLY_BACKGROUND = 8;
|
||||||
public static final int BLUR_TYPE_REPLY_TEXT_XFER = 9;
|
public static final int BLUR_TYPE_REPLY_TEXT_XFER = 9;
|
||||||
|
public static final int BLUR_TYPE_ACTION_BACKGROUND = 10;
|
||||||
|
|
||||||
private final BlurManager manager;
|
private final BlurManager manager;
|
||||||
private final View view;
|
private final View view;
|
||||||
|
@ -758,6 +766,10 @@ public class BlurringShader {
|
||||||
AndroidUtilities.adjustBrightnessColorMatrix(colorMatrix, +.4f);
|
AndroidUtilities.adjustBrightnessColorMatrix(colorMatrix, +.4f);
|
||||||
AndroidUtilities.adjustSaturationColorMatrix(colorMatrix, +.45f);
|
AndroidUtilities.adjustSaturationColorMatrix(colorMatrix, +.45f);
|
||||||
// AndroidUtilities.multiplyBrightnessColorMatrix(colorMatrix, 1.4f);
|
// AndroidUtilities.multiplyBrightnessColorMatrix(colorMatrix, 1.4f);
|
||||||
|
} else if (type == BLUR_TYPE_ACTION_BACKGROUND) {
|
||||||
|
colorMatrix.setSaturation(1.6f);
|
||||||
|
AndroidUtilities.multiplyBrightnessColorMatrix(colorMatrix, wasDark ? .97f : .92f);
|
||||||
|
AndroidUtilities.adjustBrightnessColorMatrix(colorMatrix, wasDark ? +.12f : -.06f);
|
||||||
}
|
}
|
||||||
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
|
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
|
||||||
oldPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
|
oldPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
|
||||||
|
@ -829,6 +841,22 @@ public class BlurringShader {
|
||||||
updateBounds();
|
updateBounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean wasDark = false;
|
||||||
|
public StoryBlurDrawer adapt(boolean isDark) {
|
||||||
|
if (wasDark != isDark) {
|
||||||
|
wasDark = isDark;
|
||||||
|
if (type == BLUR_TYPE_ACTION_BACKGROUND) {
|
||||||
|
final ColorMatrix colorMatrix = new ColorMatrix();
|
||||||
|
colorMatrix.setSaturation(1.6f);
|
||||||
|
AndroidUtilities.multiplyBrightnessColorMatrix(colorMatrix, wasDark ? .97f : .92f);
|
||||||
|
AndroidUtilities.adjustBrightnessColorMatrix(colorMatrix, wasDark ? +.12f : -.06f);
|
||||||
|
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
|
||||||
|
oldPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public Paint getPaint(float alpha) {
|
public Paint getPaint(float alpha) {
|
||||||
return getPaint(alpha, 0, 0);
|
return getPaint(alpha, 0, 0);
|
||||||
|
@ -913,6 +941,7 @@ public class BlurringShader {
|
||||||
View view = this.view;
|
View view = this.view;
|
||||||
do {
|
do {
|
||||||
matrix.preScale(1f / view.getScaleX(), 1f / view.getScaleY(), view.getPivotX(), view.getPivotY());
|
matrix.preScale(1f / view.getScaleX(), 1f / view.getScaleY(), view.getPivotX(), view.getPivotY());
|
||||||
|
matrix.preRotate(-view.getRotation(), view.getPivotX(), view.getPivotY());
|
||||||
matrix.preTranslate(-view.getX(), -view.getY());
|
matrix.preTranslate(-view.getX(), -view.getY());
|
||||||
if (view.getParent() instanceof View) {
|
if (view.getParent() instanceof View) {
|
||||||
view = (View) view.getParent();
|
view = (View) view.getParent();
|
||||||
|
@ -930,6 +959,7 @@ public class BlurringShader {
|
||||||
}
|
}
|
||||||
matrix.postTranslate(child.getX(), child.getY());
|
matrix.postTranslate(child.getX(), child.getY());
|
||||||
matrix.postScale(1f / child.getScaleX(), 1f / child.getScaleY(), child.getPivotX(), child.getPivotY());
|
matrix.postScale(1f / child.getScaleX(), 1f / child.getScaleY(), child.getPivotX(), child.getPivotY());
|
||||||
|
matrix.postRotate(child.getRotation(), child.getPivotX(), child.getPivotY());
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1200,7 +1200,11 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi
|
||||||
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didSetNewTheme);
|
NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didSetNewTheme);
|
||||||
|
|
||||||
swipeContainer.stickTo(swipeContainer.getHeight() + frameLayout.measureKeyboardHeight(), ()->{
|
swipeContainer.stickTo(swipeContainer.getHeight() + frameLayout.measureKeyboardHeight(), ()->{
|
||||||
|
try {
|
||||||
super.dismiss();
|
super.dismiss();
|
||||||
|
} catch (Exception e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
}
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback.run();
|
callback.run();
|
||||||
}
|
}
|
||||||
|
|
|
@ -251,6 +251,9 @@ public abstract class BottomSheetWithRecyclerListView extends BottomSheet {
|
||||||
headerShadowDrawable.setBounds(backgroundPaddingLeft, actionBar.getBottom(), parentView.getMeasuredWidth() - backgroundPaddingLeft, actionBar.getBottom() + headerShadowDrawable.getIntrinsicHeight());
|
headerShadowDrawable.setBounds(backgroundPaddingLeft, actionBar.getBottom(), parentView.getMeasuredWidth() - backgroundPaddingLeft, actionBar.getBottom() + headerShadowDrawable.getIntrinsicHeight());
|
||||||
headerShadowDrawable.setAlpha((int) (255 * actionBar.getAlpha() * shadowAlpha));
|
headerShadowDrawable.setAlpha((int) (255 * actionBar.getAlpha() * shadowAlpha));
|
||||||
headerShadowDrawable.draw(canvas);
|
headerShadowDrawable.draw(canvas);
|
||||||
|
if (headerShadowDrawable.getAlpha() < 255) {
|
||||||
|
parentView.invalidate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
wasDrawn = true;
|
wasDrawn = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -674,7 +674,11 @@ public class Bulletin {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setBackground(int color) {
|
protected void setBackground(int color) {
|
||||||
background = Theme.createRoundRectDrawable(AndroidUtilities.dp(10), color);
|
setBackground(color, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBackground(int color, int rounding) {
|
||||||
|
background = Theme.createRoundRectDrawable(AndroidUtilities.dp(rounding), color);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final static FloatPropertyCompat<Layout> IN_OUT_OFFSET_Y = new FloatPropertyCompat<Layout>("offsetY") {
|
public final static FloatPropertyCompat<Layout> IN_OUT_OFFSET_Y = new FloatPropertyCompat<Layout>("offsetY") {
|
||||||
|
@ -1085,9 +1089,17 @@ public class Bulletin {
|
||||||
this.resourcesProvider = resourcesProvider;
|
this.resourcesProvider = resourcesProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean wrapWidth;
|
||||||
|
public void setWrapWidth() {
|
||||||
|
wrapWidth = true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
childrenMeasuredWidth = 0;
|
childrenMeasuredWidth = 0;
|
||||||
|
if (wrapWidth) {
|
||||||
|
widthMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST);
|
||||||
|
}
|
||||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||||
if (button != null && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) {
|
if (button != null && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) {
|
||||||
setMeasuredDimension(childrenMeasuredWidth + button.getMeasuredWidth(), getMeasuredHeight());
|
setMeasuredDimension(childrenMeasuredWidth + button.getMeasuredWidth(), getMeasuredHeight());
|
||||||
|
|
|
@ -41,6 +41,7 @@ import org.telegram.ui.ActionBar.BaseFragment;
|
||||||
import org.telegram.ui.ActionBar.Theme;
|
import org.telegram.ui.ActionBar.Theme;
|
||||||
import org.telegram.ui.LaunchActivity;
|
import org.telegram.ui.LaunchActivity;
|
||||||
import org.telegram.ui.PremiumPreviewFragment;
|
import org.telegram.ui.PremiumPreviewFragment;
|
||||||
|
import org.telegram.ui.Stories.recorder.HintView2;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -189,6 +190,20 @@ public final class BulletinFactory {
|
||||||
return create(layout, text.length() < 20 ? Bulletin.DURATION_SHORT : Bulletin.DURATION_LONG);
|
return create(layout, text.length() < 20 ? Bulletin.DURATION_SHORT : Bulletin.DURATION_LONG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Bulletin createImageBulletin(int iconRawId, CharSequence title) {
|
||||||
|
final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(getContext(), resourcesProvider);
|
||||||
|
layout.setBackground(Theme.getColor(Theme.key_undo_background, resourcesProvider), 12);
|
||||||
|
layout.imageView.setImageResource(iconRawId);
|
||||||
|
layout.textView.setText(title);
|
||||||
|
layout.textView.setSingleLine(false);
|
||||||
|
layout.textView.setLines(2);
|
||||||
|
layout.textView.setMaxLines(4);
|
||||||
|
layout.textView.setMaxWidth(HintView2.cutInFancyHalf(layout.textView.getText(), layout.textView.getPaint()));
|
||||||
|
((ViewGroup.MarginLayoutParams) layout.textView.getLayoutParams()).rightMargin = AndroidUtilities.dp(12);
|
||||||
|
layout.setWrapWidth();
|
||||||
|
return create(layout, Bulletin.DURATION_PROLONG);
|
||||||
|
}
|
||||||
|
|
||||||
public Bulletin createSimpleLargeBulletin(int iconRawId, CharSequence title, CharSequence subtitle) {
|
public Bulletin createSimpleLargeBulletin(int iconRawId, CharSequence title, CharSequence subtitle) {
|
||||||
final Bulletin.TwoLineLayout layout = new Bulletin.TwoLineLayout(getContext(), resourcesProvider);
|
final Bulletin.TwoLineLayout layout = new Bulletin.TwoLineLayout(getContext(), resourcesProvider);
|
||||||
layout.imageView.setImageResource(iconRawId);
|
layout.imageView.setImageResource(iconRawId);
|
||||||
|
|
|
@ -303,7 +303,7 @@ public class CaptionPhotoViewer extends CaptionContainerView {
|
||||||
@Override
|
@Override
|
||||||
public void updateColors(Theme.ResourcesProvider resourcesProvider) {
|
public void updateColors(Theme.ResourcesProvider resourcesProvider) {
|
||||||
super.updateColors(resourcesProvider);
|
super.updateColors(resourcesProvider);
|
||||||
timerDrawable.updateColors(0xffffffff, Theme.getColor(Theme.key_chat_editMediaButton, resourcesProvider));
|
timerDrawable.updateColors(0xffffffff, Theme.getColor(Theme.key_chat_editMediaButton, resourcesProvider), 0xffffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -59,9 +59,7 @@ import android.text.StaticLayout;
|
||||||
import android.text.TextPaint;
|
import android.text.TextPaint;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.text.style.DynamicDrawableSpan;
|
|
||||||
import android.text.style.ImageSpan;
|
import android.text.style.ImageSpan;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Property;
|
import android.util.Property;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.ActionMode;
|
import android.view.ActionMode;
|
||||||
|
@ -115,7 +113,6 @@ import org.telegram.messenger.ApplicationLoader;
|
||||||
import org.telegram.messenger.BotWebViewVibrationEffect;
|
import org.telegram.messenger.BotWebViewVibrationEffect;
|
||||||
import org.telegram.messenger.BuildVars;
|
import org.telegram.messenger.BuildVars;
|
||||||
import org.telegram.messenger.ChatObject;
|
import org.telegram.messenger.ChatObject;
|
||||||
import org.telegram.messenger.CodeHighlighting;
|
|
||||||
import org.telegram.messenger.ContactsController;
|
import org.telegram.messenger.ContactsController;
|
||||||
import org.telegram.messenger.DialogObject;
|
import org.telegram.messenger.DialogObject;
|
||||||
import org.telegram.messenger.Emoji;
|
import org.telegram.messenger.Emoji;
|
||||||
|
@ -126,7 +123,6 @@ import org.telegram.messenger.MediaController;
|
||||||
import org.telegram.messenger.MediaDataController;
|
import org.telegram.messenger.MediaDataController;
|
||||||
import org.telegram.messenger.MessageObject;
|
import org.telegram.messenger.MessageObject;
|
||||||
import org.telegram.messenger.MessagesController;
|
import org.telegram.messenger.MessagesController;
|
||||||
import org.telegram.messenger.MessagesStorage;
|
|
||||||
import org.telegram.messenger.NotificationCenter;
|
import org.telegram.messenger.NotificationCenter;
|
||||||
import org.telegram.messenger.NotificationsController;
|
import org.telegram.messenger.NotificationsController;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
|
@ -137,7 +133,6 @@ import org.telegram.messenger.UserConfig;
|
||||||
import org.telegram.messenger.UserObject;
|
import org.telegram.messenger.UserObject;
|
||||||
import org.telegram.messenger.Utilities;
|
import org.telegram.messenger.Utilities;
|
||||||
import org.telegram.messenger.VideoEditedInfo;
|
import org.telegram.messenger.VideoEditedInfo;
|
||||||
import org.telegram.messenger.XiaomiUtilities;
|
|
||||||
import org.telegram.messenger.browser.Browser;
|
import org.telegram.messenger.browser.Browser;
|
||||||
import org.telegram.messenger.camera.CameraController;
|
import org.telegram.messenger.camera.CameraController;
|
||||||
import org.telegram.tgnet.ConnectionsManager;
|
import org.telegram.tgnet.ConnectionsManager;
|
||||||
|
@ -161,11 +156,13 @@ import org.telegram.ui.ContentPreviewViewer;
|
||||||
import org.telegram.ui.DialogsActivity;
|
import org.telegram.ui.DialogsActivity;
|
||||||
import org.telegram.ui.GroupStickersActivity;
|
import org.telegram.ui.GroupStickersActivity;
|
||||||
import org.telegram.ui.LaunchActivity;
|
import org.telegram.ui.LaunchActivity;
|
||||||
|
import org.telegram.ui.MultiContactsSelectorBottomSheet;
|
||||||
import org.telegram.ui.PhotoViewer;
|
import org.telegram.ui.PhotoViewer;
|
||||||
import org.telegram.ui.PremiumPreviewFragment;
|
import org.telegram.ui.PremiumPreviewFragment;
|
||||||
import org.telegram.ui.ProfileActivity;
|
import org.telegram.ui.ProfileActivity;
|
||||||
import org.telegram.ui.StickersActivity;
|
import org.telegram.ui.StickersActivity;
|
||||||
import org.telegram.ui.TopicsFragment;
|
import org.telegram.ui.Stories.recorder.CaptionContainerView;
|
||||||
|
import org.telegram.ui.Stories.recorder.HintView2;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
@ -199,6 +196,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
private boolean sendButtonEnabled = true;
|
private boolean sendButtonEnabled = true;
|
||||||
private TLRPC.UserFull userInfo;
|
private TLRPC.UserFull userInfo;
|
||||||
|
|
||||||
|
public boolean voiceOnce;
|
||||||
|
public boolean onceVisible;
|
||||||
|
|
||||||
public void drawRecordedPannel(Canvas canvas) {
|
public void drawRecordedPannel(Canvas canvas) {
|
||||||
if (getAlpha() == 0 || recordedAudioPanel == null || recordedAudioPanel.getParent() == null || recordedAudioPanel.getVisibility() != View.VISIBLE) {
|
if (getAlpha() == 0 || recordedAudioPanel == null || recordedAudioPanel.getParent() == null || recordedAudioPanel.getVisibility() != View.VISIBLE) {
|
||||||
return;
|
return;
|
||||||
|
@ -242,7 +242,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
|
|
||||||
void didPressAttachButton();
|
void didPressAttachButton();
|
||||||
|
|
||||||
void needStartRecordVideo(int state, boolean notify, int scheduleDate);
|
void needStartRecordVideo(int state, boolean notify, int scheduleDate, int ttl);
|
||||||
|
|
||||||
void needChangeVideoPreviewState(int state, float seekProgress);
|
void needChangeVideoPreviewState(int state, float seekProgress);
|
||||||
|
|
||||||
|
@ -323,6 +323,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
default void onKeyboardRequested() {
|
default void onKeyboardRequested() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default boolean onceVoiceAvailable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final static int RECORD_STATE_ENTER = 0;
|
public final static int RECORD_STATE_ENTER = 0;
|
||||||
|
@ -527,6 +531,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
private AnimatorSet scheduledButtonAnimation;
|
private AnimatorSet scheduledButtonAnimation;
|
||||||
@Nullable
|
@Nullable
|
||||||
private RecordCircle recordCircle;
|
private RecordCircle recordCircle;
|
||||||
|
private OnceButton onceButton;
|
||||||
private CloseProgressDrawable2 progressDrawable;
|
private CloseProgressDrawable2 progressDrawable;
|
||||||
private Paint dotPaint;
|
private Paint dotPaint;
|
||||||
private MediaActionDrawable playPauseDrawable;
|
private MediaActionDrawable playPauseDrawable;
|
||||||
|
@ -728,7 +733,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (delegate != null) {
|
if (delegate != null) {
|
||||||
delegate.needStartRecordVideo(0, true, 0);
|
delegate.needStartRecordVideo(0, true, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -855,6 +860,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
drawable.beginApplyLayerColors();
|
drawable.beginApplyLayerColors();
|
||||||
drawable.setLayerColor("Cup Red.**", dotColor);
|
drawable.setLayerColor("Cup Red.**", dotColor);
|
||||||
drawable.setLayerColor("Box.**", dotColor);
|
drawable.setLayerColor("Box.**", dotColor);
|
||||||
|
drawable.setLayerColor("Line 1.**", background);
|
||||||
|
drawable.setLayerColor("Line 2.**", background);
|
||||||
|
drawable.setLayerColor("Line 3.**", background);
|
||||||
drawable.commitApplyLayerColors();
|
drawable.commitApplyLayerColors();
|
||||||
if (playPauseDrawable != null) {
|
if (playPauseDrawable != null) {
|
||||||
playPauseDrawable.setColor(getThemedColor(Theme.key_chat_recordedVoicePlayPause));
|
playPauseDrawable.setColor(getThemedColor(Theme.key_chat_recordedVoicePlayPause));
|
||||||
|
@ -1009,9 +1017,147 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public class OnceButton extends FrameLayout {
|
||||||
|
|
||||||
|
private HintView2 hintView;
|
||||||
|
|
||||||
|
private CaptionContainerView.PeriodDrawable periodDrawable;
|
||||||
|
private Paint lockBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
|
|
||||||
|
public OnceButton(Context context) {
|
||||||
|
super(context);
|
||||||
|
|
||||||
|
periodDrawable = new CaptionContainerView.PeriodDrawable();
|
||||||
|
periodDrawable.setCallback(this);
|
||||||
|
periodDrawable.setValue(1, voiceOnce, false);
|
||||||
|
|
||||||
|
setWillNotDraw(false);
|
||||||
|
updateColors();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showHintView() {
|
||||||
|
hideHintView();
|
||||||
|
hintView = new HintView2(getContext(), HintView2.DIRECTION_RIGHT);
|
||||||
|
hintView.setJoint(1, 0);
|
||||||
|
hintView.setMultilineText(true);
|
||||||
|
hintView.setText(AndroidUtilities.replaceTags(LocaleController.getString(voiceOnce ? R.string.VoiceSetOnceHintEnabled : R.string.VoiceSetOnceHint)));
|
||||||
|
hintView.setMaxWidthPx(HintView2.cutInFancyHalf(hintView.getText(), hintView.getTextPaint()));
|
||||||
|
if (voiceOnce) {
|
||||||
|
hintView.setIcon(R.raw.fire_on);
|
||||||
|
} else {
|
||||||
|
MessagesController.getGlobalMainSettings().edit().putInt("voiceoncehint", MessagesController.getGlobalMainSettings().getInt("voiceoncehint", 0) + 1).apply();
|
||||||
|
}
|
||||||
|
addView(hintView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL, 0, 0, 54, 58));
|
||||||
|
final HintView2 thisHintView = hintView;
|
||||||
|
hintView.setOnHiddenListener(() -> {
|
||||||
|
removeView(thisHintView);
|
||||||
|
if (hintView == thisHintView) {
|
||||||
|
hintView = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
hintView.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void hideHintView() {
|
||||||
|
if (hintView != null) {
|
||||||
|
HintView2 oldHintView = hintView;
|
||||||
|
oldHintView.setOnHiddenListener(() -> removeView(oldHintView));
|
||||||
|
oldHintView.hide();
|
||||||
|
hintView = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
super.onMeasure(
|
||||||
|
widthMeasureSpec,
|
||||||
|
MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(194 + 48 + 12), MeasureSpec.EXACTLY)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final RectF rectF = new RectF();
|
||||||
|
public final RectF onceRect = new RectF();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas canvas) {
|
||||||
|
if (recordCircle == null) return;
|
||||||
|
|
||||||
|
int cx = getMeasuredWidth() - AndroidUtilities.dp2(26);
|
||||||
|
|
||||||
|
final float cy = AndroidUtilities.lerp(recordCircle.lockY + recordCircle.translationDy, getMeasuredHeight() - AndroidUtilities.dp(70 + 36), Math.max(recordCircle.exitTransition, Math.min(recordCircle.progressToSeekbarStep1, recordCircle.slideToCancelLockProgress)));
|
||||||
|
rectF.set(cx - AndroidUtilities.dpf2(18), cy, cx + AndroidUtilities.dpf2(18), cy + recordCircle.lockSize);
|
||||||
|
rectF.offset(0, getMeasuredHeight() - recordCircle.getMeasuredHeight());
|
||||||
|
onceVisible = delegate != null && delegate.onceVoiceAvailable() && !isInVideoMode;
|
||||||
|
if (onceVisible) {
|
||||||
|
final float onceOffset = AndroidUtilities.dpf2(AndroidUtilities.lerp(4, 12, recordCircle.moveProgress));
|
||||||
|
rectF.set(
|
||||||
|
rectF.left, rectF.top - AndroidUtilities.dpf2(36) - onceOffset, rectF.right, rectF.top - onceOffset
|
||||||
|
);
|
||||||
|
if (hintView != null) {
|
||||||
|
hintView.setJointPx(0, rectF.centerY());
|
||||||
|
hintView.invalidate();
|
||||||
|
}
|
||||||
|
onceRect.set(rectF);
|
||||||
|
canvas.save();
|
||||||
|
final float s = recordCircle.scale * (1f - recordCircle.exitTransition) * recordCircle.slideToCancelLockProgress * recordCircle.snapAnimationProgress;
|
||||||
|
canvas.scale(s, s, rectF.centerX(), rectF.centerY());
|
||||||
|
lockShadowDrawable.setBounds(
|
||||||
|
(int) (rectF.left - AndroidUtilities.dpf2(3)), (int) (rectF.top - AndroidUtilities.dpf2(3)),
|
||||||
|
(int) (rectF.right + AndroidUtilities.dpf2(3)), (int) (rectF.bottom + AndroidUtilities.dpf2(3))
|
||||||
|
);
|
||||||
|
lockShadowDrawable.draw(canvas);
|
||||||
|
canvas.drawRoundRect(rectF, AndroidUtilities.dpf2(18), AndroidUtilities.dpf2(18), lockBackgroundPaint);
|
||||||
|
periodDrawable.setBounds((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom);
|
||||||
|
periodDrawable.draw(canvas);
|
||||||
|
canvas.restore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateColors() {
|
||||||
|
periodDrawable.updateColors(
|
||||||
|
getThemedColor(Theme.key_chat_messagePanelVoiceLock),
|
||||||
|
getThemedColor(Theme.key_chat_messagePanelVoiceBackground),
|
||||||
|
0xFFFFFFFF
|
||||||
|
);
|
||||||
|
lockBackgroundPaint.setColor(getThemedColor(Theme.key_chat_messagePanelVoiceLockBackground));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean pressed;
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent event) {
|
||||||
|
if (onceVisible && (recordCircle != null && recordCircle.snapAnimationProgress > .1f)) {
|
||||||
|
int x = (int) event.getX();
|
||||||
|
int y = (int) event.getY();
|
||||||
|
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||||
|
return pressed = onceRect.contains(x, y);
|
||||||
|
} else if (pressed) {
|
||||||
|
if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||||
|
if (onceRect.contains(x, y)) {
|
||||||
|
voiceOnce = !voiceOnce;
|
||||||
|
periodDrawable.setValue(1, voiceOnce, true);
|
||||||
|
if (voiceOnce) {
|
||||||
|
showHintView();
|
||||||
|
} else {
|
||||||
|
hideHintView();
|
||||||
|
}
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean verifyDrawable(@NonNull Drawable who) {
|
||||||
|
return who == periodDrawable || super.verifyDrawable(who);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class RecordCircle extends View {
|
public class RecordCircle extends View {
|
||||||
|
|
||||||
private float scale;
|
public float scale;
|
||||||
private float amplitude;
|
private float amplitude;
|
||||||
private float animateToAmplitude;
|
private float animateToAmplitude;
|
||||||
private float animateAmplitudeDiff;
|
private float animateAmplitudeDiff;
|
||||||
|
@ -1023,7 +1169,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
private boolean pressed;
|
private boolean pressed;
|
||||||
private float transformToSeekbar;
|
private float transformToSeekbar;
|
||||||
private float exitTransition;
|
private float exitTransition;
|
||||||
private float progressToSeekbarStep3;
|
public float progressToSeekbarStep3;
|
||||||
private float progressToSendButton;
|
private float progressToSendButton;
|
||||||
|
|
||||||
public float iconScale;
|
public float iconScale;
|
||||||
|
@ -1057,8 +1203,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
|
|
||||||
private int paintAlpha;
|
private int paintAlpha;
|
||||||
private float touchSlop;
|
private float touchSlop;
|
||||||
private float slideToCancelProgress;
|
public float slideToCancelProgress;
|
||||||
private float slideToCancelLockProgress;
|
public float slideToCancelLockProgress;
|
||||||
|
private float progressToSeekbarStep1, progressToSeekbarStep2;
|
||||||
private int slideDelta;
|
private int slideDelta;
|
||||||
private boolean canceledByGesture;
|
private boolean canceledByGesture;
|
||||||
|
|
||||||
|
@ -1225,9 +1372,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
if (event.getAction() == MotionEvent.ACTION_UP) {
|
if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||||
if (pauseRect.contains(x, y)) {
|
if (pauseRect.contains(x, y)) {
|
||||||
if (isInVideoMode()) {
|
if (isInVideoMode()) {
|
||||||
delegate.needStartRecordVideo(3, true, 0);
|
delegate.needStartRecordVideo(3, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
} else {
|
} else {
|
||||||
MediaController.getInstance().stopRecording(2, true, 0);
|
MediaController.getInstance().stopRecording(2, true, 0, voiceOnce);
|
||||||
delegate.needStartRecordAudio(0);
|
delegate.needStartRecordAudio(0);
|
||||||
}
|
}
|
||||||
if (slideText != null) {
|
if (slideText != null) {
|
||||||
|
@ -1270,6 +1417,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
slideDelta = (int) (-distance * (1f - slideToCancelProgress));
|
slideDelta = (int) (-distance * (1f - slideToCancelProgress));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float moveProgress;
|
||||||
|
public float lockY, lockSize;
|
||||||
|
public float translationDy;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDraw(Canvas canvas) {
|
protected void onDraw(Canvas canvas) {
|
||||||
if (skipDraw) {
|
if (skipDraw) {
|
||||||
|
@ -1364,6 +1515,8 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
circleAlpha = Math.max(0, 1f - (exitTransition - 0.6f) / 0.4f);
|
circleAlpha = Math.max(0, 1f - (exitTransition - 0.6f) / 0.4f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.progressToSeekbarStep1 = progressToSeekbarStep1;
|
||||||
|
this.progressToSeekbarStep2 = progressToSeekbarStep2;
|
||||||
|
|
||||||
if (canceledByGesture && slideToCancelProgress > 0.7f) {
|
if (canceledByGesture && slideToCancelProgress > 0.7f) {
|
||||||
circleAlpha *= (1f - (slideToCancelProgress - 0.7f) / 0.3f);
|
circleAlpha *= (1f - (slideToCancelProgress - 0.7f) / 0.3f);
|
||||||
|
@ -1396,7 +1549,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
replaceDrawable.setBounds(cx - replaceDrawable.getIntrinsicWidth() / 2, cy - replaceDrawable.getIntrinsicHeight() / 2, cx + replaceDrawable.getIntrinsicWidth() / 2, cy + replaceDrawable.getIntrinsicHeight() / 2);
|
replaceDrawable.setBounds(cx - replaceDrawable.getIntrinsicWidth() / 2, cy - replaceDrawable.getIntrinsicHeight() / 2, cx + replaceDrawable.getIntrinsicWidth() / 2, cy + replaceDrawable.getIntrinsicHeight() / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
float moveProgress = 1.0f - yAdd / AndroidUtilities.dp(57);
|
float moveProgress = this.moveProgress = 1.0f - yAdd / AndroidUtilities.dp(57);
|
||||||
|
|
||||||
float lockSize;
|
float lockSize;
|
||||||
float lockY;
|
float lockY;
|
||||||
|
@ -1511,8 +1664,8 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isSendButtonVisible()) {
|
if (isSendButtonVisible()) {
|
||||||
lockSize = AndroidUtilities.dp(36);
|
lockSize = this.lockSize = AndroidUtilities.dp(36);
|
||||||
lockY = AndroidUtilities.dp(60) + multilinTooltipOffset + AndroidUtilities.dpf2(30) * (1.0f - sc) - yAdd + AndroidUtilities.dpf2(14f) * moveProgress;
|
lockY = this.lockY = AndroidUtilities.dp(60) + multilinTooltipOffset + AndroidUtilities.dpf2(30) * (1.0f - sc) - yAdd + AndroidUtilities.dpf2(14f) * moveProgress;
|
||||||
|
|
||||||
lockMiddleY = lockY + lockSize / 2f - AndroidUtilities.dpf2(8) + AndroidUtilities.dpf2(2);
|
lockMiddleY = lockY + lockSize / 2f - AndroidUtilities.dpf2(8) + AndroidUtilities.dpf2(2);
|
||||||
lockTopY = lockY + lockSize / 2f - AndroidUtilities.dpf2(16) + AndroidUtilities.dpf2(2);
|
lockTopY = lockY + lockSize / 2f - AndroidUtilities.dpf2(16) + AndroidUtilities.dpf2(2);
|
||||||
|
@ -1522,15 +1675,14 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
|
|
||||||
transformToPauseProgress = moveProgress;
|
transformToPauseProgress = moveProgress;
|
||||||
} else {
|
} else {
|
||||||
lockSize = AndroidUtilities.dp(36) + (int) (AndroidUtilities.dp(14) * moveProgress);
|
lockSize = this.lockSize = AndroidUtilities.dp(36) + (int) (AndroidUtilities.dp(14) * moveProgress);
|
||||||
lockY = AndroidUtilities.dp(60) + multilinTooltipOffset + (int) (AndroidUtilities.dp(30) * (1.0f - sc)) - (int) yAdd + (moveProgress) * idleProgress * -AndroidUtilities.dp(8);
|
lockY = this.lockY = AndroidUtilities.dp(60) + multilinTooltipOffset + (int) (AndroidUtilities.dp(30) * (1.0f - sc)) - (int) yAdd + (moveProgress) * idleProgress * -AndroidUtilities.dp(8);
|
||||||
lockMiddleY = lockY + lockSize / 2f - AndroidUtilities.dpf2(8) + AndroidUtilities.dpf2(2) + AndroidUtilities.dpf2(2) * moveProgress;
|
lockMiddleY = lockY + lockSize / 2f - AndroidUtilities.dpf2(8) + AndroidUtilities.dpf2(2) + AndroidUtilities.dpf2(2) * moveProgress;
|
||||||
lockTopY = lockY + lockSize / 2f - AndroidUtilities.dpf2(16) + AndroidUtilities.dpf2(2) + AndroidUtilities.dpf2(2) * moveProgress;
|
lockTopY = lockY + lockSize / 2f - AndroidUtilities.dpf2(16) + AndroidUtilities.dpf2(2) + AndroidUtilities.dpf2(2) * moveProgress;
|
||||||
lockRotation = 9 * (1f - moveProgress);
|
lockRotation = 9 * (1f - moveProgress);
|
||||||
snapAnimationProgress = 0;
|
snapAnimationProgress = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((showTooltip && System.currentTimeMillis() - showTooltipStartTime > 200) || tooltipAlpha != 0f) {
|
if ((showTooltip && System.currentTimeMillis() - showTooltipStartTime > 200) || tooltipAlpha != 0f) {
|
||||||
if (moveProgress < 0.8f || isSendButtonVisible() || exitTransition != 0 || transformToSeekbar != 0) {
|
if (moveProgress < 0.8f || isSendButtonVisible() || exitTransition != 0 || transformToSeekbar != 0) {
|
||||||
showTooltip = false;
|
showTooltip = false;
|
||||||
|
@ -1623,10 +1775,15 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
}
|
}
|
||||||
|
|
||||||
float maxTranslationDy = AndroidUtilities.dpf2(72);
|
float maxTranslationDy = AndroidUtilities.dpf2(72);
|
||||||
float dy = maxTranslationDy * translation - AndroidUtilities.dpf2(20) * (progressToSeekbarStep1) * (1f - translation) + maxTranslationDy * (1f - slideToCancelLockProgress);
|
float dy = (
|
||||||
|
maxTranslationDy * translation
|
||||||
|
- AndroidUtilities.dpf2(20) * (progressToSeekbarStep1) * (1f - translation)
|
||||||
|
+ maxTranslationDy * (1f - slideToCancelLockProgress)
|
||||||
|
);
|
||||||
if (dy > maxTranslationDy) {
|
if (dy > maxTranslationDy) {
|
||||||
dy = maxTranslationDy;
|
dy = maxTranslationDy;
|
||||||
}
|
}
|
||||||
|
this.translationDy = dy;
|
||||||
canvas.translate(0, dy);
|
canvas.translate(0, dy);
|
||||||
float s = scale * (1f - progressToSeekbarStep2) * (1f - exitProgress2) * slideToCancelLockProgress;
|
float s = scale * (1f - progressToSeekbarStep2) * (1f - exitProgress2) * slideToCancelLockProgress;
|
||||||
canvas.scale(s, s, cx, lockMiddleY);
|
canvas.scale(s, s, cx, lockMiddleY);
|
||||||
|
@ -1689,6 +1846,14 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
drawingCircleRadius = radius;
|
drawingCircleRadius = radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invalidate() {
|
||||||
|
super.invalidate();
|
||||||
|
if (onceButton != null) {
|
||||||
|
onceButton.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void drawIcon(Canvas canvas, int cx, int cy, float alpha) {
|
public void drawIcon(Canvas canvas, int cx, int cy, float alpha) {
|
||||||
Drawable drawable;
|
Drawable drawable;
|
||||||
Drawable replaceDrawable = null;
|
Drawable replaceDrawable = null;
|
||||||
|
@ -2228,12 +2393,12 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
if (!hasRecordVideo || calledRecordRunnable) {
|
if (!hasRecordVideo || calledRecordRunnable) {
|
||||||
startedDraggingX = -1;
|
startedDraggingX = -1;
|
||||||
if (hasRecordVideo && isInVideoMode()) {
|
if (hasRecordVideo && isInVideoMode()) {
|
||||||
delegate.needStartRecordVideo(1, true, 0);
|
delegate.needStartRecordVideo(1, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
} else {
|
} else {
|
||||||
if (recordingAudioVideo && isInScheduleMode()) {
|
if (recordingAudioVideo && isInScheduleMode()) {
|
||||||
AlertsCreator.createScheduleDatePickerDialog(parentActivity, parentFragment.getDialogId(), (notify, scheduleDate) -> MediaController.getInstance().stopRecording(1, notify, scheduleDate), () -> MediaController.getInstance().stopRecording(0, false, 0), resourcesProvider);
|
AlertsCreator.createScheduleDatePickerDialog(parentActivity, parentFragment.getDialogId(), (notify, scheduleDate) -> MediaController.getInstance().stopRecording(1, notify, scheduleDate, false), () -> MediaController.getInstance().stopRecording(0, false, 0, false), resourcesProvider);
|
||||||
}
|
}
|
||||||
MediaController.getInstance().stopRecording(isInScheduleMode() ? 3 : 1, true, 0);
|
MediaController.getInstance().stopRecording(isInScheduleMode() ? 3 : 1, true, 0, voiceOnce);
|
||||||
delegate.needStartRecordAudio(0);
|
delegate.needStartRecordAudio(0);
|
||||||
}
|
}
|
||||||
recordingAudioVideo = false;
|
recordingAudioVideo = false;
|
||||||
|
@ -2267,10 +2432,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
if (recordCircle.slideToCancelProgress < 0.7f) {
|
if (recordCircle.slideToCancelProgress < 0.7f) {
|
||||||
if (hasRecordVideo && isInVideoMode()) {
|
if (hasRecordVideo && isInVideoMode()) {
|
||||||
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
||||||
delegate.needStartRecordVideo(2, true, 0);
|
delegate.needStartRecordVideo(2, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
} else {
|
} else {
|
||||||
delegate.needStartRecordAudio(0);
|
delegate.needStartRecordAudio(0);
|
||||||
MediaController.getInstance().stopRecording(0, false, 0);
|
MediaController.getInstance().stopRecording(0, false, 0, voiceOnce);
|
||||||
}
|
}
|
||||||
recordingAudioVideo = false;
|
recordingAudioVideo = false;
|
||||||
updateRecordInterface(RECORD_STATE_CANCEL_BY_GESTURE);
|
updateRecordInterface(RECORD_STATE_CANCEL_BY_GESTURE);
|
||||||
|
@ -2293,10 +2458,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
if (alpha < 0.45) {
|
if (alpha < 0.45) {
|
||||||
if (hasRecordVideo && isInVideoMode()) {
|
if (hasRecordVideo && isInVideoMode()) {
|
||||||
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
||||||
delegate.needStartRecordVideo(2, true, 0);
|
delegate.needStartRecordVideo(2, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
} else {
|
} else {
|
||||||
delegate.needStartRecordAudio(0);
|
delegate.needStartRecordAudio(0);
|
||||||
MediaController.getInstance().stopRecording(0, false, 0);
|
MediaController.getInstance().stopRecording(0, false, 0, voiceOnce);
|
||||||
}
|
}
|
||||||
recordingAudioVideo = false;
|
recordingAudioVideo = false;
|
||||||
updateRecordInterface(RECORD_STATE_CANCEL_BY_GESTURE);
|
updateRecordInterface(RECORD_STATE_CANCEL_BY_GESTURE);
|
||||||
|
@ -2315,15 +2480,15 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
startedDraggingX = -1;
|
startedDraggingX = -1;
|
||||||
if (hasRecordVideo && isInVideoMode()) {
|
if (hasRecordVideo && isInVideoMode()) {
|
||||||
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
||||||
delegate.needStartRecordVideo(1, true, 0);
|
delegate.needStartRecordVideo(1, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
} else if (!sendVoiceEnabled) {
|
} else if (!sendVoiceEnabled) {
|
||||||
delegate.needShowMediaBanHint();
|
delegate.needShowMediaBanHint();
|
||||||
} else {
|
} else {
|
||||||
if (recordingAudioVideo && isInScheduleMode()) {
|
if (recordingAudioVideo && isInScheduleMode()) {
|
||||||
AlertsCreator.createScheduleDatePickerDialog(parentActivity, parentFragment.getDialogId(), (notify, scheduleDate) -> MediaController.getInstance().stopRecording(1, notify, scheduleDate), () -> MediaController.getInstance().stopRecording(0, false, 0), resourcesProvider);
|
AlertsCreator.createScheduleDatePickerDialog(parentActivity, parentFragment.getDialogId(), (notify, scheduleDate) -> MediaController.getInstance().stopRecording(1, notify, scheduleDate, false), () -> MediaController.getInstance().stopRecording(0, false, 0, false), resourcesProvider);
|
||||||
}
|
}
|
||||||
delegate.needStartRecordAudio(0);
|
delegate.needStartRecordAudio(0);
|
||||||
MediaController.getInstance().stopRecording(isInScheduleMode() ? 3 : 1, true, 0);
|
MediaController.getInstance().stopRecording(isInScheduleMode() ? 3 : 1, true, 0, voiceOnce);
|
||||||
}
|
}
|
||||||
recordingAudioVideo = false;
|
recordingAudioVideo = false;
|
||||||
messageTransitionIsRunning = false;
|
messageTransitionIsRunning = false;
|
||||||
|
@ -2375,10 +2540,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
if (alpha == 0) {
|
if (alpha == 0) {
|
||||||
if (hasRecordVideo && isInVideoMode()) {
|
if (hasRecordVideo && isInVideoMode()) {
|
||||||
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
||||||
delegate.needStartRecordVideo(2, true, 0);
|
delegate.needStartRecordVideo(2, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
} else {
|
} else {
|
||||||
delegate.needStartRecordAudio(0);
|
delegate.needStartRecordAudio(0);
|
||||||
MediaController.getInstance().stopRecording(0, false, 0);
|
MediaController.getInstance().stopRecording(0, false, 0, voiceOnce);
|
||||||
}
|
}
|
||||||
recordingAudioVideo = false;
|
recordingAudioVideo = false;
|
||||||
updateRecordInterface(RECORD_STATE_CANCEL_BY_GESTURE);
|
updateRecordInterface(RECORD_STATE_CANCEL_BY_GESTURE);
|
||||||
|
@ -3096,7 +3261,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
private void resetRecordedState() {
|
private void resetRecordedState() {
|
||||||
if (videoToSendMessageObject != null) {
|
if (videoToSendMessageObject != null) {
|
||||||
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
||||||
delegate.needStartRecordVideo(2, true, 0);
|
delegate.needStartRecordVideo(2, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
} else {
|
} else {
|
||||||
MessageObject playing = MediaController.getInstance().getPlayingMessageObject();
|
MessageObject playing = MediaController.getInstance().getPlayingMessageObject();
|
||||||
if (playing != null && playing == audioToSendMessageObject) {
|
if (playing != null && playing == audioToSendMessageObject) {
|
||||||
|
@ -3471,6 +3636,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createRecordCircle() {
|
private void createRecordCircle() {
|
||||||
|
createOnceButton();
|
||||||
if (recordCircle != null) {
|
if (recordCircle != null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3479,6 +3645,18 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
sizeNotifierLayout.addView(recordCircle, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM));
|
sizeNotifierLayout.addView(recordCircle, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void createOnceButton() {
|
||||||
|
if (onceButton != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (delegate == null || !delegate.onceVoiceAvailable()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
onceButton = new OnceButton(getContext());
|
||||||
|
onceButton.setVisibility(GONE);
|
||||||
|
sizeNotifierLayout.addView(onceButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM));
|
||||||
|
}
|
||||||
|
|
||||||
private void showRestrictedHint() {
|
private void showRestrictedHint() {
|
||||||
if (DialogObject.isChatDialog(dialog_id)) {
|
if (DialogObject.isChatDialog(dialog_id)) {
|
||||||
TLRPC.Chat chat = accountInstance.getMessagesController().getChat(-dialog_id);
|
TLRPC.Chat chat = accountInstance.getMessagesController().getChat(-dialog_id);
|
||||||
|
@ -4570,7 +4748,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
}
|
}
|
||||||
checkBotMenu();
|
checkBotMenu();
|
||||||
|
|
||||||
if (editingCaption && !captionLimitBulletinShown && !MessagesController.getInstance(currentAccount).premiumLocked && !UserConfig.getInstance(currentAccount).isPremium() && codePointCount > MessagesController.getInstance(currentAccount).captionLengthLimitDefault && codePointCount < MessagesController.getInstance(currentAccount).captionLengthLimitPremium) {
|
if (editingCaption && !captionLimitBulletinShown && !MessagesController.getInstance(currentAccount).premiumFeaturesBlocked() && !UserConfig.getInstance(currentAccount).isPremium() && codePointCount > MessagesController.getInstance(currentAccount).captionLengthLimitDefault && codePointCount < MessagesController.getInstance(currentAccount).captionLengthLimitPremium) {
|
||||||
captionLimitBulletinShown = true;
|
captionLimitBulletinShown = true;
|
||||||
if (heightShouldBeChanged) {
|
if (heightShouldBeChanged) {
|
||||||
AndroidUtilities.runOnUIThread(()->showCaptionLimitBulletin(), 300);
|
AndroidUtilities.runOnUIThread(()->showCaptionLimitBulletin(), 300);
|
||||||
|
@ -4641,10 +4819,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
public void cancelRecordingAudioVideo() {
|
public void cancelRecordingAudioVideo() {
|
||||||
if (hasRecordVideo && isInVideoMode()) {
|
if (hasRecordVideo && isInVideoMode()) {
|
||||||
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
||||||
delegate.needStartRecordVideo(5, true, 0);
|
delegate.needStartRecordVideo(5, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
} else {
|
} else {
|
||||||
delegate.needStartRecordAudio(0);
|
delegate.needStartRecordAudio(0);
|
||||||
MediaController.getInstance().stopRecording(0, false, 0);
|
MediaController.getInstance().stopRecording(0, false, 0, voiceOnce);
|
||||||
}
|
}
|
||||||
recordingAudioVideo = false;
|
recordingAudioVideo = false;
|
||||||
updateRecordInterface(RECORD_STATE_CANCEL);
|
updateRecordInterface(RECORD_STATE_CANCEL);
|
||||||
|
@ -5498,20 +5676,24 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
updateEmojiButtonParams();
|
updateEmojiButtonParams();
|
||||||
|
|
||||||
recordPannelAnimation = new AnimatorSet();
|
recordPannelAnimation = new AnimatorSet();
|
||||||
recordPannelAnimation.playTogether(
|
ArrayList<Animator> animators = new ArrayList<>();
|
||||||
ObjectAnimator.ofFloat(emojiButton, EMOJI_BUTTON_ALPHA, emojiButtonRestricted ? 0.5f : 1.0f),
|
animators.add(ObjectAnimator.ofFloat(emojiButton, EMOJI_BUTTON_ALPHA, emojiButtonRestricted ? 0.5f : 1.0f));
|
||||||
ObjectAnimator.ofFloat(emojiButton, EMOJI_BUTTON_SCALE, 1.0f),
|
animators.add(ObjectAnimator.ofFloat(emojiButton, EMOJI_BUTTON_SCALE, 1.0f));
|
||||||
ObjectAnimator.ofFloat(recordDeleteImageView, View.ALPHA, 0.0f),
|
animators.add(ObjectAnimator.ofFloat(recordDeleteImageView, View.ALPHA, 0.0f));
|
||||||
ObjectAnimator.ofFloat(recordDeleteImageView, View.SCALE_X, 0.0f),
|
animators.add(ObjectAnimator.ofFloat(recordDeleteImageView, View.SCALE_X, 0.0f));
|
||||||
ObjectAnimator.ofFloat(recordDeleteImageView, View.SCALE_Y, 0.0f),
|
animators.add(ObjectAnimator.ofFloat(recordDeleteImageView, View.SCALE_Y, 0.0f));
|
||||||
|
|
||||||
ObjectAnimator.ofFloat(recordedAudioPanel, View.ALPHA, 0.0f),
|
animators.add(ObjectAnimator.ofFloat(recordedAudioPanel, View.ALPHA, 0.0f));
|
||||||
ObjectAnimator.ofFloat(attachButton, View.ALPHA, 1.0f),
|
animators.add(ObjectAnimator.ofFloat(attachButton, View.ALPHA, 1.0f));
|
||||||
ObjectAnimator.ofFloat(attachButton, View.SCALE_X, 1.0f),
|
animators.add(ObjectAnimator.ofFloat(attachButton, View.SCALE_X, 1.0f));
|
||||||
ObjectAnimator.ofFloat(attachButton, View.SCALE_Y, 1.0f),
|
animators.add(ObjectAnimator.ofFloat(attachButton, View.SCALE_Y, 1.0f));
|
||||||
ObjectAnimator.ofFloat(messageEditText, View.ALPHA, 1f),
|
animators.add(ObjectAnimator.ofFloat(messageEditText, View.ALPHA, 1f));
|
||||||
ObjectAnimator.ofFloat(messageEditText, MESSAGE_TEXT_TRANSLATION_X, 0)
|
animators.add(ObjectAnimator.ofFloat(messageEditText, MESSAGE_TEXT_TRANSLATION_X, 0));
|
||||||
);
|
if (onceButton != null) {
|
||||||
|
animators.add(ObjectAnimator.ofFloat(onceButton, View.ALPHA, 0));
|
||||||
|
onceButton.hideHintView();
|
||||||
|
}
|
||||||
|
recordPannelAnimation.playTogether(animators);
|
||||||
|
|
||||||
if (botCommandsMenuButton != null) {
|
if (botCommandsMenuButton != null) {
|
||||||
botCommandsMenuButton.setAlpha(0f);
|
botCommandsMenuButton.setAlpha(0f);
|
||||||
|
@ -5544,12 +5726,16 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
}
|
}
|
||||||
AnimatorSet exitAnimation = new AnimatorSet();
|
AnimatorSet exitAnimation = new AnimatorSet();
|
||||||
|
|
||||||
|
ArrayList<Animator> animators = new ArrayList<>();
|
||||||
if (isInVideoMode()) {
|
if (isInVideoMode()) {
|
||||||
exitAnimation.playTogether(
|
animators.add(ObjectAnimator.ofFloat(videoTimelineView, View.ALPHA, 0.0f));
|
||||||
ObjectAnimator.ofFloat(videoTimelineView, View.ALPHA, 0.0f),
|
animators.add(ObjectAnimator.ofFloat(videoTimelineView, View.TRANSLATION_X, -AndroidUtilities.dp(20)));
|
||||||
ObjectAnimator.ofFloat(videoTimelineView, View.TRANSLATION_X, -AndroidUtilities.dp(20)),
|
animators.add(ObjectAnimator.ofFloat(messageEditText, MESSAGE_TEXT_TRANSLATION_X, 0));
|
||||||
ObjectAnimator.ofFloat(messageEditText, MESSAGE_TEXT_TRANSLATION_X, 0)
|
if (onceButton != null) {
|
||||||
);
|
animators.add(ObjectAnimator.ofFloat(onceButton, View.ALPHA, 0.0f));
|
||||||
|
onceButton.hideHintView();
|
||||||
|
}
|
||||||
|
exitAnimation.playTogether(animators);
|
||||||
if (emojiButtonPaddingAlpha == 1f) {
|
if (emojiButtonPaddingAlpha == 1f) {
|
||||||
exitAnimation.playTogether(ObjectAnimator.ofFloat(messageEditText, View.ALPHA, 1f));
|
exitAnimation.playTogether(ObjectAnimator.ofFloat(messageEditText, View.ALPHA, 1f));
|
||||||
} else {
|
} else {
|
||||||
|
@ -5571,16 +5757,19 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
messageEditTextAniamtor.setDuration(200);
|
messageEditTextAniamtor.setDuration(200);
|
||||||
exitAnimation.playTogether(messageEditTextAniamtor);
|
exitAnimation.playTogether(messageEditTextAniamtor);
|
||||||
}
|
}
|
||||||
exitAnimation.playTogether(
|
animators.add(ObjectAnimator.ofFloat(recordedAudioSeekBar, View.ALPHA, 0.0f));
|
||||||
ObjectAnimator.ofFloat(recordedAudioSeekBar, View.ALPHA, 0.0f),
|
animators.add(ObjectAnimator.ofFloat(recordedAudioPlayButton, View.ALPHA, 0.0f));
|
||||||
ObjectAnimator.ofFloat(recordedAudioPlayButton, View.ALPHA, 0.0f),
|
animators.add(ObjectAnimator.ofFloat(recordedAudioBackground, View.ALPHA, 0.0f));
|
||||||
ObjectAnimator.ofFloat(recordedAudioBackground, View.ALPHA, 0.0f),
|
animators.add(ObjectAnimator.ofFloat(recordedAudioTimeTextView, View.ALPHA, 0.0f));
|
||||||
ObjectAnimator.ofFloat(recordedAudioTimeTextView, View.ALPHA, 0.0f),
|
animators.add(ObjectAnimator.ofFloat(recordedAudioSeekBar, View.TRANSLATION_X, -AndroidUtilities.dp(20)));
|
||||||
ObjectAnimator.ofFloat(recordedAudioSeekBar, View.TRANSLATION_X, -AndroidUtilities.dp(20)),
|
animators.add(ObjectAnimator.ofFloat(recordedAudioPlayButton, View.TRANSLATION_X, -AndroidUtilities.dp(20)));
|
||||||
ObjectAnimator.ofFloat(recordedAudioPlayButton, View.TRANSLATION_X, -AndroidUtilities.dp(20)),
|
animators.add(ObjectAnimator.ofFloat(recordedAudioBackground, View.TRANSLATION_X, -AndroidUtilities.dp(20)));
|
||||||
ObjectAnimator.ofFloat(recordedAudioBackground, View.TRANSLATION_X, -AndroidUtilities.dp(20)),
|
animators.add(ObjectAnimator.ofFloat(recordedAudioTimeTextView, View.TRANSLATION_X, -AndroidUtilities.dp(20)));
|
||||||
ObjectAnimator.ofFloat(recordedAudioTimeTextView, View.TRANSLATION_X, -AndroidUtilities.dp(20))
|
if (onceButton != null) {
|
||||||
);
|
animators.add(ObjectAnimator.ofFloat(onceButton, View.ALPHA, 0));
|
||||||
|
onceButton.hideHintView();
|
||||||
|
}
|
||||||
|
exitAnimation.playTogether(animators);
|
||||||
}
|
}
|
||||||
exitAnimation.setDuration(200);
|
exitAnimation.setDuration(200);
|
||||||
|
|
||||||
|
@ -5655,6 +5844,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
if (recordPannelAnimation != null) {
|
if (recordPannelAnimation != null) {
|
||||||
recordPannelAnimation.start();
|
recordPannelAnimation.start();
|
||||||
}
|
}
|
||||||
|
if (onceButton != null) {
|
||||||
|
onceButton.invalidate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void hideRecordedAudioPanelInternal() {
|
private void hideRecordedAudioPanelInternal() {
|
||||||
|
@ -5738,7 +5930,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (videoToSendMessageObject != null) {
|
if (videoToSendMessageObject != null) {
|
||||||
delegate.needStartRecordVideo(4, notify, scheduleDate);
|
delegate.needStartRecordVideo(4, notify, scheduleDate, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
hideRecordedAudioPanel(true);
|
hideRecordedAudioPanel(true);
|
||||||
checkSendButton(true);
|
checkSendButton(true);
|
||||||
return;
|
return;
|
||||||
|
@ -5747,7 +5939,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
if (playing != null && playing == audioToSendMessageObject) {
|
if (playing != null && playing == audioToSendMessageObject) {
|
||||||
MediaController.getInstance().cleanupPlayer(true, true);
|
MediaController.getInstance().cleanupPlayer(true, true);
|
||||||
}
|
}
|
||||||
SendMessagesHelper.SendMessageParams params = SendMessagesHelper.SendMessageParams.of(audioToSend, null, audioToSendPath, dialog_id, replyingMessageObject, getThreadMessage(), null, null, null, null, notify, scheduleDate, 0, null, null, false);
|
SendMessagesHelper.SendMessageParams params = SendMessagesHelper.SendMessageParams.of(audioToSend, null, audioToSendPath, dialog_id, replyingMessageObject, getThreadMessage(), null, null, null, null, notify, scheduleDate, voiceOnce ? 0x7FFFFFFF : 0, null, null, false);
|
||||||
applyStoryToSendMessageParams(params);
|
applyStoryToSendMessageParams(params);
|
||||||
SendMessagesHelper.getInstance(currentAccount).sendMessage(params);
|
SendMessagesHelper.getInstance(currentAccount).sendMessage(params);
|
||||||
if (delegate != null) {
|
if (delegate != null) {
|
||||||
|
@ -5921,7 +6113,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MessagesController.getInstance(currentAccount).premiumLocked && MessagesController.getInstance(currentAccount).captionLengthLimitPremium > codePointCount) {
|
if (!MessagesController.getInstance(currentAccount).premiumFeaturesBlocked() && MessagesController.getInstance(currentAccount).captionLengthLimitPremium > codePointCount) {
|
||||||
showCaptionLimitBulletin();
|
showCaptionLimitBulletin();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -6916,6 +7108,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
if (recordInterfaceState == 1) {
|
if (recordInterfaceState == 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
voiceOnce = false;
|
||||||
|
if (onceButton != null) {
|
||||||
|
onceButton.periodDrawable.setValue(1, false, false);
|
||||||
|
}
|
||||||
createRecordAudioPanel();
|
createRecordAudioPanel();
|
||||||
recordInterfaceState = 1;
|
recordInterfaceState = 1;
|
||||||
if (emojiView != null) {
|
if (emojiView != null) {
|
||||||
|
@ -6954,6 +7150,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
recordCircle.setVisibility(VISIBLE);
|
recordCircle.setVisibility(VISIBLE);
|
||||||
recordCircle.setAmplitude(0);
|
recordCircle.setAmplitude(0);
|
||||||
}
|
}
|
||||||
|
if (onceButton != null) {
|
||||||
|
onceButton.setVisibility(delegate != null && delegate.onceVoiceAvailable() ? VISIBLE : GONE);
|
||||||
|
}
|
||||||
if (recordDot != null) {
|
if (recordDot != null) {
|
||||||
recordDot.resetAlpha();
|
recordDot.resetAlpha();
|
||||||
|
|
||||||
|
@ -6987,6 +7186,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
ObjectAnimator.ofFloat(slideText, View.TRANSLATION_X, 0),
|
ObjectAnimator.ofFloat(slideText, View.TRANSLATION_X, 0),
|
||||||
ObjectAnimator.ofFloat(slideText, View.ALPHA, 1)
|
ObjectAnimator.ofFloat(slideText, View.ALPHA, 1)
|
||||||
);
|
);
|
||||||
|
if (onceButton != null) {
|
||||||
|
iconChanges.playTogether(ObjectAnimator.ofFloat(onceButton, View.ALPHA, 1));
|
||||||
|
}
|
||||||
if (audioVideoSendButton != null) {
|
if (audioVideoSendButton != null) {
|
||||||
iconChanges.playTogether(ObjectAnimator.ofFloat(audioVideoSendButton, View.ALPHA, 0));
|
iconChanges.playTogether(ObjectAnimator.ofFloat(audioVideoSendButton, View.ALPHA, 0));
|
||||||
}
|
}
|
||||||
|
@ -7103,6 +7305,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
ObjectAnimator.ofFloat(messageEditText, MESSAGE_TEXT_TRANSLATION_X, 0),
|
ObjectAnimator.ofFloat(messageEditText, MESSAGE_TEXT_TRANSLATION_X, 0),
|
||||||
ObjectAnimator.ofFloat(recordCircle, "slideToCancelProgress", 1f)
|
ObjectAnimator.ofFloat(recordCircle, "slideToCancelProgress", 1f)
|
||||||
);
|
);
|
||||||
|
if (onceButton != null) {
|
||||||
|
runningAnimationAudio.playTogether(ObjectAnimator.ofFloat(onceButton, View.ALPHA, 0));
|
||||||
|
onceButton.hideHintView();
|
||||||
|
}
|
||||||
if (botCommandsMenuButton != null) {
|
if (botCommandsMenuButton != null) {
|
||||||
runningAnimationAudio.playTogether(
|
runningAnimationAudio.playTogether(
|
||||||
ObjectAnimator.ofFloat(botCommandsMenuButton, View.SCALE_Y, 1),
|
ObjectAnimator.ofFloat(botCommandsMenuButton, View.SCALE_Y, 1),
|
||||||
|
@ -7319,6 +7525,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
botCommandsMenuButton.setScaleX(0f);
|
botCommandsMenuButton.setScaleX(0f);
|
||||||
botCommandsMenuButton.setScaleY(0f);
|
botCommandsMenuButton.setScaleY(0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (onceButton != null && onceVisible && MessagesController.getGlobalMainSettings().getInt("voiceoncehint", 0) < 3) {
|
||||||
|
onceButton.showHintView();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -7334,6 +7544,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
ObjectAnimator.ofFloat(recordDot, View.SCALE_Y, 0),
|
ObjectAnimator.ofFloat(recordDot, View.SCALE_Y, 0),
|
||||||
ObjectAnimator.ofFloat(recordDot, View.SCALE_X, 0)
|
ObjectAnimator.ofFloat(recordDot, View.SCALE_X, 0)
|
||||||
);
|
);
|
||||||
|
if (onceButton != null) {
|
||||||
|
iconsAnimator.playTogether(ObjectAnimator.ofFloat(onceButton, View.ALPHA, 0));
|
||||||
|
onceButton.hideHintView();
|
||||||
|
}
|
||||||
|
|
||||||
if (botCommandsMenuButton != null) {
|
if (botCommandsMenuButton != null) {
|
||||||
iconsAnimator.playTogether(
|
iconsAnimator.playTogether(
|
||||||
|
@ -7481,6 +7695,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
ObjectAnimator.ofFloat(recordDot, View.SCALE_X, 0),
|
ObjectAnimator.ofFloat(recordDot, View.SCALE_X, 0),
|
||||||
ObjectAnimator.ofFloat(audioVideoButtonContainer, View.ALPHA, 1.0f)
|
ObjectAnimator.ofFloat(audioVideoButtonContainer, View.ALPHA, 1.0f)
|
||||||
);
|
);
|
||||||
|
if (onceButton != null) {
|
||||||
|
iconsAnimator.playTogether(ObjectAnimator.ofFloat(onceButton, View.ALPHA, 0));
|
||||||
|
onceButton.hideHintView();
|
||||||
|
}
|
||||||
if (botCommandsMenuButton != null) {
|
if (botCommandsMenuButton != null) {
|
||||||
iconsAnimator.playTogether(
|
iconsAnimator.playTogether(
|
||||||
ObjectAnimator.ofFloat(botCommandsMenuButton, View.SCALE_Y, 1),
|
ObjectAnimator.ofFloat(botCommandsMenuButton, View.SCALE_Y, 1),
|
||||||
|
@ -8164,7 +8382,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateGiftButton(boolean animated) {
|
public void updateGiftButton(boolean animated) {
|
||||||
boolean visible = !MessagesController.getInstance(currentAccount).premiumLocked && MessagesController.getInstance(currentAccount).giftAttachMenuIcon &&
|
boolean visible = !MessagesController.getInstance(currentAccount).premiumFeaturesBlocked() && MessagesController.getInstance(currentAccount).giftAttachMenuIcon &&
|
||||||
MessagesController.getInstance(currentAccount).giftTextFieldIcon && getParentFragment() != null && getParentFragment().getCurrentUser() != null &&
|
MessagesController.getInstance(currentAccount).giftTextFieldIcon && getParentFragment() != null && getParentFragment().getCurrentUser() != null &&
|
||||||
!BuildVars.IS_BILLING_UNAVAILABLE && !getParentFragment().getCurrentUser().self && !getParentFragment().getCurrentUser().premium &&
|
!BuildVars.IS_BILLING_UNAVAILABLE && !getParentFragment().getCurrentUser().self && !getParentFragment().getCurrentUser().premium &&
|
||||||
getParentFragment().getCurrentUserInfo() != null && !getParentFragment().getCurrentUserInfo().premium_gifts.isEmpty() && !isInScheduleMode() &&
|
getParentFragment().getCurrentUserInfo() != null && !getParentFragment().getCurrentUserInfo().premium_gifts.isEmpty() && !isInScheduleMode() &&
|
||||||
|
@ -8759,6 +8977,21 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
} else if (button instanceof TLRPC.TL_keyboardButtonRequestPeer) {
|
} else if (button instanceof TLRPC.TL_keyboardButtonRequestPeer) {
|
||||||
TLRPC.TL_keyboardButtonRequestPeer btn = (TLRPC.TL_keyboardButtonRequestPeer) button;
|
TLRPC.TL_keyboardButtonRequestPeer btn = (TLRPC.TL_keyboardButtonRequestPeer) button;
|
||||||
if (btn.peer_type != null && messageObject != null && messageObject.messageOwner != null) {
|
if (btn.peer_type != null && messageObject != null && messageObject.messageOwner != null) {
|
||||||
|
if (btn.peer_type instanceof TLRPC.TL_requestPeerTypeUser && btn.max_quantity > 1) {
|
||||||
|
MultiContactsSelectorBottomSheet.open(btn.max_quantity, ids -> {
|
||||||
|
if (ids != null && !ids.isEmpty()) {
|
||||||
|
TLRPC.TL_messages_sendBotRequestedPeer req = new TLRPC.TL_messages_sendBotRequestedPeer();
|
||||||
|
req.peer = MessagesController.getInstance(currentAccount).getInputPeer(messageObject.messageOwner.peer_id);
|
||||||
|
req.msg_id = messageObject.getId();
|
||||||
|
req.button_id = btn.button_id;
|
||||||
|
for (Long id : ids) {
|
||||||
|
req.requested_peers.add(MessagesController.getInstance(currentAccount).getInputPeer(id));
|
||||||
|
}
|
||||||
|
ConnectionsManager.getInstance(currentAccount).sendRequest(req, null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putBoolean("onlySelect", true);
|
args.putBoolean("onlySelect", true);
|
||||||
args.putInt("dialogsType", DialogsActivity.DIALOGS_TYPE_BOT_REQUEST_PEER);
|
args.putInt("dialogsType", DialogsActivity.DIALOGS_TYPE_BOT_REQUEST_PEER);
|
||||||
|
@ -8774,20 +9007,17 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
DialogsActivity fragment = new DialogsActivity(args);
|
DialogsActivity fragment = new DialogsActivity(args);
|
||||||
fragment.setDelegate(new DialogsActivity.DialogsActivityDelegate() {
|
fragment.setDelegate((dialogFragment, dids, message, param, topicsFragment) -> {
|
||||||
@Override
|
|
||||||
public boolean didSelectDialogs(DialogsActivity fragment, ArrayList<MessagesStorage.TopicKey> dids, CharSequence message, boolean param, TopicsFragment topicsFragment) {
|
|
||||||
if (dids != null && !dids.isEmpty()) {
|
if (dids != null && !dids.isEmpty()) {
|
||||||
TLRPC.TL_messages_sendBotRequestedPeer req = new TLRPC.TL_messages_sendBotRequestedPeer();
|
TLRPC.TL_messages_sendBotRequestedPeer req = new TLRPC.TL_messages_sendBotRequestedPeer();
|
||||||
req.peer = MessagesController.getInstance(currentAccount).getInputPeer(messageObject.messageOwner.peer_id);
|
req.peer = MessagesController.getInstance(currentAccount).getInputPeer(messageObject.messageOwner.peer_id);
|
||||||
req.msg_id = messageObject.getId();
|
req.msg_id = messageObject.getId();
|
||||||
req.button_id = btn.button_id;
|
req.button_id = btn.button_id;
|
||||||
req.requested_peer = MessagesController.getInstance(currentAccount).getInputPeer(dids.get(0).dialogId);
|
req.requested_peers.add(MessagesController.getInstance(currentAccount).getInputPeer(dids.get(0).dialogId));
|
||||||
ConnectionsManager.getInstance(currentAccount).sendRequest(req, null);
|
ConnectionsManager.getInstance(currentAccount).sendRequest(req, null);
|
||||||
}
|
}
|
||||||
fragment.finishFragment();
|
dialogFragment.finishFragment();
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
parentFragment.presentFragment(fragment);
|
parentFragment.presentFragment(fragment);
|
||||||
return false;
|
return false;
|
||||||
|
@ -10553,10 +10783,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
public void onCancelButtonPressed() {
|
public void onCancelButtonPressed() {
|
||||||
if (hasRecordVideo && isInVideoMode()) {
|
if (hasRecordVideo && isInVideoMode()) {
|
||||||
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
CameraController.getInstance().cancelOnInitRunnable(onFinishInitCameraRunnable);
|
||||||
delegate.needStartRecordVideo(5, true, 0);
|
delegate.needStartRecordVideo(5, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
} else {
|
} else {
|
||||||
delegate.needStartRecordAudio(0);
|
delegate.needStartRecordAudio(0);
|
||||||
MediaController.getInstance().stopRecording(0, false, 0);
|
MediaController.getInstance().stopRecording(0, false, 0, voiceOnce);
|
||||||
}
|
}
|
||||||
recordingAudioVideo = false;
|
recordingAudioVideo = false;
|
||||||
updateRecordInterface(RECORD_STATE_CANCEL);
|
updateRecordInterface(RECORD_STATE_CANCEL);
|
||||||
|
@ -10814,7 +11044,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific
|
||||||
if (isInVideoMode()) {
|
if (isInVideoMode()) {
|
||||||
if (t >= 59500 && !stoppedInternal) {
|
if (t >= 59500 && !stoppedInternal) {
|
||||||
startedDraggingX = -1;
|
startedDraggingX = -1;
|
||||||
delegate.needStartRecordVideo(3, true, 0);
|
delegate.needStartRecordVideo(3, true, 0, voiceOnce ? 0x7FFFFFFF : 0);
|
||||||
stoppedInternal = true;
|
stoppedInternal = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2557,7 +2557,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N
|
||||||
sendButtonColorAnimator.setDuration(150).start();
|
sendButtonColorAnimator.setDuration(150).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (!captionLimitBulletinShown && !MessagesController.getInstance(currentAccount).premiumLocked && !UserConfig.getInstance(currentAccount).isPremium() && codepointCount > MessagesController.getInstance(currentAccount).captionLengthLimitDefault && codepointCount < MessagesController.getInstance(currentAccount).captionLengthLimitPremium) {
|
// if (!captionLimitBulletinShown && !MessagesController.getInstance(currentAccount).premiumFeaturesBlocked() && !UserConfig.getInstance(currentAccount).isPremium() && codepointCount > MessagesController.getInstance(currentAccount).captionLengthLimitDefault && codepointCount < MessagesController.getInstance(currentAccount).captionLengthLimitPremium) {
|
||||||
// captionLimitBulletinShown = true;
|
// captionLimitBulletinShown = true;
|
||||||
// showCaptionLimitBulletin(parentFragment);
|
// showCaptionLimitBulletin(parentFragment);
|
||||||
// }
|
// }
|
||||||
|
@ -2623,7 +2623,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MessagesController.getInstance(currentAccount).premiumLocked && MessagesController.getInstance(currentAccount).captionLengthLimitPremium > codepointCount) {
|
if (!MessagesController.getInstance(currentAccount).premiumFeaturesBlocked() && MessagesController.getInstance(currentAccount).captionLengthLimitPremium > codepointCount) {
|
||||||
showCaptionLimitBulletin(parentFragment);
|
showCaptionLimitBulletin(parentFragment);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -33,6 +33,7 @@ import androidx.core.content.ContextCompat;
|
||||||
import org.telegram.messenger.AndroidUtilities;
|
import org.telegram.messenger.AndroidUtilities;
|
||||||
import org.telegram.messenger.ApplicationLoader;
|
import org.telegram.messenger.ApplicationLoader;
|
||||||
import org.telegram.messenger.ChatObject;
|
import org.telegram.messenger.ChatObject;
|
||||||
|
import org.telegram.messenger.DialogObject;
|
||||||
import org.telegram.messenger.Emoji;
|
import org.telegram.messenger.Emoji;
|
||||||
import org.telegram.messenger.FileLog;
|
import org.telegram.messenger.FileLog;
|
||||||
import org.telegram.messenger.ImageLoader;
|
import org.telegram.messenger.ImageLoader;
|
||||||
|
@ -487,6 +488,7 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent
|
||||||
titleTextLargerCopyView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
titleTextLargerCopyView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
||||||
titleTextLargerCopyView.setLeftDrawableTopPadding(-AndroidUtilities.dp(1.3f));
|
titleTextLargerCopyView.setLeftDrawableTopPadding(-AndroidUtilities.dp(1.3f));
|
||||||
titleTextLargerCopyView.setRightDrawable(titleTextView.getRightDrawable());
|
titleTextLargerCopyView.setRightDrawable(titleTextView.getRightDrawable());
|
||||||
|
titleTextLargerCopyView.setRightDrawable2(titleTextView.getRightDrawable2());
|
||||||
titleTextLargerCopyView.setRightDrawableOutside(titleTextView.getRightDrawableOutside());
|
titleTextLargerCopyView.setRightDrawableOutside(titleTextView.getRightDrawableOutside());
|
||||||
titleTextLargerCopyView.setLeftDrawable(titleTextView.getLeftDrawable());
|
titleTextLargerCopyView.setLeftDrawable(titleTextView.getLeftDrawable());
|
||||||
titleTextLargerCopyView.setText(titleTextView.getText());
|
titleTextLargerCopyView.setText(titleTextView.getText());
|
||||||
|
@ -618,16 +620,17 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent
|
||||||
|
|
||||||
private boolean rightDrawableIsScamOrVerified = false;
|
private boolean rightDrawableIsScamOrVerified = false;
|
||||||
private String rightDrawableContentDescription = null;
|
private String rightDrawableContentDescription = null;
|
||||||
|
private String rightDrawable2ContentDescription = null;
|
||||||
|
|
||||||
public void setTitleIcons(Drawable leftIcon, Drawable mutedIcon) {
|
public void setTitleIcons(Drawable leftIcon, Drawable mutedIcon) {
|
||||||
titleTextView.setLeftDrawable(leftIcon);
|
titleTextView.setLeftDrawable(leftIcon);
|
||||||
if (!rightDrawableIsScamOrVerified) {
|
if (!rightDrawableIsScamOrVerified) {
|
||||||
if (mutedIcon != null) {
|
if (mutedIcon != null) {
|
||||||
rightDrawableContentDescription = LocaleController.getString("NotificationsMuted", R.string.NotificationsMuted);
|
rightDrawable2ContentDescription = LocaleController.getString("NotificationsMuted", R.string.NotificationsMuted);
|
||||||
} else {
|
} else {
|
||||||
rightDrawableContentDescription = null;
|
rightDrawable2ContentDescription = null;
|
||||||
}
|
}
|
||||||
titleTextView.setRightDrawable(mutedIcon);
|
titleTextView.setRightDrawable2(mutedIcon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -644,9 +647,9 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent
|
||||||
if (!(titleTextView.getRightDrawable() instanceof ScamDrawable)) {
|
if (!(titleTextView.getRightDrawable() instanceof ScamDrawable)) {
|
||||||
ScamDrawable drawable = new ScamDrawable(11, scam ? 0 : 1);
|
ScamDrawable drawable = new ScamDrawable(11, scam ? 0 : 1);
|
||||||
drawable.setColor(getThemedColor(Theme.key_actionBarDefaultSubtitle));
|
drawable.setColor(getThemedColor(Theme.key_actionBarDefaultSubtitle));
|
||||||
titleTextView.setRightDrawable(drawable);
|
titleTextView.setRightDrawable2(drawable);
|
||||||
// titleTextView.setRightPadding(0);
|
// titleTextView.setRightPadding(0);
|
||||||
rightDrawableContentDescription = LocaleController.getString("ScamMessage", R.string.ScamMessage);
|
rightDrawable2ContentDescription = LocaleController.getString("ScamMessage", R.string.ScamMessage);
|
||||||
rightDrawableIsScamOrVerified = true;
|
rightDrawableIsScamOrVerified = true;
|
||||||
}
|
}
|
||||||
} else if (verified) {
|
} else if (verified) {
|
||||||
|
@ -655,37 +658,34 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent
|
||||||
Drawable verifiedCheck = getResources().getDrawable(R.drawable.verified_check).mutate();
|
Drawable verifiedCheck = getResources().getDrawable(R.drawable.verified_check).mutate();
|
||||||
verifiedCheck.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_profile_verifiedCheck), PorterDuff.Mode.MULTIPLY));
|
verifiedCheck.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_profile_verifiedCheck), PorterDuff.Mode.MULTIPLY));
|
||||||
Drawable verifiedDrawable = new CombinedDrawable(verifiedBackground, verifiedCheck);
|
Drawable verifiedDrawable = new CombinedDrawable(verifiedBackground, verifiedCheck);
|
||||||
titleTextView.setRightDrawable(verifiedDrawable);
|
titleTextView.setRightDrawable2(verifiedDrawable);
|
||||||
// titleTextView.setRightPadding(titleTextView.getPaddingRight());
|
|
||||||
rightDrawableIsScamOrVerified = true;
|
rightDrawableIsScamOrVerified = true;
|
||||||
rightDrawableContentDescription = LocaleController.getString("AccDescrVerified", R.string.AccDescrVerified);
|
rightDrawable2ContentDescription = LocaleController.getString("AccDescrVerified", R.string.AccDescrVerified);
|
||||||
} else if (premium) {
|
} else if (titleTextView.getRightDrawable() instanceof ScamDrawable) {
|
||||||
boolean isStatus = emojiStatus instanceof TLRPC.TL_emojiStatus || emojiStatus instanceof TLRPC.TL_emojiStatusUntil && ((TLRPC.TL_emojiStatusUntil) emojiStatus).until > (int) (System.currentTimeMillis() / 1000);
|
titleTextView.setRightDrawable2(null);
|
||||||
// if (premiumIconHiddable) {
|
rightDrawableIsScamOrVerified = false;
|
||||||
// titleTextView.setCanHideRightDrawable(!isStatus);
|
rightDrawable2ContentDescription = null;
|
||||||
// }
|
}
|
||||||
|
if (premium || DialogObject.getEmojiStatusDocumentId(emojiStatus) != 0) {
|
||||||
if (titleTextView.getRightDrawable() instanceof AnimatedEmojiDrawable.WrapSizeDrawable &&
|
if (titleTextView.getRightDrawable() instanceof AnimatedEmojiDrawable.WrapSizeDrawable &&
|
||||||
((AnimatedEmojiDrawable.WrapSizeDrawable) titleTextView.getRightDrawable()).getDrawable() instanceof AnimatedEmojiDrawable) {
|
((AnimatedEmojiDrawable.WrapSizeDrawable) titleTextView.getRightDrawable()).getDrawable() instanceof AnimatedEmojiDrawable) {
|
||||||
((AnimatedEmojiDrawable) ((AnimatedEmojiDrawable.WrapSizeDrawable) titleTextView.getRightDrawable()).getDrawable()).removeView(titleTextView);
|
((AnimatedEmojiDrawable) ((AnimatedEmojiDrawable.WrapSizeDrawable) titleTextView.getRightDrawable()).getDrawable()).removeView(titleTextView);
|
||||||
}
|
}
|
||||||
if (emojiStatus instanceof TLRPC.TL_emojiStatus) {
|
if (DialogObject.getEmojiStatusDocumentId(emojiStatus) != 0) {
|
||||||
emojiStatusDrawable.set(((TLRPC.TL_emojiStatus) emojiStatus).document_id, animated);
|
emojiStatusDrawable.set(DialogObject.getEmojiStatusDocumentId(emojiStatus), animated);
|
||||||
} else if (emojiStatus instanceof TLRPC.TL_emojiStatusUntil && ((TLRPC.TL_emojiStatusUntil) emojiStatus).until > (int) (System.currentTimeMillis() / 1000)) {
|
} else if (premium) {
|
||||||
emojiStatusDrawable.set(((TLRPC.TL_emojiStatusUntil) emojiStatus).document_id, animated);
|
|
||||||
} else {
|
|
||||||
Drawable drawable = ContextCompat.getDrawable(ApplicationLoader.applicationContext, R.drawable.msg_premium_liststar).mutate();
|
Drawable drawable = ContextCompat.getDrawable(ApplicationLoader.applicationContext, R.drawable.msg_premium_liststar).mutate();
|
||||||
drawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_profile_verifiedBackground), PorterDuff.Mode.MULTIPLY));
|
drawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_profile_verifiedBackground), PorterDuff.Mode.MULTIPLY));
|
||||||
emojiStatusDrawable.set(drawable, animated);
|
emojiStatusDrawable.set(drawable, animated);
|
||||||
|
} else {
|
||||||
|
emojiStatusDrawable.set((Drawable) null, animated);
|
||||||
}
|
}
|
||||||
emojiStatusDrawable.setColor(getThemedColor(Theme.key_profile_verifiedBackground));
|
emojiStatusDrawable.setColor(getThemedColor(Theme.key_profile_verifiedBackground));
|
||||||
titleTextView.setRightDrawable(emojiStatusDrawable);
|
titleTextView.setRightDrawable(emojiStatusDrawable);
|
||||||
// titleTextView.setRightPadding(titleTextView.getPaddingRight());
|
|
||||||
rightDrawableIsScamOrVerified = true;
|
|
||||||
rightDrawableContentDescription = LocaleController.getString("AccDescrPremium", R.string.AccDescrPremium);
|
|
||||||
} else if (titleTextView.getRightDrawable() instanceof ScamDrawable) {
|
|
||||||
titleTextView.setRightDrawable(null);
|
|
||||||
// titleTextView.setRightPadding(0);
|
|
||||||
rightDrawableIsScamOrVerified = false;
|
rightDrawableIsScamOrVerified = false;
|
||||||
|
rightDrawableContentDescription = LocaleController.getString("AccDescrPremium", R.string.AccDescrPremium);
|
||||||
|
} else {
|
||||||
|
titleTextView.setRightDrawable(null);
|
||||||
rightDrawableContentDescription = null;
|
rightDrawableContentDescription = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1146,6 +1146,10 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent
|
||||||
sb.append(", ");
|
sb.append(", ");
|
||||||
sb.append(rightDrawableContentDescription);
|
sb.append(rightDrawableContentDescription);
|
||||||
}
|
}
|
||||||
|
if (rightDrawable2ContentDescription != null) {
|
||||||
|
sb.append(", ");
|
||||||
|
sb.append(rightDrawable2ContentDescription);
|
||||||
|
}
|
||||||
sb.append("\n");
|
sb.append("\n");
|
||||||
sb.append(subtitleTextView.getText());
|
sb.append(subtitleTextView.getText());
|
||||||
info.setContentDescription(sb);
|
info.setContentDescription(sb);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package org.telegram.ui.Components;
|
package org.telegram.ui.Components;
|
||||||
|
|
||||||
|
import static org.telegram.messenger.AndroidUtilities.dp;
|
||||||
|
|
||||||
import android.animation.Animator;
|
import android.animation.Animator;
|
||||||
import android.animation.AnimatorListenerAdapter;
|
import android.animation.AnimatorListenerAdapter;
|
||||||
import android.animation.ValueAnimator;
|
import android.animation.ValueAnimator;
|
||||||
|
@ -20,6 +22,8 @@ import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.text.SpannableStringBuilder;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
|
@ -51,10 +55,12 @@ import org.telegram.messenger.MediaDataController;
|
||||||
import org.telegram.messenger.NotificationCenter;
|
import org.telegram.messenger.NotificationCenter;
|
||||||
import org.telegram.messenger.R;
|
import org.telegram.messenger.R;
|
||||||
import org.telegram.messenger.SharedConfig;
|
import org.telegram.messenger.SharedConfig;
|
||||||
|
import org.telegram.messenger.UserObject;
|
||||||
import org.telegram.messenger.Utilities;
|
import org.telegram.messenger.Utilities;
|
||||||
import org.telegram.tgnet.ConnectionsManager;
|
import org.telegram.tgnet.ConnectionsManager;
|
||||||
import org.telegram.tgnet.ResultCallback;
|
import org.telegram.tgnet.ResultCallback;
|
||||||
import org.telegram.tgnet.TLRPC;
|
import org.telegram.tgnet.TLRPC;
|
||||||
|
import org.telegram.tgnet.tl.TL_stories;
|
||||||
import org.telegram.ui.ActionBar.AlertDialog;
|
import org.telegram.ui.ActionBar.AlertDialog;
|
||||||
import org.telegram.ui.ActionBar.BackDrawable;
|
import org.telegram.ui.ActionBar.BackDrawable;
|
||||||
import org.telegram.ui.ActionBar.BaseFragment;
|
import org.telegram.ui.ActionBar.BaseFragment;
|
||||||
|
@ -66,7 +72,9 @@ import org.telegram.ui.ActionBar.ThemeDescription;
|
||||||
import org.telegram.ui.Cells.DrawerProfileCell;
|
import org.telegram.ui.Cells.DrawerProfileCell;
|
||||||
import org.telegram.ui.Cells.ThemesHorizontalListCell;
|
import org.telegram.ui.Cells.ThemesHorizontalListCell;
|
||||||
import org.telegram.ui.ChatActivity;
|
import org.telegram.ui.ChatActivity;
|
||||||
|
import org.telegram.ui.Components.Premium.LimitReachedBottomSheet;
|
||||||
import org.telegram.ui.PhotoViewer;
|
import org.telegram.ui.PhotoViewer;
|
||||||
|
import org.telegram.ui.StatisticActivity;
|
||||||
import org.telegram.ui.ThemePreviewActivity;
|
import org.telegram.ui.ThemePreviewActivity;
|
||||||
import org.telegram.ui.WallpapersListActivity;
|
import org.telegram.ui.WallpapersListActivity;
|
||||||
|
|
||||||
|
@ -101,6 +109,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
private final LinearSmoothScroller scroller;
|
private final LinearSmoothScroller scroller;
|
||||||
private final View applyButton;
|
private final View applyButton;
|
||||||
private AnimatedTextView applyTextView;
|
private AnimatedTextView applyTextView;
|
||||||
|
private AnimatedTextView applySubTextView;
|
||||||
private TextView chooseBackgroundTextView;
|
private TextView chooseBackgroundTextView;
|
||||||
private ChatThemeItem selectedItem;
|
private ChatThemeItem selectedItem;
|
||||||
private boolean forceDark;
|
private boolean forceDark;
|
||||||
|
@ -113,7 +122,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
HintView hintView;
|
HintView hintView;
|
||||||
private boolean dataLoaded;
|
private boolean dataLoaded;
|
||||||
private EmojiThemes currentTheme;
|
private EmojiThemes currentTheme;
|
||||||
ThemePreviewActivity overlayFragment;
|
BaseFragment overlayFragment;
|
||||||
public ChatAttachAlert chatAttachAlert;
|
public ChatAttachAlert chatAttachAlert;
|
||||||
private FrameLayout chatAttachButton;
|
private FrameLayout chatAttachButton;
|
||||||
private AnimatedTextView chatAttachButtonText;
|
private AnimatedTextView chatAttachButtonText;
|
||||||
|
@ -150,10 +159,10 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
titleView.setTextColor(getThemedColor(Theme.key_dialogTextBlack));
|
titleView.setTextColor(getThemedColor(Theme.key_dialogTextBlack));
|
||||||
titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
|
titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
|
||||||
titleView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
titleView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
||||||
titleView.setPadding(AndroidUtilities.dp(12), AndroidUtilities.dp(6), AndroidUtilities.dp(12), AndroidUtilities.dp(8));
|
titleView.setPadding(dp(12), dp(6), dp(12), dp(8));
|
||||||
|
|
||||||
backButtonView = new ImageView(getContext());
|
backButtonView = new ImageView(getContext());
|
||||||
int padding = AndroidUtilities.dp(10);
|
int padding = dp(10);
|
||||||
backButtonView.setPadding(padding, padding, padding, padding);
|
backButtonView.setPadding(padding, padding, padding, padding);
|
||||||
backButtonDrawable = new BackDrawable(false);
|
backButtonDrawable = new BackDrawable(false);
|
||||||
backButtonView.setImageDrawable(backButtonDrawable);
|
backButtonView.setImageDrawable(backButtonDrawable);
|
||||||
|
@ -169,7 +178,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
rootLayout.addView(titleView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.START, 44, 0, 62, 0));
|
rootLayout.addView(titleView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.START, 44, 0, 62, 0));
|
||||||
|
|
||||||
int drawableColor = getThemedColor(Theme.key_featuredStickers_addButton);
|
int drawableColor = getThemedColor(Theme.key_featuredStickers_addButton);
|
||||||
int drawableSize = AndroidUtilities.dp(28);
|
int drawableSize = dp(28);
|
||||||
darkThemeDrawable = new RLottieDrawable(R.raw.sun_outline, "" + R.raw.sun_outline, drawableSize, drawableSize, false, null);
|
darkThemeDrawable = new RLottieDrawable(R.raw.sun_outline, "" + R.raw.sun_outline, drawableSize, drawableSize, false, null);
|
||||||
forceDark = !Theme.getActiveTheme().isDark();
|
forceDark = !Theme.getActiveTheme().isDark();
|
||||||
setForceDark(Theme.getActiveTheme().isDark(), false);
|
setForceDark(Theme.getActiveTheme().isDark(), false);
|
||||||
|
@ -213,7 +222,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
recyclerView.setItemAnimator(null);
|
recyclerView.setItemAnimator(null);
|
||||||
recyclerView.setNestedScrollingEnabled(false);
|
recyclerView.setNestedScrollingEnabled(false);
|
||||||
recyclerView.setLayoutManager(layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
|
recyclerView.setLayoutManager(layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
|
||||||
recyclerView.setPadding(AndroidUtilities.dp(12), 0, AndroidUtilities.dp(12), 0);
|
recyclerView.setPadding(dp(12), 0, dp(12), 0);
|
||||||
recyclerView.setOnItemClickListener((view, position) -> {
|
recyclerView.setOnItemClickListener((view, position) -> {
|
||||||
if (adapter.items.get(position) == selectedItem || changeDayNightView != null) {
|
if (adapter.items.get(position) == selectedItem || changeDayNightView != null) {
|
||||||
return;
|
return;
|
||||||
|
@ -255,7 +264,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
rootLayout.addView(recyclerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 104, Gravity.START, 0, 44, 0, 0));
|
rootLayout.addView(recyclerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 104, Gravity.START, 0, 44, 0, 0));
|
||||||
|
|
||||||
applyButton = new View(getContext());
|
applyButton = new View(getContext());
|
||||||
applyButton.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), getThemedColor(Theme.key_featuredStickers_addButton), getThemedColor(Theme.key_featuredStickers_addButtonPressed)));
|
applyButton.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(6), getThemedColor(Theme.key_featuredStickers_addButton), getThemedColor(Theme.key_featuredStickers_addButtonPressed)));
|
||||||
applyButton.setOnClickListener((view) -> applySelectedTheme());
|
applyButton.setOnClickListener((view) -> applySelectedTheme());
|
||||||
rootLayout.addView(applyButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.START, 16, 162, 16, 16));
|
rootLayout.addView(applyButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.START, 16, 162, 16, 16));
|
||||||
|
|
||||||
|
@ -284,10 +293,19 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
applyTextView.adaptWidth = false;
|
applyTextView.adaptWidth = false;
|
||||||
applyTextView.setGravity(Gravity.CENTER);
|
applyTextView.setGravity(Gravity.CENTER);
|
||||||
applyTextView.setTextColor(getThemedColor(Theme.key_featuredStickers_buttonText));
|
applyTextView.setTextColor(getThemedColor(Theme.key_featuredStickers_buttonText));
|
||||||
applyTextView.setTextSize(AndroidUtilities.dp(15));
|
applyTextView.setTextSize(dp(15));
|
||||||
applyTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
applyTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
|
||||||
rootLayout.addView(applyTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.START, 16, 162, 16, 16));
|
rootLayout.addView(applyTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.START, 16, 162, 16, 16));
|
||||||
|
|
||||||
|
applySubTextView = new AnimatedTextView(getContext(), true, true, true);
|
||||||
|
applySubTextView.getDrawable().setEllipsizeByGradient(true);
|
||||||
|
applySubTextView.adaptWidth = false;
|
||||||
|
applySubTextView.setGravity(Gravity.CENTER);
|
||||||
|
applySubTextView.setTextColor(getThemedColor(Theme.key_featuredStickers_buttonText));
|
||||||
|
applySubTextView.setTextSize(dp(12));
|
||||||
|
applySubTextView.setAlpha(0f);
|
||||||
|
applySubTextView.setTranslationY(dp(11));
|
||||||
|
rootLayout.addView(applySubTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.START, 16, 162, 16, 16));
|
||||||
|
|
||||||
if (currentWallpaper != null) {
|
if (currentWallpaper != null) {
|
||||||
cancelOrResetTextView = new TextView(getContext());
|
cancelOrResetTextView = new TextView(getContext());
|
||||||
|
@ -315,7 +333,13 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
themeHintTextView.setGravity(Gravity.CENTER);
|
themeHintTextView.setGravity(Gravity.CENTER);
|
||||||
themeHintTextView.setLines(1);
|
themeHintTextView.setLines(1);
|
||||||
themeHintTextView.setSingleLine(true);
|
themeHintTextView.setSingleLine(true);
|
||||||
themeHintTextView.setText(LocaleController.formatString("ChatThemeApplyHint", R.string.ChatThemeApplyHint, chatActivity.getCurrentUser().first_name));
|
String name = "";
|
||||||
|
if (chatActivity.getCurrentUser() != null) {
|
||||||
|
name = UserObject.getFirstName(chatActivity.getCurrentUser());
|
||||||
|
} else if (chatActivity.getCurrentChat() != null) {
|
||||||
|
name = chatActivity.getCurrentChat().title;
|
||||||
|
}
|
||||||
|
themeHintTextView.setText(LocaleController.formatString("ChatThemeApplyHint", R.string.ChatThemeApplyHint, name));
|
||||||
themeHintTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
|
themeHintTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
|
||||||
rootLayout.addView(themeHintTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.START, 16, 214, 16, 12));
|
rootLayout.addView(themeHintTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.START, 16, 214, 16, 12));
|
||||||
}
|
}
|
||||||
|
@ -326,11 +350,11 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
private void updateButtonColors() {
|
private void updateButtonColors() {
|
||||||
if (themeHintTextView != null) {
|
if (themeHintTextView != null) {
|
||||||
themeHintTextView.setTextColor(getThemedColor(Theme.key_dialogTextGray));
|
themeHintTextView.setTextColor(getThemedColor(Theme.key_dialogTextGray));
|
||||||
themeHintTextView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Color.TRANSPARENT, ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), (int) (0.3f * 255))));
|
themeHintTextView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(6), Color.TRANSPARENT, ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), (int) (0.3f * 255))));
|
||||||
}
|
}
|
||||||
if (cancelOrResetTextView != null) {
|
if (cancelOrResetTextView != null) {
|
||||||
cancelOrResetTextView.setTextColor(getThemedColor(Theme.key_text_RedRegular));
|
cancelOrResetTextView.setTextColor(getThemedColor(Theme.key_text_RedRegular));
|
||||||
cancelOrResetTextView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Color.TRANSPARENT, ColorUtils.setAlphaComponent(getThemedColor(Theme.key_text_RedRegular), (int) (0.3f * 255))));
|
cancelOrResetTextView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(6), Color.TRANSPARENT, ColorUtils.setAlphaComponent(getThemedColor(Theme.key_text_RedRegular), (int) (0.3f * 255))));
|
||||||
}
|
}
|
||||||
backButtonView.setBackground(Theme.createSelectorDrawable(ColorUtils.setAlphaComponent(getThemedColor(Theme.key_dialogTextBlack), 30), 1));
|
backButtonView.setBackground(Theme.createSelectorDrawable(ColorUtils.setAlphaComponent(getThemedColor(Theme.key_dialogTextBlack), 30), 1));
|
||||||
backButtonDrawable.setColor(getThemedColor(Theme.key_dialogTextBlack));
|
backButtonDrawable.setColor(getThemedColor(Theme.key_dialogTextBlack));
|
||||||
|
@ -339,7 +363,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
|
|
||||||
darkThemeView.setBackground(Theme.createSelectorDrawable(ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), 30), 1));
|
darkThemeView.setBackground(Theme.createSelectorDrawable(ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), 30), 1));
|
||||||
chooseBackgroundTextView.setTextColor(getThemedColor(Theme.key_dialogTextBlue));
|
chooseBackgroundTextView.setTextColor(getThemedColor(Theme.key_dialogTextBlue));
|
||||||
chooseBackgroundTextView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Color.TRANSPARENT, ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), (int) (0.3f * 255))));
|
chooseBackgroundTextView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(6), Color.TRANSPARENT, ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), (int) (0.3f * 255))));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +381,12 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ColoredImageSpan lockSpan;
|
||||||
private void updateState(boolean animated) {
|
private void updateState(boolean animated) {
|
||||||
|
TLRPC.Chat chat = chatActivity.getCurrentChat();
|
||||||
|
if (chat != null) {
|
||||||
|
checkBoostsLevel();
|
||||||
|
}
|
||||||
if (!dataLoaded) {
|
if (!dataLoaded) {
|
||||||
backButtonDrawable.setRotation(1f, animated);
|
backButtonDrawable.setRotation(1f, animated);
|
||||||
applyButton.setEnabled(false);
|
applyButton.setEnabled(false);
|
||||||
|
@ -365,6 +394,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(cancelOrResetTextView, false, 0.9f, false, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(cancelOrResetTextView, false, 0.9f, false, animated);
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(applyButton, false, 1f, false, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(applyButton, false, 1f, false, animated);
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(applyTextView, false, 0.9f, false, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(applyTextView, false, 0.9f, false, animated);
|
||||||
|
AndroidUtilities.updateViewVisibilityAnimated(applySubTextView, false, 0.9f, false, animated);
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(themeHintTextView, false, 0.9f, false, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(themeHintTextView, false, 0.9f, false, animated);
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(progressView, true, 1f, true, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(progressView, true, 1f, true, animated);
|
||||||
} else {
|
} else {
|
||||||
|
@ -372,16 +402,30 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
if (hasChanges()) {
|
if (hasChanges()) {
|
||||||
backButtonDrawable.setRotation(0, animated);
|
backButtonDrawable.setRotation(0, animated);
|
||||||
applyButton.setEnabled(true);
|
applyButton.setEnabled(true);
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(chooseBackgroundTextView, false, 0.9f, false, animated);
|
boolean showSubText = false;
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(cancelOrResetTextView, false, 0.9f, false, animated);
|
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(applyButton, true, 1f, false, animated);
|
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(applyTextView, true, 0.9f, false, animated);
|
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(themeHintTextView, true, 0.9f, false, animated);
|
|
||||||
if (selectedItem != null && selectedItem.chatTheme != null && selectedItem.chatTheme.showAsDefaultStub && selectedItem.chatTheme.wallpaper == null) {
|
if (selectedItem != null && selectedItem.chatTheme != null && selectedItem.chatTheme.showAsDefaultStub && selectedItem.chatTheme.wallpaper == null) {
|
||||||
applyTextView.setText(LocaleController.getString("ChatResetTheme", R.string.ChatResetTheme));
|
applyTextView.setText(LocaleController.getString("ChatResetTheme", R.string.ChatResetTheme));
|
||||||
} else {
|
} else {
|
||||||
applyTextView.setText(LocaleController.getString("ChatApplyTheme", R.string.ChatApplyTheme));
|
applyTextView.setText(LocaleController.getString("ChatApplyTheme", R.string.ChatApplyTheme));
|
||||||
|
if (chat != null && boostsStatus != null && boostsStatus.level < chatActivity.getMessagesController().channelWallpaperLevelMin) {
|
||||||
|
showSubText = true;
|
||||||
|
SpannableStringBuilder text = new SpannableStringBuilder("l");
|
||||||
|
if (lockSpan == null) {
|
||||||
|
lockSpan = new ColoredImageSpan(R.drawable.mini_switch_lock);
|
||||||
|
lockSpan.setTopOffset(1);
|
||||||
}
|
}
|
||||||
|
text.setSpan(lockSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
text.append(" ").append(LocaleController.formatPluralString("ReactionLevelRequiredBtn", chatActivity.getMessagesController().channelWallpaperLevelMin));
|
||||||
|
applySubTextView.setText(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateApplySubTextTranslation(showSubText, animated && applyTextView.getAlpha() > .8f);
|
||||||
|
AndroidUtilities.updateViewVisibilityAnimated(chooseBackgroundTextView, false, 0.9f, false, animated);
|
||||||
|
AndroidUtilities.updateViewVisibilityAnimated(cancelOrResetTextView, false, 0.9f, false, animated);
|
||||||
|
AndroidUtilities.updateViewVisibilityAnimated(applyButton, true, 1f, false, animated);
|
||||||
|
AndroidUtilities.updateViewVisibilityAnimated(applyTextView, true, 0.9f, false, animated);
|
||||||
|
AndroidUtilities.updateViewVisibilityAnimated(applySubTextView, showSubText, 0.9f, false, 0.7f, animated);
|
||||||
|
AndroidUtilities.updateViewVisibilityAnimated(themeHintTextView, true, 0.9f, false, animated);
|
||||||
} else {
|
} else {
|
||||||
backButtonDrawable.setRotation(1f, animated);
|
backButtonDrawable.setRotation(1f, animated);
|
||||||
applyButton.setEnabled(false);
|
applyButton.setEnabled(false);
|
||||||
|
@ -389,11 +433,54 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(cancelOrResetTextView, true, 0.9f, false, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(cancelOrResetTextView, true, 0.9f, false, animated);
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(applyButton, false, 1f, false, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(applyButton, false, 1f, false, animated);
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(applyTextView, false, 0.9f, false, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(applyTextView, false, 0.9f, false, animated);
|
||||||
|
AndroidUtilities.updateViewVisibilityAnimated(applySubTextView, false, 0.9f, false, animated);
|
||||||
AndroidUtilities.updateViewVisibilityAnimated(themeHintTextView, false, 0.9f, false, animated);
|
AndroidUtilities.updateViewVisibilityAnimated(themeHintTextView, false, 0.9f, false, animated);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean checkingBoostsLevel = false, checkedBoostsLevel = false;
|
||||||
|
private TL_stories.TL_premium_boostsStatus boostsStatus;
|
||||||
|
private void checkBoostsLevel() {
|
||||||
|
if (chatActivity == null || checkingBoostsLevel || checkedBoostsLevel || boostsStatus != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
checkingBoostsLevel = true;
|
||||||
|
chatActivity.getMessagesController().getBoostsController().getBoostsStats(chatActivity.getDialogId(), boostsStatus -> {
|
||||||
|
this.boostsStatus = boostsStatus;
|
||||||
|
checkedBoostsLevel = true;
|
||||||
|
updateState(true);
|
||||||
|
checkingBoostsLevel = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private float subTextTranslation = 0;
|
||||||
|
private ValueAnimator subTextTranslationAnimator;
|
||||||
|
private void updateApplySubTextTranslation(boolean subtextShown, boolean animated) {
|
||||||
|
if (subTextTranslationAnimator != null) {
|
||||||
|
subTextTranslationAnimator.cancel();
|
||||||
|
subTextTranslationAnimator = null;
|
||||||
|
}
|
||||||
|
if (animated) {
|
||||||
|
subTextTranslationAnimator = ValueAnimator.ofFloat(subTextTranslation, subtextShown ? 1 : 0);
|
||||||
|
subTextTranslationAnimator.addUpdateListener(anm -> {
|
||||||
|
subTextTranslation = (float) anm.getAnimatedValue();
|
||||||
|
applyTextView.setTranslationY(-dp(7) * subTextTranslation);
|
||||||
|
});
|
||||||
|
subTextTranslationAnimator.addListener(new AnimatorListenerAdapter() {
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(Animator animation) {
|
||||||
|
subTextTranslation = subtextShown ? 1 : 0;
|
||||||
|
applyTextView.setTranslationY(-dp(7) * subTextTranslation);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
subTextTranslationAnimator.start();
|
||||||
|
} else {
|
||||||
|
subTextTranslation = subtextShown ? 1 : 0;
|
||||||
|
applyTextView.setTranslationY(-dp(7) * subTextTranslation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
@ -433,7 +520,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
hintView = new HintView(getContext(), 9, chatActivity.getResourceProvider());
|
hintView = new HintView(getContext(), 9, chatActivity.getResourceProvider());
|
||||||
hintView.setVisibility(View.INVISIBLE);
|
hintView.setVisibility(View.INVISIBLE);
|
||||||
hintView.setShowingDuration(5000);
|
hintView.setShowingDuration(5000);
|
||||||
hintView.setBottomOffset(-AndroidUtilities.dp(8));
|
hintView.setBottomOffset(-dp(8));
|
||||||
if (forceDark) {
|
if (forceDark) {
|
||||||
hintView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("ChatThemeDaySwitchTooltip", R.string.ChatThemeDaySwitchTooltip)));
|
hintView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("ChatThemeDaySwitchTooltip", R.string.ChatThemeDaySwitchTooltip)));
|
||||||
} else {
|
} else {
|
||||||
|
@ -538,7 +625,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
}
|
}
|
||||||
updateButtonColors();
|
updateButtonColors();
|
||||||
if (chatAttachButton != null) {
|
if (chatAttachButton != null) {
|
||||||
chatAttachButton.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(0), getThemedColor(Theme.key_windowBackgroundWhite), ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), (int) (0.3f * 255))));
|
chatAttachButton.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(0), getThemedColor(Theme.key_windowBackgroundWhite), ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), (int) (0.3f * 255))));
|
||||||
}
|
}
|
||||||
if (chatAttachButtonText != null) {
|
if (chatAttachButtonText != null) {
|
||||||
chatAttachButtonText.setTextColor(getThemedColor(Theme.key_featuredStickers_addButton));
|
chatAttachButtonText.setTextColor(getThemedColor(Theme.key_featuredStickers_addButton));
|
||||||
|
@ -550,8 +637,8 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
ArrayList<ThemeDescription> themeDescriptions = new ArrayList<>();
|
ArrayList<ThemeDescription> themeDescriptions = new ArrayList<>();
|
||||||
if (chatActivity.forceDisallowRedrawThemeDescriptions && overlayFragment != null) {
|
if (chatActivity.forceDisallowRedrawThemeDescriptions && overlayFragment instanceof ThemePreviewActivity) {
|
||||||
themeDescriptions.addAll(overlayFragment.getThemeDescriptionsInternal());
|
themeDescriptions.addAll(((ThemePreviewActivity) overlayFragment).getThemeDescriptionsInternal());
|
||||||
return themeDescriptions;
|
return themeDescriptions;
|
||||||
}
|
}
|
||||||
if (chatAttachAlert != null) {
|
if (chatAttachAlert != null) {
|
||||||
|
@ -833,6 +920,35 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applySelectedTheme() {
|
private void applySelectedTheme() {
|
||||||
|
if (checkingBoostsLevel) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (boostsStatus != null && boostsStatus.level < chatActivity.getMessagesController().channelWallpaperLevelMin) {
|
||||||
|
chatActivity.getMessagesController().getBoostsController().userCanBoostChannel(chatActivity.getDialogId(), boostsStatus, canApplyBoost -> {
|
||||||
|
if (getContext() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LimitReachedBottomSheet limitReachedBottomSheet = new LimitReachedBottomSheet(chatActivity, getContext(), LimitReachedBottomSheet.TYPE_BOOSTS_FOR_WALLPAPER, currentAccount, resourcesProvider);
|
||||||
|
limitReachedBottomSheet.setCanApplyBoost(canApplyBoost);
|
||||||
|
limitReachedBottomSheet.setBoostsStats(boostsStatus, true);
|
||||||
|
limitReachedBottomSheet.setDialogId(chatActivity.getDialogId());
|
||||||
|
limitReachedBottomSheet.showStatisticButtonInLink(() -> {
|
||||||
|
TLRPC.Chat chat = chatActivity.getMessagesController().getChat(-chatActivity.getDialogId());
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putLong("chat_id", -chatActivity.getDialogId());
|
||||||
|
args.putBoolean("is_megagroup", chat.megagroup);
|
||||||
|
args.putBoolean("start_from_boosts", true);
|
||||||
|
TLRPC.ChatFull chatInfo = chatActivity.getMessagesController().getChatFull(-chatActivity.getDialogId());
|
||||||
|
if (chatInfo == null || !chatInfo.can_view_stats) {
|
||||||
|
args.putBoolean("only_boosts", true);
|
||||||
|
};
|
||||||
|
StatisticActivity fragment = new StatisticActivity(args);
|
||||||
|
showAsSheet(fragment);
|
||||||
|
});
|
||||||
|
limitReachedBottomSheet.show();
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
Bulletin bulletin = null;
|
Bulletin bulletin = null;
|
||||||
EmojiThemes newTheme = selectedItem.chatTheme;
|
EmojiThemes newTheme = selectedItem.chatTheme;
|
||||||
if (selectedItem != null && newTheme != currentTheme) {
|
if (selectedItem != null && newTheme != currentTheme) {
|
||||||
|
@ -1124,6 +1240,147 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void openGalleryForBackground(
|
||||||
|
Activity activity,
|
||||||
|
BaseFragment fragment,
|
||||||
|
long dialogId,
|
||||||
|
Theme.ResourcesProvider resourcesProvider,
|
||||||
|
Utilities.Callback<TLRPC.WallPaper> onSet,
|
||||||
|
ThemePreviewActivity.DayNightSwitchDelegate toggleTheme,
|
||||||
|
TL_stories.TL_premium_boostsStatus cachedBoostsStatus
|
||||||
|
) {
|
||||||
|
ChatAttachAlert chatAttachAlert = new ChatAttachAlert(activity, fragment, false, false, false, resourcesProvider);
|
||||||
|
chatAttachAlert.drawNavigationBar = true;
|
||||||
|
chatAttachAlert.setupPhotoPicker(LocaleController.getString("ChooseBackground", R.string.ChooseBackground));
|
||||||
|
chatAttachAlert.setDelegate(new ChatAttachAlert.ChatAttachViewDelegate() {
|
||||||
|
long start;
|
||||||
|
@Override
|
||||||
|
public boolean selectItemOnClicking() {
|
||||||
|
start = System.currentTimeMillis();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void didPressedButton(int button, boolean arg, boolean notify, int scheduleDate, boolean forceDocument) {
|
||||||
|
try {
|
||||||
|
HashMap<Object, Object> photos = chatAttachAlert.getPhotoLayout().getSelectedPhotos();
|
||||||
|
if (!photos.isEmpty()) {
|
||||||
|
MediaController.PhotoEntry entry = (MediaController.PhotoEntry) photos.values().iterator().next();
|
||||||
|
String path;
|
||||||
|
if (entry.imagePath != null) {
|
||||||
|
path = entry.imagePath;
|
||||||
|
} else {
|
||||||
|
path = entry.path;
|
||||||
|
}
|
||||||
|
if (path != null) {
|
||||||
|
File currentWallpaperPath = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), Utilities.random.nextInt() + ".jpg");
|
||||||
|
Point screenSize = AndroidUtilities.getRealScreenSize();
|
||||||
|
Bitmap bitmap = ImageLoader.loadBitmap(path, null, screenSize.x, screenSize.y, true);
|
||||||
|
FileOutputStream stream = new FileOutputStream(currentWallpaperPath);
|
||||||
|
bitmap.compress(Bitmap.CompressFormat.JPEG, 87, stream);
|
||||||
|
|
||||||
|
ThemePreviewActivity themePreviewActivity = new ThemePreviewActivity(new WallpapersListActivity.FileWallpaper("", currentWallpaperPath, currentWallpaperPath), bitmap) {
|
||||||
|
@Override
|
||||||
|
public boolean insideBottomSheet() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
themePreviewActivity.boostsStatus = cachedBoostsStatus;
|
||||||
|
themePreviewActivity.setResourceProvider(resourcesProvider);
|
||||||
|
themePreviewActivity.setOnSwitchDayNightDelegate(toggleTheme);
|
||||||
|
themePreviewActivity.setInitialModes(false, false, .20f);
|
||||||
|
themePreviewActivity.setDialogId(dialogId);
|
||||||
|
themePreviewActivity.setDelegate(wallPaper -> {
|
||||||
|
chatAttachAlert.dismissInternal();
|
||||||
|
if (onSet != null) {
|
||||||
|
onSet.run(wallPaper);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams();
|
||||||
|
params.transitionFromLeft = true;
|
||||||
|
params.allowNestedScroll = false;
|
||||||
|
params.occupyNavigationBar = true;
|
||||||
|
fragment.showAsSheet(themePreviewActivity, params);
|
||||||
|
|
||||||
|
chatAttachAlert.dismiss();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
FileLog.e(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onWallpaperSelected(Object object) {
|
||||||
|
ThemePreviewActivity wallpaperActivity = new ThemePreviewActivity(object, null, true, false) {
|
||||||
|
@Override
|
||||||
|
public boolean insideBottomSheet() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
wallpaperActivity.boostsStatus = cachedBoostsStatus;
|
||||||
|
wallpaperActivity.setResourceProvider(resourcesProvider);
|
||||||
|
wallpaperActivity.setOnSwitchDayNightDelegate(toggleTheme);
|
||||||
|
wallpaperActivity.setDialogId(dialogId);
|
||||||
|
wallpaperActivity.setDelegate(wallPaper -> {
|
||||||
|
chatAttachAlert.dismissInternal();
|
||||||
|
if (onSet != null) {
|
||||||
|
onSet.run(wallPaper);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams();
|
||||||
|
params.transitionFromLeft = true;
|
||||||
|
params.allowNestedScroll = false;
|
||||||
|
params.occupyNavigationBar = true;
|
||||||
|
fragment.showAsSheet(wallpaperActivity, params);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
chatAttachAlert.setMaxSelectedPhotos(1, false);
|
||||||
|
chatAttachAlert.init();
|
||||||
|
chatAttachAlert.getPhotoLayout().loadGalleryPhotos();
|
||||||
|
chatAttachAlert.show();
|
||||||
|
|
||||||
|
FrameLayout chatAttachButton = new FrameLayout(activity) {
|
||||||
|
|
||||||
|
Paint paint = new Paint();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(dp(48), MeasureSpec.EXACTLY));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void dispatchDraw(Canvas canvas) {
|
||||||
|
super.dispatchDraw(canvas);
|
||||||
|
paint.setColor(Theme.getColor(Theme.key_divider, resourcesProvider));
|
||||||
|
canvas.drawRect(0, 0, getMeasuredWidth(), 1, paint);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AnimatedTextView chatAttachButtonText = new AnimatedTextView(activity, true, true, true);
|
||||||
|
chatAttachButtonText.setTextSize(dp(14));
|
||||||
|
chatAttachButtonText.setText(LocaleController.getString(R.string.SetColorAsBackground));
|
||||||
|
chatAttachButtonText.setGravity(Gravity.CENTER);
|
||||||
|
chatAttachButtonText.setTextColor(Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider));
|
||||||
|
chatAttachButton.addView(chatAttachButtonText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER));
|
||||||
|
chatAttachButton.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(0), Theme.getColor(Theme.key_windowBackgroundWhite, resourcesProvider), ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider), (int) (0.3f * 255))));
|
||||||
|
chatAttachButton.setOnClickListener(v -> {
|
||||||
|
if (chatAttachAlert.getCurrentAttachLayout() == chatAttachAlert.getPhotoLayout()) {
|
||||||
|
chatAttachButtonText.setText(LocaleController.getString(R.string.ChooseBackgroundFromGallery));
|
||||||
|
chatAttachAlert.openColorsLayout();
|
||||||
|
// chatAttachAlert.colorsLayout.updateColors(forceDark);
|
||||||
|
} else {
|
||||||
|
chatAttachButtonText.setText(LocaleController.getString(R.string.SetColorAsBackground));
|
||||||
|
chatAttachAlert.showLayout(chatAttachAlert.getPhotoLayout());
|
||||||
|
}
|
||||||
|
// WallpapersListActivity wallpapersListActivity = new WallpapersListActivity(WallpapersListActivity.TYPE_ALL, chatActivity.getDialogId());
|
||||||
|
// chatActivity.presentFragment(wallpapersListActivity);
|
||||||
|
// chatAttachAlert.dismiss();
|
||||||
|
// dismiss();
|
||||||
|
});
|
||||||
|
chatAttachAlert.sizeNotifierFrameLayout.addView(chatAttachButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void openGalleryForBackground() {
|
private void openGalleryForBackground() {
|
||||||
chatAttachAlert = new ChatAttachAlert(chatActivity.getParentActivity(), chatActivity, false, false, false, chatActivity.getResourceProvider());
|
chatAttachAlert = new ChatAttachAlert(chatActivity.getParentActivity(), chatActivity, false, false, false, chatActivity.getResourceProvider());
|
||||||
chatAttachAlert.drawNavigationBar = true;
|
chatAttachAlert.drawNavigationBar = true;
|
||||||
|
@ -1161,9 +1418,10 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
themePreviewActivity.boostsStatus = boostsStatus;
|
||||||
themePreviewActivity.setInitialModes(false, false, .20f);
|
themePreviewActivity.setInitialModes(false, false, .20f);
|
||||||
themePreviewActivity.setDialogId(chatActivity.getDialogId());
|
themePreviewActivity.setDialogId(chatActivity.getDialogId());
|
||||||
themePreviewActivity.setDelegate(() -> {
|
themePreviewActivity.setDelegate(wallPaper -> {
|
||||||
chatAttachAlert.dismissInternal();
|
chatAttachAlert.dismissInternal();
|
||||||
dismiss();
|
dismiss();
|
||||||
});
|
});
|
||||||
|
@ -1183,8 +1441,9 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
wallpaperActivity.boostsStatus = boostsStatus;
|
||||||
wallpaperActivity.setDialogId(chatActivity.getDialogId());
|
wallpaperActivity.setDialogId(chatActivity.getDialogId());
|
||||||
wallpaperActivity.setDelegate(() -> {
|
wallpaperActivity.setDelegate(wallPaper -> {
|
||||||
chatAttachAlert.dismissInternal();
|
chatAttachAlert.dismissInternal();
|
||||||
dismiss();
|
dismiss();
|
||||||
});
|
});
|
||||||
|
@ -1202,7 +1461,7 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY));
|
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(dp(48), MeasureSpec.EXACTLY));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1213,12 +1472,12 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
chatAttachButtonText = new AnimatedTextView(getContext(), true, true, true);
|
chatAttachButtonText = new AnimatedTextView(getContext(), true, true, true);
|
||||||
chatAttachButtonText.setTextSize(AndroidUtilities.dp(14));
|
chatAttachButtonText.setTextSize(dp(14));
|
||||||
chatAttachButtonText.setText(LocaleController.getString("SetColorAsBackground", R.string.SetColorAsBackground));
|
chatAttachButtonText.setText(LocaleController.getString("SetColorAsBackground", R.string.SetColorAsBackground));
|
||||||
chatAttachButtonText.setGravity(Gravity.CENTER);
|
chatAttachButtonText.setGravity(Gravity.CENTER);
|
||||||
chatAttachButtonText.setTextColor(getThemedColor(Theme.key_featuredStickers_addButton));
|
chatAttachButtonText.setTextColor(getThemedColor(Theme.key_featuredStickers_addButton));
|
||||||
chatAttachButton.addView(chatAttachButtonText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER));
|
chatAttachButton.addView(chatAttachButtonText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER));
|
||||||
chatAttachButton.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(0), getThemedColor(Theme.key_windowBackgroundWhite), ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), (int) (0.3f * 255))));
|
chatAttachButton.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(0), getThemedColor(Theme.key_windowBackgroundWhite), ColorUtils.setAlphaComponent(getThemedColor(Theme.key_featuredStickers_addButton), (int) (0.3f * 255))));
|
||||||
chatAttachButton.setOnClickListener(v -> {
|
chatAttachButton.setOnClickListener(v -> {
|
||||||
if (chatAttachAlert.getCurrentAttachLayout() == chatAttachAlert.getPhotoLayout()) {
|
if (chatAttachAlert.getCurrentAttachLayout() == chatAttachAlert.getPhotoLayout()) {
|
||||||
chatAttachButtonText.setText(LocaleController.getString("ChooseBackgroundFromGallery", R.string.ChooseBackgroundFromGallery));
|
chatAttachButtonText.setText(LocaleController.getString("ChooseBackgroundFromGallery", R.string.ChooseBackgroundFromGallery));
|
||||||
|
@ -1261,6 +1520,27 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showAsSheet(BaseFragment fragment) {
|
||||||
|
if (fragment == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams();
|
||||||
|
params.transitionFromLeft = true;
|
||||||
|
params.allowNestedScroll = false;
|
||||||
|
fragment.setResourceProvider(chatActivity.getResourceProvider());
|
||||||
|
params.onOpenAnimationFinished = () -> {
|
||||||
|
PhotoViewer.getInstance().closePhoto(false, false);
|
||||||
|
};
|
||||||
|
params.onPreFinished = () -> {
|
||||||
|
fixColorsAfterAnotherWindow();
|
||||||
|
};
|
||||||
|
params.onDismiss = () -> {
|
||||||
|
overlayFragment = null;
|
||||||
|
};
|
||||||
|
params.occupyNavigationBar = true;
|
||||||
|
chatActivity.showAsSheet(overlayFragment = fragment, params);
|
||||||
|
}
|
||||||
|
|
||||||
private void showAsSheet(ThemePreviewActivity themePreviewActivity) {
|
private void showAsSheet(ThemePreviewActivity themePreviewActivity) {
|
||||||
BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams();
|
BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams();
|
||||||
params.transitionFromLeft = true;
|
params.transitionFromLeft = true;
|
||||||
|
@ -1274,6 +1554,11 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
return forceDark;
|
return forceDark;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsAnimation() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void switchDayNight(boolean animated) {
|
public void switchDayNight(boolean animated) {
|
||||||
forceDark = !forceDark;
|
forceDark = !forceDark;
|
||||||
|
@ -1316,5 +1601,12 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen
|
||||||
public ChatThemeItem(EmojiThemes chatTheme) {
|
public ChatThemeItem(EmojiThemes chatTheme) {
|
||||||
this.chatTheme = chatTheme;
|
this.chatTheme = chatTheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getEmoticon() {
|
||||||
|
if (chatTheme == null || chatTheme.showAsDefaultStub) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return chatTheme.getEmoticon();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ public class DotDividerSpan extends ReplacementSpan {
|
||||||
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
|
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
int color;
|
int color;
|
||||||
int topPadding;
|
int topPadding;
|
||||||
private int size = 3;
|
private float size = 3;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSize(@NonNull Paint paint, CharSequence charSequence, int i, int i1, @Nullable Paint.FontMetricsInt fontMetricsInt) {
|
public int getSize(@NonNull Paint paint, CharSequence charSequence, int i, int i1, @Nullable Paint.FontMetricsInt fontMetricsInt) {
|
||||||
|
@ -35,7 +35,7 @@ public class DotDividerSpan extends ReplacementSpan {
|
||||||
this.topPadding = topPadding;
|
this.topPadding = topPadding;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSize(int size) {
|
public void setSize(float size) {
|
||||||
this.size = size;
|
this.size = size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,7 +231,7 @@ public class EditTextEmoji extends FrameLayout implements NotificationCenter.Not
|
||||||
editText.setHintTextColor(getThemedColor(Theme.key_windowBackgroundWhiteHintText));
|
editText.setHintTextColor(getThemedColor(Theme.key_windowBackgroundWhiteHintText));
|
||||||
editText.setTextColor(getThemedColor(Theme.key_windowBackgroundWhiteBlackText));
|
editText.setTextColor(getThemedColor(Theme.key_windowBackgroundWhiteBlackText));
|
||||||
editText.setHandlesColor(getThemedColor(Theme.key_chat_TextSelectionCursor));
|
editText.setHandlesColor(getThemedColor(Theme.key_chat_TextSelectionCursor));
|
||||||
editText.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(40) : 0, 0, LocaleController.isRTL ? 0 : AndroidUtilities.dp(40), AndroidUtilities.dp(8));
|
editText.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(40) : 0, 0, LocaleController.isRTL ? 0 : AndroidUtilities.dp(40), AndroidUtilities.dp(11));
|
||||||
addView(editText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.CENTER_VERTICAL, LocaleController.isRTL ? 11 : 0, 1, LocaleController.isRTL ? 0 : 11, 0));
|
addView(editText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.CENTER_VERTICAL, LocaleController.isRTL ? 11 : 0, 1, LocaleController.isRTL ? 0 : 11, 0));
|
||||||
} else if (style == STYLE_STORY || style == STYLE_PHOTOVIEWER) {
|
} else if (style == STYLE_STORY || style == STYLE_PHOTOVIEWER) {
|
||||||
editText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
|
editText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
|
||||||
|
@ -276,7 +276,7 @@ public class EditTextEmoji extends FrameLayout implements NotificationCenter.Not
|
||||||
if (style == STYLE_FRAGMENT) {
|
if (style == STYLE_FRAGMENT) {
|
||||||
emojiIconDrawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.MULTIPLY));
|
emojiIconDrawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.MULTIPLY));
|
||||||
emojiIconDrawable.setIcon(R.drawable.smiles_tab_smiles, false);
|
emojiIconDrawable.setIcon(R.drawable.smiles_tab_smiles, false);
|
||||||
addView(emojiButton, LayoutHelper.createFrame(48, 48, Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT), 0, 0, 0, 7));
|
addView(emojiButton, LayoutHelper.createFrame(48, 48, Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT), 0, 0, 0, 5));
|
||||||
} else if (style == STYLE_STORY || style == STYLE_PHOTOVIEWER) {
|
} else if (style == STYLE_STORY || style == STYLE_PHOTOVIEWER) {
|
||||||
emojiIconDrawable.setColorFilter(new PorterDuffColorFilter(0x8cffffff, PorterDuff.Mode.MULTIPLY));
|
emojiIconDrawable.setColorFilter(new PorterDuffColorFilter(0x8cffffff, PorterDuff.Mode.MULTIPLY));
|
||||||
emojiIconDrawable.setIcon(R.drawable.input_smile, false);
|
emojiIconDrawable.setIcon(R.drawable.input_smile, false);
|
||||||
|
@ -367,10 +367,11 @@ public class EditTextEmoji extends FrameLayout implements NotificationCenter.Not
|
||||||
public void setEnabled(boolean enabled) {
|
public void setEnabled(boolean enabled) {
|
||||||
editText.setEnabled(enabled);
|
editText.setEnabled(enabled);
|
||||||
emojiButton.setVisibility(enabled ? VISIBLE : GONE);
|
emojiButton.setVisibility(enabled ? VISIBLE : GONE);
|
||||||
|
int bottomPadding = AndroidUtilities.dp(currentStyle == STYLE_FRAGMENT ? 11 : 8);
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
editText.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(40) : 0, 0, LocaleController.isRTL ? 0 : AndroidUtilities.dp(40), AndroidUtilities.dp(8));
|
editText.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(40) : 0, 0, LocaleController.isRTL ? 0 : AndroidUtilities.dp(40), bottomPadding);
|
||||||
} else {
|
} else {
|
||||||
editText.setPadding(0, 0, 0, AndroidUtilities.dp(8));
|
editText.setPadding(0, 0, 0, bottomPadding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5774,7 +5774,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (MessagesController.getInstance(currentAccount).premiumLocked) {
|
if (MessagesController.getInstance(currentAccount).premiumFeaturesBlocked()) {
|
||||||
for (int a = 0; a < favouriteStickers.size(); a++) {
|
for (int a = 0; a < favouriteStickers.size(); a++) {
|
||||||
if (MessageObject.isPremiumSticker(favouriteStickers.get(a))) {
|
if (MessageObject.isPremiumSticker(favouriteStickers.get(a))) {
|
||||||
favouriteStickers.remove(a);
|
favouriteStickers.remove(a);
|
||||||
|
|
|
@ -1706,7 +1706,7 @@ public class FilterTabsView extends FrameLayout {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
||||||
if (MessagesController.getInstance(UserConfig.selectedAccount).premiumLocked && (!isEditing || (viewHolder.getAdapterPosition() == 0 && tabs.get(0).isDefault && !UserConfig.getInstance(UserConfig.selectedAccount).isPremium()))) {
|
if (MessagesController.getInstance(UserConfig.selectedAccount).premiumFeaturesBlocked() && (!isEditing || (viewHolder.getAdapterPosition() == 0 && tabs.get(0).isDefault && !UserConfig.getInstance(UserConfig.selectedAccount).isPremium()))) {
|
||||||
return makeMovementFlags(0, 0);
|
return makeMovementFlags(0, 0);
|
||||||
}
|
}
|
||||||
return makeMovementFlags(ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, 0);
|
return makeMovementFlags(ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, 0);
|
||||||
|
@ -1714,7 +1714,7 @@ public class FilterTabsView extends FrameLayout {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
|
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
|
||||||
if (MessagesController.getInstance(UserConfig.selectedAccount).premiumLocked && ((source.getAdapterPosition() == 0 || target.getAdapterPosition() == 0) && !UserConfig.getInstance(UserConfig.selectedAccount).isPremium())) {
|
if (MessagesController.getInstance(UserConfig.selectedAccount).premiumFeaturesBlocked() && ((source.getAdapterPosition() == 0 || target.getAdapterPosition() == 0) && !UserConfig.getInstance(UserConfig.selectedAccount).isPremium())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
adapter.swapElements(source.getAdapterPosition(), target.getAdapterPosition());
|
adapter.swapElements(source.getAdapterPosition(), target.getAdapterPosition());
|
||||||
|
|
|
@ -32,9 +32,11 @@ public class FireworksOverlay extends View {
|
||||||
private float speedCoef = 1.0f;
|
private float speedCoef = 1.0f;
|
||||||
private int fallingDownCount;
|
private int fallingDownCount;
|
||||||
private static Drawable[] heartDrawable;
|
private static Drawable[] heartDrawable;
|
||||||
|
private static Drawable[] starsDrawable;
|
||||||
private static final int particlesCount = SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW ? 50 : 60;
|
private static final int particlesCount = SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW ? 50 : 60;
|
||||||
private static final int fallParticlesCount = SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW ? 20 : 30;
|
private static final int fallParticlesCount = SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_LOW ? 20 : 30;
|
||||||
private boolean isFebruary14;
|
private boolean isFebruary14;
|
||||||
|
private boolean withStars;
|
||||||
|
|
||||||
private static int[] colors = new int[]{
|
private static int[] colors = new int[]{
|
||||||
0xff2CBCE8,
|
0xff2CBCE8,
|
||||||
|
@ -53,6 +55,14 @@ public class FireworksOverlay extends View {
|
||||||
0xffE376B0
|
0xffE376B0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private static int[] starsColors = new int[]{
|
||||||
|
0xff1e80ff,
|
||||||
|
0xff10c689,
|
||||||
|
0xffff5997,
|
||||||
|
0xffff9724,
|
||||||
|
0xff2fe1f9
|
||||||
|
};
|
||||||
|
|
||||||
static {
|
static {
|
||||||
paint = new Paint[colors.length];
|
paint = new Paint[colors.length];
|
||||||
for (int a = 0; a < paint.length; a++) {
|
for (int a = 0; a < paint.length; a++) {
|
||||||
|
@ -85,7 +95,14 @@ public class FireworksOverlay extends View {
|
||||||
canvas.drawRoundRect(rect, AndroidUtilities.dp(2), AndroidUtilities.dp(2), paint[colorType]);
|
canvas.drawRoundRect(rect, AndroidUtilities.dp(2), AndroidUtilities.dp(2), paint[colorType]);
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
} else if (type == 2) {
|
} else if (type == 2) {
|
||||||
Drawable drawable = heartDrawable[colorType];
|
Drawable drawable = null;
|
||||||
|
if (starsDrawable != null) {
|
||||||
|
drawable = starsDrawable[colorType];
|
||||||
|
}
|
||||||
|
if (heartDrawable != null) {
|
||||||
|
drawable = heartDrawable[colorType];
|
||||||
|
}
|
||||||
|
if (drawable != null) {
|
||||||
int w = drawable.getIntrinsicWidth() / 2;
|
int w = drawable.getIntrinsicWidth() / 2;
|
||||||
int h = drawable.getIntrinsicHeight() / 2;
|
int h = drawable.getIntrinsicHeight() / 2;
|
||||||
drawable.setBounds((int) x - w, (int) y - h, (int) x + w, (int) y + h);
|
drawable.setBounds((int) x - w, (int) y - h, (int) x + w, (int) y + h);
|
||||||
|
@ -96,6 +113,7 @@ public class FireworksOverlay extends View {
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean update(int dt) {
|
private boolean update(int dt) {
|
||||||
float moveCoef = dt / 16.0f;
|
float moveCoef = dt / 16.0f;
|
||||||
|
@ -170,6 +188,17 @@ public class FireworksOverlay extends View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void loadStarsDrawables() {
|
||||||
|
if (starsDrawable != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
starsDrawable = new Drawable[starsColors.length];
|
||||||
|
for (int a = 0; a < starsDrawable.length; a++) {
|
||||||
|
starsDrawable[a] = ApplicationLoader.applicationContext.getResources().getDrawable(R.drawable.msg_settings_premium).mutate();
|
||||||
|
starsDrawable[a].setColorFilter(new PorterDuffColorFilter(starsColors[a], PorterDuff.Mode.MULTIPLY));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private int getHeightForAnimation() {
|
private int getHeightForAnimation() {
|
||||||
if (getMeasuredHeight() == 0) {
|
if (getMeasuredHeight() == 0) {
|
||||||
return ((View) getParent()).getHeight();
|
return ((View) getParent()).getHeight();
|
||||||
|
@ -190,6 +219,9 @@ public class FireworksOverlay extends View {
|
||||||
if (isFebruary14 && particle.type == 0) {
|
if (isFebruary14 && particle.type == 0) {
|
||||||
particle.type = 2;
|
particle.type = 2;
|
||||||
particle.colorType = (byte) Utilities.random.nextInt(heartColors.length);
|
particle.colorType = (byte) Utilities.random.nextInt(heartColors.length);
|
||||||
|
} else if (withStars && Utilities.random.nextBoolean()) {
|
||||||
|
particle.type = 2;
|
||||||
|
particle.colorType = (byte) Utilities.random.nextInt(starsColors.length);
|
||||||
} else {
|
} else {
|
||||||
particle.colorType = (byte) Utilities.random.nextInt(colors.length);
|
particle.colorType = (byte) Utilities.random.nextInt(colors.length);
|
||||||
}
|
}
|
||||||
|
@ -223,11 +255,10 @@ public class FireworksOverlay extends View {
|
||||||
return started;
|
return started;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start(boolean withStars) {
|
||||||
|
this.withStars = withStars;
|
||||||
particles.clear();
|
particles.clear();
|
||||||
if (Build.VERSION.SDK_INT >= 18) {
|
|
||||||
setLayerType(View.LAYER_TYPE_HARDWARE, null);
|
setLayerType(View.LAYER_TYPE_HARDWARE, null);
|
||||||
}
|
|
||||||
started = true;
|
started = true;
|
||||||
startedFall = false;
|
startedFall = false;
|
||||||
fallingDownCount = 0;
|
fallingDownCount = 0;
|
||||||
|
@ -239,6 +270,8 @@ public class FireworksOverlay extends View {
|
||||||
isFebruary14 = month == 1 && (BuildVars.DEBUG_PRIVATE_VERSION || day == 14);
|
isFebruary14 = month == 1 && (BuildVars.DEBUG_PRIVATE_VERSION || day == 14);
|
||||||
if (isFebruary14) {
|
if (isFebruary14) {
|
||||||
loadHeartDrawables();
|
loadHeartDrawables();
|
||||||
|
} else if (withStars) {
|
||||||
|
loadStarsDrawables();
|
||||||
}
|
}
|
||||||
for (int a = 0; a < particlesCount; a++) {
|
for (int a = 0; a < particlesCount; a++) {
|
||||||
particles.add(createParticle(false));
|
particles.add(createParticle(false));
|
||||||
|
@ -246,6 +279,10 @@ public class FireworksOverlay extends View {
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
start(false);
|
||||||
|
}
|
||||||
|
|
||||||
private void startFall() {
|
private void startFall() {
|
||||||
if (startedFall) {
|
if (startedFall) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -115,6 +115,9 @@ public class FolderBottomSheet extends BottomSheetWithRecyclerListView {
|
||||||
req.chatlist = new TL_chatlists.TL_inputChatlistDialogFilter();
|
req.chatlist = new TL_chatlists.TL_inputChatlistDialogFilter();
|
||||||
req.chatlist.filter_id = filterId;
|
req.chatlist.filter_id = filterId;
|
||||||
fragment.getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> {
|
fragment.getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> {
|
||||||
|
if (fragment.getParentActivity() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
FolderBottomSheet sheet;
|
FolderBottomSheet sheet;
|
||||||
if (res instanceof TLRPC.Vector) {
|
if (res instanceof TLRPC.Vector) {
|
||||||
ArrayList<Long> suggestions = new ArrayList<>();
|
ArrayList<Long> suggestions = new ArrayList<>();
|
||||||
|
|
|
@ -650,7 +650,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
@Override
|
@Override
|
||||||
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
|
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
|
||||||
if (cameraThread != null) {
|
if (cameraThread != null) {
|
||||||
cameraThread.shutdown(0);
|
cameraThread.shutdown(0, 0);
|
||||||
cameraThread = null;
|
cameraThread = null;
|
||||||
}
|
}
|
||||||
if (cameraSession != null) {
|
if (cameraSession != null) {
|
||||||
|
@ -765,7 +765,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void send(int state, boolean notify, int scheduleDate) {
|
public void send(int state, boolean notify, int scheduleDate, int ttl) {
|
||||||
if (textureView == null) {
|
if (textureView == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -803,7 +803,9 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
videoEditedInfo.encryptedFile = encryptedFile;
|
videoEditedInfo.encryptedFile = encryptedFile;
|
||||||
videoEditedInfo.key = key;
|
videoEditedInfo.key = key;
|
||||||
videoEditedInfo.iv = iv;
|
videoEditedInfo.iv = iv;
|
||||||
delegate.sendMedia(new MediaController.PhotoEntry(0, 0, 0, cameraFile.getAbsolutePath(), 0, true, 0, 0, 0), videoEditedInfo, notify, scheduleDate, false);
|
MediaController.PhotoEntry entry = new MediaController.PhotoEntry(0, 0, 0, cameraFile.getAbsolutePath(), 0, true, 0, 0, 0);
|
||||||
|
entry.ttl = ttl;
|
||||||
|
delegate.sendMedia(entry, videoEditedInfo, notify, scheduleDate, false);
|
||||||
if (scheduleDate != 0) {
|
if (scheduleDate != 0) {
|
||||||
startAnimation(false);
|
startAnimation(false);
|
||||||
}
|
}
|
||||||
|
@ -828,7 +830,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
send = 1;
|
send = 1;
|
||||||
}
|
}
|
||||||
saveLastCameraBitmap();
|
saveLastCameraBitmap();
|
||||||
cameraThread.shutdown(send);
|
cameraThread.shutdown(send, ttl);
|
||||||
cameraThread = null;
|
cameraThread = null;
|
||||||
}
|
}
|
||||||
if (cancelled) {
|
if (cancelled) {
|
||||||
|
@ -871,7 +873,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.recordStopped, recordingGuid, byGesture ? 0 : 6);
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.recordStopped, recordingGuid, byGesture ? 0 : 6);
|
||||||
if (cameraThread != null) {
|
if (cameraThread != null) {
|
||||||
saveLastCameraBitmap();
|
saveLastCameraBitmap();
|
||||||
cameraThread.shutdown(0);
|
cameraThread.shutdown(0, 0);
|
||||||
cameraThread = null;
|
cameraThread = null;
|
||||||
}
|
}
|
||||||
if (cameraFile != null) {
|
if (cameraFile != null) {
|
||||||
|
@ -1562,7 +1564,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
case DO_SHUTDOWN_MESSAGE:
|
case DO_SHUTDOWN_MESSAGE:
|
||||||
finish();
|
finish();
|
||||||
if (recording) {
|
if (recording) {
|
||||||
videoEncoder.stopRecording(inputMessage.arg1);
|
videoEncoder.stopRecording(inputMessage.arg1, inputMessage.arg2);
|
||||||
}
|
}
|
||||||
Looper looper = Looper.myLooper();
|
Looper looper = Looper.myLooper();
|
||||||
if (looper != null) {
|
if (looper != null) {
|
||||||
|
@ -1636,10 +1638,10 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown(int send) {
|
public void shutdown(int send, int ttl) {
|
||||||
Handler handler = getHandler();
|
Handler handler = getHandler();
|
||||||
if (handler != null) {
|
if (handler != null) {
|
||||||
sendMessage(handler.obtainMessage(DO_SHUTDOWN_MESSAGE, send, 0), 0);
|
sendMessage(handler.obtainMessage(DO_SHUTDOWN_MESSAGE, send, ttl), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1682,7 +1684,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
encoder.prepareEncoder();
|
encoder.prepareEncoder();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
encoder.handleStopRecording(0);
|
encoder.handleStopRecording(0, 0);
|
||||||
Looper.myLooper().quit();
|
Looper.myLooper().quit();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1691,7 +1693,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
if (BuildVars.LOGS_ENABLED) {
|
if (BuildVars.LOGS_ENABLED) {
|
||||||
FileLog.e("InstantCamera stop encoder");
|
FileLog.e("InstantCamera stop encoder");
|
||||||
}
|
}
|
||||||
encoder.handleStopRecording(inputMessage.arg1);
|
encoder.handleStopRecording(inputMessage.arg1, inputMessage.arg2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MSG_VIDEOFRAME_AVAILABLE: {
|
case MSG_VIDEOFRAME_AVAILABLE: {
|
||||||
|
@ -1777,6 +1779,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
private boolean ready;
|
private boolean ready;
|
||||||
private volatile boolean running;
|
private volatile boolean running;
|
||||||
private volatile int sendWhenDone;
|
private volatile int sendWhenDone;
|
||||||
|
private volatile int sendWhenDoneTTL;
|
||||||
private long skippedTime;
|
private long skippedTime;
|
||||||
private boolean skippedFirst;
|
private boolean skippedFirst;
|
||||||
|
|
||||||
|
@ -1901,7 +1904,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
FileLog.e(e);
|
FileLog.e(e);
|
||||||
}
|
}
|
||||||
handler.sendMessage(handler.obtainMessage(MSG_STOP_RECORDING, sendWhenDone, 0));
|
handler.sendMessage(handler.obtainMessage(MSG_STOP_RECORDING, sendWhenDone, sendWhenDoneTTL));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1950,8 +1953,8 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
handler.sendMessage(handler.obtainMessage(MSG_START_RECORDING));
|
handler.sendMessage(handler.obtainMessage(MSG_START_RECORDING));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stopRecording(int send) {
|
public void stopRecording(int send, int ttl) {
|
||||||
handler.sendMessage(handler.obtainMessage(MSG_STOP_RECORDING, send, 0));
|
handler.sendMessage(handler.obtainMessage(MSG_STOP_RECORDING, send, ttl));
|
||||||
AndroidUtilities.runOnUIThread(() -> {
|
AndroidUtilities.runOnUIThread(() -> {
|
||||||
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.stopAllHeavyOperations, 512);
|
NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.stopAllHeavyOperations, 512);
|
||||||
});
|
});
|
||||||
|
@ -2279,10 +2282,11 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleStopRecording(final int send) {
|
private void handleStopRecording(final int send, final int ttl) {
|
||||||
if (running) {
|
if (running) {
|
||||||
FileLog.d("InstantCamera handleStopRecording running=false");
|
FileLog.d("InstantCamera handleStopRecording running=false");
|
||||||
sendWhenDone = send;
|
sendWhenDone = send;
|
||||||
|
sendWhenDoneTTL = ttl;
|
||||||
running = false;
|
running = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2374,13 +2378,17 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter
|
||||||
if (send == 1) {
|
if (send == 1) {
|
||||||
if (delegate.isInScheduleMode()) {
|
if (delegate.isInScheduleMode()) {
|
||||||
AlertsCreator.createScheduleDatePickerDialog(delegate.getParentActivity(), delegate.getDialogId(), (notify, scheduleDate) -> {
|
AlertsCreator.createScheduleDatePickerDialog(delegate.getParentActivity(), delegate.getDialogId(), (notify, scheduleDate) -> {
|
||||||
delegate.sendMedia(new MediaController.PhotoEntry(0, 0, 0, videoFile.getAbsolutePath(), 0, true, 0, 0, 0), videoEditedInfo, notify, scheduleDate, false);
|
MediaController.PhotoEntry entry = new MediaController.PhotoEntry(0, 0, 0, videoFile.getAbsolutePath(), 0, true, 0, 0, 0);
|
||||||
|
entry.ttl = ttl;
|
||||||
|
delegate.sendMedia(entry, videoEditedInfo, notify, scheduleDate, false);
|
||||||
startAnimation(false);
|
startAnimation(false);
|
||||||
}, () -> {
|
}, () -> {
|
||||||
startAnimation(false);
|
startAnimation(false);
|
||||||
}, resourcesProvider);
|
}, resourcesProvider);
|
||||||
} else {
|
} else {
|
||||||
delegate.sendMedia(new MediaController.PhotoEntry(0, 0, 0, videoFile.getAbsolutePath(), 0, true, 0, 0, 0), videoEditedInfo, true, 0, false);
|
MediaController.PhotoEntry entry = new MediaController.PhotoEntry(0, 0, 0, videoFile.getAbsolutePath(), 0, true, 0, 0, 0);
|
||||||
|
entry.ttl = ttl;
|
||||||
|
delegate.sendMedia(entry, videoEditedInfo, true, 0, false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
videoPlayer = new VideoPlayer();
|
videoPlayer = new VideoPlayer();
|
||||||
|
|
|
@ -39,9 +39,9 @@ public class MediaActionDrawable extends Drawable {
|
||||||
public static final int ICON_UPDATE = 15;
|
public static final int ICON_UPDATE = 15;
|
||||||
|
|
||||||
private TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
|
private TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
|
||||||
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
public Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
private Paint backPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
private Paint backPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
private Paint paint2 = new Paint(Paint.ANTI_ALIAS_FLAG);
|
public Paint paint2 = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
private Paint paint3 = new Paint(Paint.ANTI_ALIAS_FLAG);
|
private Paint paint3 = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
private RectF rect = new RectF();
|
private RectF rect = new RectF();
|
||||||
private ColorFilter colorFilter;
|
private ColorFilter colorFilter;
|
||||||
|
@ -274,7 +274,7 @@ public class MediaActionDrawable extends Drawable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyShaderMatrix(boolean path) {
|
public void applyShaderMatrix(boolean path) {
|
||||||
if (messageDrawable != null && messageDrawable.hasGradient() && !hasOverlayImage) {
|
if (messageDrawable != null && messageDrawable.hasGradient() && !hasOverlayImage) {
|
||||||
android.graphics.Rect bounds = getBounds();
|
android.graphics.Rect bounds = getBounds();
|
||||||
Shader shader = messageDrawable.getGradientShader();
|
Shader shader = messageDrawable.getGradientShader();
|
||||||
|
|
|
@ -30,7 +30,7 @@ public class MenuToItemOptions implements Menu {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MenuItem add(int groupId, int itemId, int order, CharSequence title) {
|
public MenuItem add(int groupId, int itemId, int order, CharSequence title) {
|
||||||
if (premiumLock != null && FloatingToolbar.premiumOptions.contains(itemId) && MessagesController.getInstance(UserConfig.selectedAccount).premiumLocked) {
|
if (premiumLock != null && FloatingToolbar.premiumOptions.contains(itemId) && MessagesController.getInstance(UserConfig.selectedAccount).premiumFeaturesBlocked()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
itemOptions.add(title, () -> onMenuClicked.run(itemId));
|
itemOptions.add(title, () -> onMenuClicked.run(itemId));
|
||||||
|
|
|
@ -910,7 +910,7 @@ public class MessagePreviewView extends FrameLayout {
|
||||||
menu.addView(btn1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48));
|
menu.addView(btn1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!messagePreviewParams.noforwards) {
|
if (!messagePreviewParams.noforwards && !messagePreviewParams.hasSecretMessages) {
|
||||||
FrameLayout btn2 = new FrameLayout(context);
|
FrameLayout btn2 = new FrameLayout(context);
|
||||||
replyAnotherChatButton = new ActionBarMenuSubItem(context, true, false, false, resourcesProvider);
|
replyAnotherChatButton = new ActionBarMenuSubItem(context, true, false, false, resourcesProvider);
|
||||||
replyAnotherChatButton.setTextAndIcon(LocaleController.getString(R.string.ReplyToAnotherChat), R.drawable.msg_forward_replace);
|
replyAnotherChatButton.setTextAndIcon(LocaleController.getString(R.string.ReplyToAnotherChat), R.drawable.msg_forward_replace);
|
||||||
|
@ -923,7 +923,7 @@ public class MessagePreviewView extends FrameLayout {
|
||||||
menu.addView(btn2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48));
|
menu.addView(btn2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!messagePreviewParams.isSecret) {
|
if (!messagePreviewParams.noforwards && !messagePreviewParams.hasSecretMessages) {
|
||||||
ActionBarPopupWindow.GapView gap2 = new ActionBarPopupWindow.GapView(context, resourcesProvider);
|
ActionBarPopupWindow.GapView gap2 = new ActionBarPopupWindow.GapView(context, resourcesProvider);
|
||||||
gap2.setTag(R.id.fit_width_tag, 1);
|
gap2.setTag(R.id.fit_width_tag, 1);
|
||||||
menu.addView(gap2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8));
|
menu.addView(gap2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8));
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue