diff --git a/.gitignore b/.gitignore index ea470aaca..8803d0da9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,12 @@ build/ obj/ *.iml local.properties +TMessagesProj/.cxx/ +TMessagesProj/jniLibs/ +TMessagesProj/jniRes/ +**/.DS_Store +TMessagesProj/afat/ +TMessagesProj_App/afat/ +TMessagesProj_AppHockeyApp/afat/ +TMessagesProj_AppStandalone/afat/ +TMessagesProj_AppHuawei/afat/ diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index db6643c91..b816b715f 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -25,6 +25,7 @@ dependencies { implementation 'androidx.multidex:multidex:2.0.1' implementation "androidx.sharetarget:sharetarget:1.2.0" implementation 'androidx.interpolator:interpolator:1.0.0' + implementation 'androidx.biometric:biometric:1.1.0' compileOnly 'org.checkerframework:checker-qual:2.5.2' compileOnly 'org.checkerframework:checker-compat-qual:2.5.0' diff --git a/TMessagesProj/jni/CMakeLists.txt b/TMessagesProj/jni/CMakeLists.txt index 570d5ed9b..5f15aa626 100644 --- a/TMessagesProj/jni/CMakeLists.txt +++ b/TMessagesProj/jni/CMakeLists.txt @@ -425,12 +425,13 @@ target_include_directories(breakpad PUBLIC #voip include(${CMAKE_HOME_DIRECTORY}/voip/CMakeLists.txt) -set(NATIVE_LIB "tmessages.48") +set(NATIVE_LIB "tmessages.49") #tmessages add_library(${NATIVE_LIB} SHARED jni.c audio.c + webm_encoder.c image.cpp video.c intro/IntroRenderer.c diff --git a/TMessagesProj/jni/TgNetWrapper.cpp b/TMessagesProj/jni/TgNetWrapper.cpp index 211f32b83..b543ae7e8 100644 --- a/TMessagesProj/jni/TgNetWrapper.cpp +++ b/TMessagesProj/jni/TgNetWrapper.cpp @@ -30,6 +30,7 @@ jmethodID jclass_ConnectionsManager_onRequestNewServerIpAndPort; jmethodID jclass_ConnectionsManager_onProxyError; jmethodID jclass_ConnectionsManager_getHostByName; jmethodID jclass_ConnectionsManager_getInitFlags; +jmethodID jclass_ConnectionsManager_onPremiumFloodWait; bool check_utf8(const char *data, size_t len); @@ -319,6 +320,10 @@ class Delegate : public ConnectiosManagerDelegate { int32_t getInitFlags(int32_t instanceNum) { return (int32_t) jniEnv[instanceNum]->CallStaticIntMethod(jclass_ConnectionsManager, jclass_ConnectionsManager_getInitFlags); } + + void onPremiumFloodWait(int32_t instanceNum, int32_t requestToken, bool isUpload) { + jniEnv[instanceNum]->CallStaticVoidMethod(jclass_ConnectionsManager, jclass_ConnectionsManager_onPremiumFloodWait, instanceNum, requestToken, isUpload); + } }; void onHostNameResolved(JNIEnv *env, jclass c, jstring host, jlong address, jstring ip) { @@ -568,6 +573,10 @@ extern "C" int registerNativeTgNetFunctions(JavaVM *vm, JNIEnv *env) { if (jclass_ConnectionsManager_getInitFlags == 0) { return JNI_FALSE; } + jclass_ConnectionsManager_onPremiumFloodWait = env->GetStaticMethodID(jclass_ConnectionsManager, "onPremiumFloodWait", "(IIZ)V"); + if (jclass_ConnectionsManager_onPremiumFloodWait == 0) { + return JNI_FALSE; + } return JNI_TRUE; } diff --git a/TMessagesProj/jni/audio.c b/TMessagesProj/jni/audio.c index 7f310bc29..f5202f3e1 100644 --- a/TMessagesProj/jni/audio.c +++ b/TMessagesProj/jni/audio.c @@ -63,6 +63,7 @@ typedef struct { ogg_int64_t last_granulepos; opus_int32 min_bytes; int max_frame_bytes; + int serialno; } resume_data; static int write_uint32(Packet *p, ogg_uint32_t val) { @@ -261,6 +262,7 @@ ogg_int64_t enc_granulepos; ogg_int64_t last_granulepos; int size_segments; int last_segments; +int serialno; void cleanupRecorder() { @@ -381,7 +383,7 @@ int initRecorder(const char *path, opus_int32 sampleRate) { header.preskip = (int)(inopt.skip * (48000.0 / coding_rate)); inopt.extraout = (int)(header.preskip * (rate / 48000.0)); - if (ogg_stream_init(&os, rand()) == -1) { + if (ogg_stream_init(&os, serialno = rand()) == -1) { LOGE("Error: stream init failed"); return 0; } @@ -465,6 +467,7 @@ void saveResumeData() { data.last_granulepos = last_granulepos; data.min_bytes = min_bytes; data.max_frame_bytes = max_frame_bytes; + data.serialno = serialno; if (fwrite(&data, sizeof(resume_data), 1, resumeFile) != 1) { LOGE("error writing resume data to file: %s", _resumeFilePath); @@ -527,6 +530,7 @@ int resumeRecorder(const char *path, opus_int32 sampleRate) { last_granulepos = resumeData.last_granulepos; min_bytes = resumeData.min_bytes; max_frame_bytes = resumeData.max_frame_bytes; + serialno = resumeData.serialno; _fileOs = fopen(path, "a"); if (!_fileOs) { @@ -557,7 +561,7 @@ int resumeRecorder(const char *path, opus_int32 sampleRate) { } #endif - if (ogg_stream_init(&os, rand()) == -1) { + if (ogg_stream_init(&os, serialno) == -1) { LOGE("Error: stream init failed"); return 0; } diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavcodec.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavcodec.a index 24e3dbf71..ef59f86ab 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavcodec.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavcodec.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavformat.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavformat.a index 8d9cfe961..bb75ab74e 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavformat.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavformat.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavresample.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavresample.a index ab291dfff..a5d4c2b77 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavresample.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavutil.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavutil.a index ed769bf93..cf6697a67 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libavutil.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libavutil.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libswresample.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libswresample.a index f1961df86..7675775e3 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libswresample.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libswresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libswscale.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libswscale.a index 8978d03c1..2732e67fc 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libswscale.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libswscale.a differ diff --git a/TMessagesProj/jni/ffmpeg/arm64-v8a/libvpx.a b/TMessagesProj/jni/ffmpeg/arm64-v8a/libvpx.a index dece77606..32f07ddd9 100644 Binary files a/TMessagesProj/jni/ffmpeg/arm64-v8a/libvpx.a and b/TMessagesProj/jni/ffmpeg/arm64-v8a/libvpx.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavcodec.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavcodec.a index 5c718f80b..5f8dd2c62 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavcodec.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavcodec.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavformat.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavformat.a index 70b17572b..bbd38c511 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavformat.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavformat.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavresample.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavresample.a index 5a5f98f13..677df6492 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavresample.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavutil.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavutil.a index 7e2cb772e..f7a03fba4 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavutil.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libavutil.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswresample.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswresample.a index f6c9ad6ce..90e94947f 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswresample.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswscale.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswscale.a index 841227ea5..e740c3634 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswscale.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libswscale.a differ diff --git a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libvpx.a b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libvpx.a index dfbdd7c27..ca37d5906 100644 Binary files a/TMessagesProj/jni/ffmpeg/armeabi-v7a/libvpx.a and b/TMessagesProj/jni/ffmpeg/armeabi-v7a/libvpx.a differ diff --git a/TMessagesProj/jni/ffmpeg/build_ffmpeg/build_ffmpeg.sh b/TMessagesProj/jni/ffmpeg/build_ffmpeg/build_ffmpeg.sh index 250ef0d5d..c30f29469 100755 --- a/TMessagesProj/jni/ffmpeg/build_ffmpeg/build_ffmpeg.sh +++ b/TMessagesProj/jni/ffmpeg/build_ffmpeg/build_ffmpeg.sh @@ -76,6 +76,10 @@ LIBS=" -L${PREFIX}/lib" \ --enable-libvpx \ --enable-decoder=libvpx_vp9 \ +--enable-encoder=libvpx_vp9 \ +--enable-muxer=matroska \ +--enable-bsf=vp9_superframe \ +--enable-bsf=vp9_raw_reorder \ --enable-runtime-cpudetect \ --enable-pthreads \ --enable-avresample \ diff --git a/TMessagesProj/jni/ffmpeg/build_ffmpeg/vpx-android/build-vpx.sh b/TMessagesProj/jni/ffmpeg/build_ffmpeg/vpx-android/build-vpx.sh index 5d2a8d078..9bfd0ae1f 100644 --- a/TMessagesProj/jni/ffmpeg/build_ffmpeg/vpx-android/build-vpx.sh +++ b/TMessagesProj/jni/ffmpeg/build_ffmpeg/vpx-android/build-vpx.sh @@ -68,6 +68,8 @@ fi --disable-examples \ --disable-tools \ --disable-debug \ + --disable-neon-asm \ + --disable-neon-dotprod \ --disable-unit-tests || exit 1 make -j${HOST_NUM_CORES} install diff --git a/TMessagesProj/jni/ffmpeg/x86/libavcodec.a b/TMessagesProj/jni/ffmpeg/x86/libavcodec.a index 308f62fea..4eddf5040 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libavcodec.a and b/TMessagesProj/jni/ffmpeg/x86/libavcodec.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libavformat.a b/TMessagesProj/jni/ffmpeg/x86/libavformat.a index 472c2f6e6..a6743018d 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libavformat.a and b/TMessagesProj/jni/ffmpeg/x86/libavformat.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libavresample.a b/TMessagesProj/jni/ffmpeg/x86/libavresample.a index a7b9db453..5c8bc6263 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libavresample.a and b/TMessagesProj/jni/ffmpeg/x86/libavresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libavutil.a b/TMessagesProj/jni/ffmpeg/x86/libavutil.a index e718998b0..0b72b4145 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libavutil.a and b/TMessagesProj/jni/ffmpeg/x86/libavutil.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libswresample.a b/TMessagesProj/jni/ffmpeg/x86/libswresample.a index 07ca70603..45ee7954d 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libswresample.a and b/TMessagesProj/jni/ffmpeg/x86/libswresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libswscale.a b/TMessagesProj/jni/ffmpeg/x86/libswscale.a index 08e4d1d00..efdf8fce0 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libswscale.a and b/TMessagesProj/jni/ffmpeg/x86/libswscale.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86/libvpx.a b/TMessagesProj/jni/ffmpeg/x86/libvpx.a index 73f57d4fd..865f97cbc 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86/libvpx.a and b/TMessagesProj/jni/ffmpeg/x86/libvpx.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libavcodec.a b/TMessagesProj/jni/ffmpeg/x86_64/libavcodec.a index dd7faf7d9..13d6c3ee0 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libavcodec.a and b/TMessagesProj/jni/ffmpeg/x86_64/libavcodec.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libavformat.a b/TMessagesProj/jni/ffmpeg/x86_64/libavformat.a index eaaa6503a..730d167d4 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libavformat.a and b/TMessagesProj/jni/ffmpeg/x86_64/libavformat.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libavresample.a b/TMessagesProj/jni/ffmpeg/x86_64/libavresample.a index d3d2464e0..11b9ada0b 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libavresample.a and b/TMessagesProj/jni/ffmpeg/x86_64/libavresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libavutil.a b/TMessagesProj/jni/ffmpeg/x86_64/libavutil.a index e75b2dc02..130af1e6a 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libavutil.a and b/TMessagesProj/jni/ffmpeg/x86_64/libavutil.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libswresample.a b/TMessagesProj/jni/ffmpeg/x86_64/libswresample.a index 494b46ef7..ce7275144 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libswresample.a and b/TMessagesProj/jni/ffmpeg/x86_64/libswresample.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libswscale.a b/TMessagesProj/jni/ffmpeg/x86_64/libswscale.a index 019c08c13..afb1f7ffa 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libswscale.a and b/TMessagesProj/jni/ffmpeg/x86_64/libswscale.a differ diff --git a/TMessagesProj/jni/ffmpeg/x86_64/libvpx.a b/TMessagesProj/jni/ffmpeg/x86_64/libvpx.a index eb7754ed4..21e46183d 100644 Binary files a/TMessagesProj/jni/ffmpeg/x86_64/libvpx.a and b/TMessagesProj/jni/ffmpeg/x86_64/libvpx.a differ diff --git a/TMessagesProj/jni/tgnet/ConnectionsManager.cpp b/TMessagesProj/jni/tgnet/ConnectionsManager.cpp index 1a0b2d9b6..2980c0c49 100644 --- a/TMessagesProj/jni/tgnet/ConnectionsManager.cpp +++ b/TMessagesProj/jni/tgnet/ConnectionsManager.cpp @@ -1324,12 +1324,24 @@ void ConnectionsManager::processServerResponse(TLObject *message, int64_t messag request->startTime = 0; request->startTimeMillis = 0; request->minStartTime = (int32_t) (getCurrentTimeMonotonicMillis() / 1000 + 2); - } else if (error->error_code == 420 && (request->requestFlags & RequestFlagIgnoreFloodWait) == 0 && error->error_message.find("STORY_SEND_FLOOD") == std::string::npos) { + } else if ( + error->error_code == 420 && (request->requestFlags & RequestFlagIgnoreFloodWait) == 0 && + error->error_message.find("STORY_SEND_FLOOD") == std::string::npos + ) { int32_t waitTime = 2; static std::string floodWait = "FLOOD_WAIT_"; + static std::string premiumFloodWait = "FLOOD_PREMIUM_WAIT_"; static std::string slowmodeWait = "SLOWMODE_WAIT_"; + bool isPremiumFloodWait = false; discardResponse = true; - if (error->error_message.find(floodWait) != std::string::npos) { + if (error->error_message.find(premiumFloodWait) != std::string::npos) { + isPremiumFloodWait = true; + std::string num = error->error_message.substr(premiumFloodWait.size(), error->error_message.size() - premiumFloodWait.size()); + waitTime = atoi(num.c_str()); + if (waitTime <= 0) { + waitTime = 2; + } + } else if (error->error_message.find(floodWait) != std::string::npos) { std::string num = error->error_message.substr(floodWait.size(), error->error_message.size() - floodWait.size()); waitTime = atoi(num.c_str()); if (waitTime <= 0) { @@ -1343,10 +1355,14 @@ void ConnectionsManager::processServerResponse(TLObject *message, int64_t messag } discardResponse = false; } + request->premiumFloodWait = isPremiumFloodWait; request->failedByFloodWait = waitTime; request->startTime = 0; request->startTimeMillis = 0; request->minStartTime = (int32_t) (getCurrentTimeMonotonicMillis() / 1000 + waitTime); + if (isPremiumFloodWait && delegate != nullptr) { + delegate->onPremiumFloodWait(instanceNum, request->requestToken, (request->connectionType & ConnectionTypeUpload) != 0); + } } else if (error->error_code == 400) { static std::string waitFailed = "MSG_WAIT_FAILED"; static std::string bindFailed = "ENCRYPTED_MESSAGE_INVALID"; @@ -2496,7 +2512,7 @@ void ConnectionsManager::processRequestQueue(uint32_t connectionTypes, uint32_t retryMax = 6; } } - if (request->retryCount >= retryMax) { + if (request->retryCount >= retryMax && !request->premiumFloodWait) { if (LOGS_ENABLED) DEBUG_E("timed out %s, message_id = 0x%" PRIx64, typeInfo.name(), request->messageId); auto error = new TL_error(); error->code = -123; diff --git a/TMessagesProj/jni/tgnet/Defines.h b/TMessagesProj/jni/tgnet/Defines.h index d2255212d..01323317b 100644 --- a/TMessagesProj/jni/tgnet/Defines.h +++ b/TMessagesProj/jni/tgnet/Defines.h @@ -153,6 +153,7 @@ typedef struct ConnectiosManagerDelegate { virtual void onProxyError(int32_t instanceNum) = 0; virtual void getHostByName(std::string domain, int32_t instanceNum, ConnectionSocket *socket) = 0; virtual int32_t getInitFlags(int32_t instanceNum) = 0; + virtual void onPremiumFloodWait(int32_t instanceNum, int32_t requestToken, bool isUpload) = 0; } ConnectiosManagerDelegate; typedef struct HandshakeDelegate { diff --git a/TMessagesProj/jni/tgnet/Request.h b/TMessagesProj/jni/tgnet/Request.h index bf360f9d4..81007b7bb 100644 --- a/TMessagesProj/jni/tgnet/Request.h +++ b/TMessagesProj/jni/tgnet/Request.h @@ -35,6 +35,7 @@ public: uint32_t retryCount = 0; bool failedBySalt = false; int32_t failedByFloodWait = 0; + bool premiumFloodWait = false; ConnectionType connectionType; uint32_t requestFlags; bool completedSent = false; diff --git a/TMessagesProj/jni/webm_encoder.c b/TMessagesProj/jni/webm_encoder.c new file mode 100644 index 000000000..99a0c2755 --- /dev/null +++ b/TMessagesProj/jni/webm_encoder.c @@ -0,0 +1,245 @@ +#include +#include "libavformat/avio.h" +#include "libavcodec/codec.h" +#include "libavformat/avformat.h" +#include "c_utils.h" +#include "libavutil/opt.h" +#include "libswscale/swscale.h" + +typedef struct { + AVCodecContext *codec_ctx; + AVFormatContext *fmt_ctx; + AVStream *video_stream; + AVFrame *frame; + int frame_count; + struct SwsContext *sws_ctx; +} EncoderContext; + +JNIEXPORT jlong JNICALL Java_org_telegram_messenger_video_WebmEncoder_createEncoder( + JNIEnv *env, jobject obj, + jstring outputPath_, + jint width, jint height, + jint fps, + jlong bitrate +) { + + int ret; + const char* outputPath = (*env)->GetStringUTFChars(env, outputPath_, 0); + + EncoderContext* ctx = (EncoderContext*) malloc(sizeof(EncoderContext)); + if (!ctx) { + LOGE("vp9: failed to alloc context"); + return (jlong)0; + } + memset(ctx, 0, sizeof(EncoderContext)); + + avformat_alloc_output_context2(&ctx->fmt_ctx, NULL, "matroska", outputPath); + if (!ctx->fmt_ctx) { + LOGE("vp9: no context created!"); + return (jlong)0; + } + + if (!(ctx->fmt_ctx->oformat->flags & AVFMT_NOFILE)) { + ret = avio_open(&ctx->fmt_ctx->pb, outputPath, AVIO_FLAG_WRITE); + if (ret < 0) { + LOGE("vp9: failed to write open file %d", ret); + return (jlong) 0; + } + } + + AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_VP9); + if (!codec) { + LOGE("vp9: no encoder found!"); + return 0; + } + + ctx->codec_ctx = avcodec_alloc_context3(codec); + if (!ctx->codec_ctx) { + LOGE("vp9: failed to create codec ctx"); + return (jlong) 0; + } + + ctx->codec_ctx->codec_id = AV_CODEC_ID_VP9; + ctx->codec_ctx->codec_type = AVMEDIA_TYPE_VIDEO; + ctx->codec_ctx->width = width; + ctx->codec_ctx->height = height; + ctx->codec_ctx->pix_fmt = AV_PIX_FMT_YUVA420P; + ctx->codec_ctx->color_range = AVCOL_RANGE_MPEG; + ctx->codec_ctx->color_primaries = AVCOL_PRI_BT709; + ctx->codec_ctx->colorspace = AVCOL_SPC_BT709; + ctx->codec_ctx->time_base = (AVRational){ 1, fps }; + ctx->codec_ctx->framerate = (AVRational){ fps, 1 }; + ctx->codec_ctx->bit_rate = bitrate; + ctx->codec_ctx->gop_size = 10; + ctx->codec_ctx->max_b_frames = 1; + + if (ctx->fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) { + ctx->codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + } + + ctx->video_stream = avformat_new_stream(ctx->fmt_ctx, codec); + if (!ctx->video_stream) { + LOGE("vp9: failed to create stream"); + return (jlong) 0; + } + + ctx->video_stream->codecpar->codec_id = ctx->codec_ctx->codec_id; + ctx->video_stream->codecpar->codec_type = ctx->codec_ctx->codec_type; + ctx->video_stream->codecpar->width = ctx->codec_ctx->width; + ctx->video_stream->codecpar->height = ctx->codec_ctx->height; + ctx->video_stream->codecpar->format = ctx->codec_ctx->pix_fmt; + ctx->video_stream->time_base = ctx->codec_ctx->time_base; + + ret = avcodec_open2(ctx->codec_ctx, codec, NULL); + if (ret < 0) { + LOGE("vp9: failed to open codec %s", av_err2str(ret)); + return (jlong) 0; + } + + ctx->sws_ctx = sws_getContext(width, height, AV_PIX_FMT_RGBA, width, height, AV_PIX_FMT_YUVA420P, 0, 0, 0, 0); + if (!ctx->sws_ctx) { + LOGE("vp9: failed to sws_ctx"); + return (jlong) 0; + } + + ctx->frame = av_frame_alloc(); + if (!ctx->frame) { + LOGE("vp9: failed to alloc frame"); + return (jlong)0; + } + + ctx->frame->format = ctx->codec_ctx->pix_fmt; + ctx->frame->width = ctx->codec_ctx->width; + ctx->frame->height = ctx->codec_ctx->height; + ret = av_frame_get_buffer(ctx->frame, 0); + if (ret < 0) { + LOGE("vp9: failed to get frame buffer %d", ret); + return (jlong)0; + } + + if (avcodec_parameters_from_context(ctx->video_stream->codecpar, ctx->codec_ctx) < 0) { + LOGE("vp9: failed to copy codec parameters to stream"); + return (jlong) 0; + } + + ret = avformat_write_header(ctx->fmt_ctx, NULL); + if (ret < 0) { + LOGE("vp9: failed to write header %d", ret); + return (jlong) 0; + } + + (*env)->ReleaseStringUTFChars(env, outputPath_, outputPath); + + return (jlong)ctx; +} + +JNIEXPORT jboolean JNICALL Java_org_telegram_messenger_video_WebmEncoder_writeFrame( + JNIEnv *env, jobject obj, + jlong ptr, + jobject argbPixels, + jint width, jint height +) { + EncoderContext *ctx = (EncoderContext *) ptr; + + uint8_t *pixels = (*env)->GetDirectBufferAddress(env, argbPixels); + + if (!ctx || !pixels) { + LOGE("vp9: no ctx or no pixels"); + return JNI_FALSE; + } + + int ret; + AVPacket pkt; + av_init_packet(&pkt); + pkt.data = NULL; + pkt.size = 0; + + ret = av_frame_make_writable(ctx->frame); + if (ret < 0) { + LOGE("vp9: failed to make writable %d", ret); + return JNI_FALSE; + } + + const uint8_t* srcSlice[1] = { pixels }; + int srcStride[1] = { 4 * width }; + sws_scale(ctx->sws_ctx, srcSlice, srcStride, 0, ctx->codec_ctx->height, ctx->frame->data, ctx->frame->linesize); + + ctx->frame->pts = ctx->frame_count++; + + ret = avcodec_send_frame(ctx->codec_ctx, ctx->frame); + if (ret < 0) { + LOGE("vp9: failed to send packet %d", ret); + return JNI_FALSE; + } + + while (ret >= 0) { + ret = avcodec_receive_packet(ctx->codec_ctx, &pkt); + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { + break; + } else if (ret < 0) { + LOGE("vp9: failed to receive packet %d", ret); + return JNI_FALSE; + } + + av_packet_rescale_ts(&pkt, ctx->codec_ctx->time_base, ctx->video_stream->time_base); + pkt.stream_index = ctx->video_stream->index; + + ret = av_interleaved_write_frame(ctx->fmt_ctx, &pkt); + av_packet_unref(&pkt); + } + + return JNI_TRUE; +} + +JNIEXPORT void JNICALL Java_org_telegram_messenger_video_WebmEncoder_stop( + JNIEnv *env, jobject obj, + jlong ptr +) { + EncoderContext *ctx = (EncoderContext *) ptr; + if (!ctx || !ctx->fmt_ctx) { + return; + } + + avcodec_send_frame(ctx->codec_ctx, NULL); + AVPacket pkt; + av_init_packet(&pkt); + pkt.data = NULL; + pkt.size = 0; + + int ret; + while (1) { + ret = avcodec_receive_packet(ctx->codec_ctx, &pkt); + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { + break; + } else if (ret < 0) { + LOGE("vp9: failed to receive packet %d", ret); + return; + } + + av_packet_rescale_ts(&pkt, ctx->codec_ctx->time_base, ctx->video_stream->time_base); + pkt.stream_index = ctx->video_stream->index; + + ret = av_interleaved_write_frame(ctx->fmt_ctx, &pkt); + av_packet_unref(&pkt); + } + + av_write_trailer(ctx->fmt_ctx); + + if (ctx->frame) { + av_frame_free(&ctx->frame); + } + if (ctx->codec_ctx) { + avcodec_free_context(&ctx->codec_ctx); + } + if (ctx->sws_ctx) { + sws_freeContext(ctx->sws_ctx); + } + if (ctx->fmt_ctx) { + if (!(ctx->fmt_ctx->oformat->flags & AVFMT_NOFILE)) { + avio_closep(&ctx->fmt_ctx->pb); + } + avformat_free_context(ctx->fmt_ctx); + } + + free(ctx); +} \ No newline at end of file diff --git a/TMessagesProj/src/main/assets/emoji/0_0.png b/TMessagesProj/src/main/assets/emoji/0_0.png index 3977ec0b1..b4191a16a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_0.png and b/TMessagesProj/src/main/assets/emoji/0_0.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1.png b/TMessagesProj/src/main/assets/emoji/0_1.png index 8dbe7b203..234b29339 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1.png and b/TMessagesProj/src/main/assets/emoji/0_1.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_10.png b/TMessagesProj/src/main/assets/emoji/0_10.png index bdf97aff1..1c9fc55ab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_10.png and b/TMessagesProj/src/main/assets/emoji/0_10.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_100.png b/TMessagesProj/src/main/assets/emoji/0_100.png index c2ab8c199..09e245167 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_100.png and b/TMessagesProj/src/main/assets/emoji/0_100.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1000.png b/TMessagesProj/src/main/assets/emoji/0_1000.png index 0194ecac2..b2d2cccc5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1000.png and b/TMessagesProj/src/main/assets/emoji/0_1000.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1001.png b/TMessagesProj/src/main/assets/emoji/0_1001.png index 58164e5ba..df4b024f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1001.png and b/TMessagesProj/src/main/assets/emoji/0_1001.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1002.png b/TMessagesProj/src/main/assets/emoji/0_1002.png index 98fdf8ad8..1fe589e84 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1002.png and b/TMessagesProj/src/main/assets/emoji/0_1002.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1003.png b/TMessagesProj/src/main/assets/emoji/0_1003.png index 80dc0dd32..371310c54 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1003.png and b/TMessagesProj/src/main/assets/emoji/0_1003.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1004.png b/TMessagesProj/src/main/assets/emoji/0_1004.png index e342ae1f5..4e459af51 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1004.png and b/TMessagesProj/src/main/assets/emoji/0_1004.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1005.png b/TMessagesProj/src/main/assets/emoji/0_1005.png index 90f174b60..910c102d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1005.png and b/TMessagesProj/src/main/assets/emoji/0_1005.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1006.png b/TMessagesProj/src/main/assets/emoji/0_1006.png index 930424571..0fc48d1b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1006.png and b/TMessagesProj/src/main/assets/emoji/0_1006.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1007.png b/TMessagesProj/src/main/assets/emoji/0_1007.png index f1ccf1b67..168b08a74 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1007.png and b/TMessagesProj/src/main/assets/emoji/0_1007.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1008.png b/TMessagesProj/src/main/assets/emoji/0_1008.png index c225fe0f7..b45474755 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1008.png and b/TMessagesProj/src/main/assets/emoji/0_1008.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1009.png b/TMessagesProj/src/main/assets/emoji/0_1009.png index 84341a614..e05df8e70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1009.png and b/TMessagesProj/src/main/assets/emoji/0_1009.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_101.png b/TMessagesProj/src/main/assets/emoji/0_101.png index d26e60ae3..15366e61a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_101.png and b/TMessagesProj/src/main/assets/emoji/0_101.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1010.png b/TMessagesProj/src/main/assets/emoji/0_1010.png index 5f5dcfcd8..1ddfb276a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1010.png and b/TMessagesProj/src/main/assets/emoji/0_1010.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1011.png b/TMessagesProj/src/main/assets/emoji/0_1011.png index 1323993c7..ba76ed72d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1011.png and b/TMessagesProj/src/main/assets/emoji/0_1011.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1012.png b/TMessagesProj/src/main/assets/emoji/0_1012.png index 92773cb05..5772774ca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1012.png and b/TMessagesProj/src/main/assets/emoji/0_1012.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1013.png b/TMessagesProj/src/main/assets/emoji/0_1013.png index b3f7012cb..36bc80de9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1013.png and b/TMessagesProj/src/main/assets/emoji/0_1013.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1014.png b/TMessagesProj/src/main/assets/emoji/0_1014.png index df045504e..da34c7aff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1014.png and b/TMessagesProj/src/main/assets/emoji/0_1014.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1015.png b/TMessagesProj/src/main/assets/emoji/0_1015.png index 692649aa7..936f066d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1015.png and b/TMessagesProj/src/main/assets/emoji/0_1015.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1016.png b/TMessagesProj/src/main/assets/emoji/0_1016.png index 1a1a53075..94a3c3058 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1016.png and b/TMessagesProj/src/main/assets/emoji/0_1016.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1017.png b/TMessagesProj/src/main/assets/emoji/0_1017.png index 4dada7c13..7033acc72 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1017.png and b/TMessagesProj/src/main/assets/emoji/0_1017.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1018.png b/TMessagesProj/src/main/assets/emoji/0_1018.png index 316c80ef8..5469a7458 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1018.png and b/TMessagesProj/src/main/assets/emoji/0_1018.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1019.png b/TMessagesProj/src/main/assets/emoji/0_1019.png index 992dbfb08..3e52c55d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1019.png and b/TMessagesProj/src/main/assets/emoji/0_1019.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_102.png b/TMessagesProj/src/main/assets/emoji/0_102.png index 15a751f5b..012f5f9e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_102.png and b/TMessagesProj/src/main/assets/emoji/0_102.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1020.png b/TMessagesProj/src/main/assets/emoji/0_1020.png index 9229e0ce7..a81860f65 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1020.png and b/TMessagesProj/src/main/assets/emoji/0_1020.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1021.png b/TMessagesProj/src/main/assets/emoji/0_1021.png index 591937119..1d253707e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1021.png and b/TMessagesProj/src/main/assets/emoji/0_1021.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1022.png b/TMessagesProj/src/main/assets/emoji/0_1022.png index 906d249b7..584870e41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1022.png and b/TMessagesProj/src/main/assets/emoji/0_1022.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1023.png b/TMessagesProj/src/main/assets/emoji/0_1023.png index 3c330156f..8c1bf99e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1023.png and b/TMessagesProj/src/main/assets/emoji/0_1023.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1024.png b/TMessagesProj/src/main/assets/emoji/0_1024.png index 1482c83dc..b3cffcfce 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1024.png and b/TMessagesProj/src/main/assets/emoji/0_1024.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1025.png b/TMessagesProj/src/main/assets/emoji/0_1025.png index 2020f05a7..09c866cf1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1025.png and b/TMessagesProj/src/main/assets/emoji/0_1025.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1026.png b/TMessagesProj/src/main/assets/emoji/0_1026.png index b18703b44..15ae8917d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1026.png and b/TMessagesProj/src/main/assets/emoji/0_1026.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1027.png b/TMessagesProj/src/main/assets/emoji/0_1027.png index 79349c327..1bb44ecb4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1027.png and b/TMessagesProj/src/main/assets/emoji/0_1027.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1028.png b/TMessagesProj/src/main/assets/emoji/0_1028.png index d4e6e86dd..b4c81a687 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1028.png and b/TMessagesProj/src/main/assets/emoji/0_1028.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1029.png b/TMessagesProj/src/main/assets/emoji/0_1029.png index ec2aea024..c130299b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1029.png and b/TMessagesProj/src/main/assets/emoji/0_1029.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_103.png b/TMessagesProj/src/main/assets/emoji/0_103.png index 94f101501..bba6e358e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_103.png and b/TMessagesProj/src/main/assets/emoji/0_103.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1030.png b/TMessagesProj/src/main/assets/emoji/0_1030.png index a336013cd..dc4c65368 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1030.png and b/TMessagesProj/src/main/assets/emoji/0_1030.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1031.png b/TMessagesProj/src/main/assets/emoji/0_1031.png index 48825e09f..c0b005360 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1031.png and b/TMessagesProj/src/main/assets/emoji/0_1031.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1032.png b/TMessagesProj/src/main/assets/emoji/0_1032.png index d8419ddd4..fade91c11 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1032.png and b/TMessagesProj/src/main/assets/emoji/0_1032.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1033.png b/TMessagesProj/src/main/assets/emoji/0_1033.png index f35ef8e25..f2e217b26 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1033.png and b/TMessagesProj/src/main/assets/emoji/0_1033.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1034.png b/TMessagesProj/src/main/assets/emoji/0_1034.png index 1fb589906..7c0bcd436 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1034.png and b/TMessagesProj/src/main/assets/emoji/0_1034.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1035.png b/TMessagesProj/src/main/assets/emoji/0_1035.png index 1248aa87d..d678e48d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1035.png and b/TMessagesProj/src/main/assets/emoji/0_1035.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1036.png b/TMessagesProj/src/main/assets/emoji/0_1036.png index 599412049..5ccb4d0c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1036.png and b/TMessagesProj/src/main/assets/emoji/0_1036.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1037.png b/TMessagesProj/src/main/assets/emoji/0_1037.png index 822b4d3b5..2c441c138 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1037.png and b/TMessagesProj/src/main/assets/emoji/0_1037.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1038.png b/TMessagesProj/src/main/assets/emoji/0_1038.png index 167e6809f..25e4143d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1038.png and b/TMessagesProj/src/main/assets/emoji/0_1038.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1039.png b/TMessagesProj/src/main/assets/emoji/0_1039.png index 43da8e18d..8dcec8f13 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1039.png and b/TMessagesProj/src/main/assets/emoji/0_1039.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_104.png b/TMessagesProj/src/main/assets/emoji/0_104.png index c60382dfc..7ab804da2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_104.png and b/TMessagesProj/src/main/assets/emoji/0_104.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1040.png b/TMessagesProj/src/main/assets/emoji/0_1040.png index 52caadbab..663a81c69 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1040.png and b/TMessagesProj/src/main/assets/emoji/0_1040.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1041.png b/TMessagesProj/src/main/assets/emoji/0_1041.png index 22f4678e1..6349731e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1041.png and b/TMessagesProj/src/main/assets/emoji/0_1041.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1042.png b/TMessagesProj/src/main/assets/emoji/0_1042.png index f57009fed..b2f2ebe15 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1042.png and b/TMessagesProj/src/main/assets/emoji/0_1042.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1043.png b/TMessagesProj/src/main/assets/emoji/0_1043.png index 3bd836903..f9117ce2a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1043.png and b/TMessagesProj/src/main/assets/emoji/0_1043.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1044.png b/TMessagesProj/src/main/assets/emoji/0_1044.png index d776b8796..87386ff0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1044.png and b/TMessagesProj/src/main/assets/emoji/0_1044.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1045.png b/TMessagesProj/src/main/assets/emoji/0_1045.png index a66e443b0..8c475fa0a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1045.png and b/TMessagesProj/src/main/assets/emoji/0_1045.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1046.png b/TMessagesProj/src/main/assets/emoji/0_1046.png index 3f0b79df1..7f687f5b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1046.png and b/TMessagesProj/src/main/assets/emoji/0_1046.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1047.png b/TMessagesProj/src/main/assets/emoji/0_1047.png index a3a599d08..e97b5832d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1047.png and b/TMessagesProj/src/main/assets/emoji/0_1047.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1048.png b/TMessagesProj/src/main/assets/emoji/0_1048.png index 5b99bdf91..054678d9b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1048.png and b/TMessagesProj/src/main/assets/emoji/0_1048.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1049.png b/TMessagesProj/src/main/assets/emoji/0_1049.png index 5d08f8a1b..6150b8df3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1049.png and b/TMessagesProj/src/main/assets/emoji/0_1049.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_105.png b/TMessagesProj/src/main/assets/emoji/0_105.png index 5aed64bc6..63e73b219 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_105.png and b/TMessagesProj/src/main/assets/emoji/0_105.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1050.png b/TMessagesProj/src/main/assets/emoji/0_1050.png index fa045231d..f977cf67c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1050.png and b/TMessagesProj/src/main/assets/emoji/0_1050.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1051.png b/TMessagesProj/src/main/assets/emoji/0_1051.png index 9c03876d6..ad30c0d1c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1051.png and b/TMessagesProj/src/main/assets/emoji/0_1051.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1052.png b/TMessagesProj/src/main/assets/emoji/0_1052.png index 74ccbddb3..98fc53441 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1052.png and b/TMessagesProj/src/main/assets/emoji/0_1052.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1053.png b/TMessagesProj/src/main/assets/emoji/0_1053.png index 8d9c3d411..4ed5ffc1e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1053.png and b/TMessagesProj/src/main/assets/emoji/0_1053.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1054.png b/TMessagesProj/src/main/assets/emoji/0_1054.png index b0b29b83f..b9db35b66 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1054.png and b/TMessagesProj/src/main/assets/emoji/0_1054.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1055.png b/TMessagesProj/src/main/assets/emoji/0_1055.png index 4fb8cb32e..238c1cd2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1055.png and b/TMessagesProj/src/main/assets/emoji/0_1055.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1056.png b/TMessagesProj/src/main/assets/emoji/0_1056.png index 336f74516..a42c75871 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1056.png and b/TMessagesProj/src/main/assets/emoji/0_1056.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1057.png b/TMessagesProj/src/main/assets/emoji/0_1057.png index a1e604425..00f78a112 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1057.png and b/TMessagesProj/src/main/assets/emoji/0_1057.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1058.png b/TMessagesProj/src/main/assets/emoji/0_1058.png index 83aa32c16..fa0edbc84 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1058.png and b/TMessagesProj/src/main/assets/emoji/0_1058.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1059.png b/TMessagesProj/src/main/assets/emoji/0_1059.png index 3ad890451..5a43e5622 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1059.png and b/TMessagesProj/src/main/assets/emoji/0_1059.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_106.png b/TMessagesProj/src/main/assets/emoji/0_106.png index 25661d228..af2088327 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_106.png and b/TMessagesProj/src/main/assets/emoji/0_106.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1060.png b/TMessagesProj/src/main/assets/emoji/0_1060.png index a600c6d64..750e6f478 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1060.png and b/TMessagesProj/src/main/assets/emoji/0_1060.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1061.png b/TMessagesProj/src/main/assets/emoji/0_1061.png index b9d77231c..31cc59de2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1061.png and b/TMessagesProj/src/main/assets/emoji/0_1061.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1062.png b/TMessagesProj/src/main/assets/emoji/0_1062.png index 432fabc9e..9cb9f8976 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1062.png and b/TMessagesProj/src/main/assets/emoji/0_1062.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1063.png b/TMessagesProj/src/main/assets/emoji/0_1063.png index f31f82640..66ab2c34e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1063.png and b/TMessagesProj/src/main/assets/emoji/0_1063.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1064.png b/TMessagesProj/src/main/assets/emoji/0_1064.png index eda08953b..b8c6987db 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1064.png and b/TMessagesProj/src/main/assets/emoji/0_1064.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1065.png b/TMessagesProj/src/main/assets/emoji/0_1065.png index c5a0a28c1..93e315d8d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1065.png and b/TMessagesProj/src/main/assets/emoji/0_1065.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1066.png b/TMessagesProj/src/main/assets/emoji/0_1066.png index f9e5531a7..7969dc610 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1066.png and b/TMessagesProj/src/main/assets/emoji/0_1066.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1067.png b/TMessagesProj/src/main/assets/emoji/0_1067.png index 3e9867b9e..a419f9cc7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1067.png and b/TMessagesProj/src/main/assets/emoji/0_1067.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1068.png b/TMessagesProj/src/main/assets/emoji/0_1068.png index cfe979fdd..c4da1a472 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1068.png and b/TMessagesProj/src/main/assets/emoji/0_1068.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1069.png b/TMessagesProj/src/main/assets/emoji/0_1069.png index 92b944cd0..e50fe369b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1069.png and b/TMessagesProj/src/main/assets/emoji/0_1069.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_107.png b/TMessagesProj/src/main/assets/emoji/0_107.png index 61ba27587..63145fe4a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_107.png and b/TMessagesProj/src/main/assets/emoji/0_107.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1070.png b/TMessagesProj/src/main/assets/emoji/0_1070.png index 5e5343ddf..db7fbde2f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1070.png and b/TMessagesProj/src/main/assets/emoji/0_1070.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1071.png b/TMessagesProj/src/main/assets/emoji/0_1071.png index a986cb9d4..4972a1c55 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1071.png and b/TMessagesProj/src/main/assets/emoji/0_1071.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1072.png b/TMessagesProj/src/main/assets/emoji/0_1072.png index 094fe64a2..3578cc068 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1072.png and b/TMessagesProj/src/main/assets/emoji/0_1072.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1073.png b/TMessagesProj/src/main/assets/emoji/0_1073.png index 6c078b7c4..3155dd71b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1073.png and b/TMessagesProj/src/main/assets/emoji/0_1073.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1074.png b/TMessagesProj/src/main/assets/emoji/0_1074.png index fe27c23f0..a2283c78a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1074.png and b/TMessagesProj/src/main/assets/emoji/0_1074.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1075.png b/TMessagesProj/src/main/assets/emoji/0_1075.png index 898fafb47..1e9029a28 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1075.png and b/TMessagesProj/src/main/assets/emoji/0_1075.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1076.png b/TMessagesProj/src/main/assets/emoji/0_1076.png index d597207f2..c23b2229b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1076.png and b/TMessagesProj/src/main/assets/emoji/0_1076.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1077.png b/TMessagesProj/src/main/assets/emoji/0_1077.png index 3d2921d92..d6afd5002 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1077.png and b/TMessagesProj/src/main/assets/emoji/0_1077.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1078.png b/TMessagesProj/src/main/assets/emoji/0_1078.png index cd840c27f..f1caa7b73 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1078.png and b/TMessagesProj/src/main/assets/emoji/0_1078.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1079.png b/TMessagesProj/src/main/assets/emoji/0_1079.png index d5209e1b2..df9977e02 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1079.png and b/TMessagesProj/src/main/assets/emoji/0_1079.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_108.png b/TMessagesProj/src/main/assets/emoji/0_108.png index c69ef93bf..a6cca4aee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_108.png and b/TMessagesProj/src/main/assets/emoji/0_108.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1080.png b/TMessagesProj/src/main/assets/emoji/0_1080.png index 5a53533eb..128d24a6a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1080.png and b/TMessagesProj/src/main/assets/emoji/0_1080.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1081.png b/TMessagesProj/src/main/assets/emoji/0_1081.png index d2f23824f..e5c64f36b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1081.png and b/TMessagesProj/src/main/assets/emoji/0_1081.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1082.png b/TMessagesProj/src/main/assets/emoji/0_1082.png index fcf663e29..b6a710b43 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1082.png and b/TMessagesProj/src/main/assets/emoji/0_1082.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1083.png b/TMessagesProj/src/main/assets/emoji/0_1083.png index a841bd07f..078e9a4b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1083.png and b/TMessagesProj/src/main/assets/emoji/0_1083.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1084.png b/TMessagesProj/src/main/assets/emoji/0_1084.png index 8e2044ddc..2d380306f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1084.png and b/TMessagesProj/src/main/assets/emoji/0_1084.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1085.png b/TMessagesProj/src/main/assets/emoji/0_1085.png index 328a2e062..eb9acdd2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1085.png and b/TMessagesProj/src/main/assets/emoji/0_1085.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1086.png b/TMessagesProj/src/main/assets/emoji/0_1086.png index 65507998e..194fec1c5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1086.png and b/TMessagesProj/src/main/assets/emoji/0_1086.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1087.png b/TMessagesProj/src/main/assets/emoji/0_1087.png index 2c6ab9bcf..f4a4cdae3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1087.png and b/TMessagesProj/src/main/assets/emoji/0_1087.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1088.png b/TMessagesProj/src/main/assets/emoji/0_1088.png index ccf484fe5..c5fcf7f6f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1088.png and b/TMessagesProj/src/main/assets/emoji/0_1088.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1089.png b/TMessagesProj/src/main/assets/emoji/0_1089.png index 8728b83ba..79e6169ab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1089.png and b/TMessagesProj/src/main/assets/emoji/0_1089.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_109.png b/TMessagesProj/src/main/assets/emoji/0_109.png index 95f6c170f..a9187f715 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_109.png and b/TMessagesProj/src/main/assets/emoji/0_109.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1090.png b/TMessagesProj/src/main/assets/emoji/0_1090.png index 4a20531b6..cca2db259 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1090.png and b/TMessagesProj/src/main/assets/emoji/0_1090.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1091.png b/TMessagesProj/src/main/assets/emoji/0_1091.png index e7f15d4ff..e6d69f804 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1091.png and b/TMessagesProj/src/main/assets/emoji/0_1091.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1092.png b/TMessagesProj/src/main/assets/emoji/0_1092.png index 0b17f0126..a86c0a54a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1092.png and b/TMessagesProj/src/main/assets/emoji/0_1092.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1093.png b/TMessagesProj/src/main/assets/emoji/0_1093.png index 6c1052712..3af0ee756 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1093.png and b/TMessagesProj/src/main/assets/emoji/0_1093.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1094.png b/TMessagesProj/src/main/assets/emoji/0_1094.png index 5811a9fc9..ec6c9f349 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1094.png and b/TMessagesProj/src/main/assets/emoji/0_1094.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1095.png b/TMessagesProj/src/main/assets/emoji/0_1095.png index 446bfaad2..4ea0bdaaa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1095.png and b/TMessagesProj/src/main/assets/emoji/0_1095.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1096.png b/TMessagesProj/src/main/assets/emoji/0_1096.png index ed5be6f4c..7ea7d4623 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1096.png and b/TMessagesProj/src/main/assets/emoji/0_1096.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1097.png b/TMessagesProj/src/main/assets/emoji/0_1097.png index 17ba63481..fc9792cae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1097.png and b/TMessagesProj/src/main/assets/emoji/0_1097.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1098.png b/TMessagesProj/src/main/assets/emoji/0_1098.png index ac435e3d7..ffbaccb10 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1098.png and b/TMessagesProj/src/main/assets/emoji/0_1098.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1099.png b/TMessagesProj/src/main/assets/emoji/0_1099.png index 3f2cc656d..f87e31298 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1099.png and b/TMessagesProj/src/main/assets/emoji/0_1099.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_11.png b/TMessagesProj/src/main/assets/emoji/0_11.png index 275f5c7a9..a0c5850b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_11.png and b/TMessagesProj/src/main/assets/emoji/0_11.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_110.png b/TMessagesProj/src/main/assets/emoji/0_110.png index 33db59779..03926b011 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_110.png and b/TMessagesProj/src/main/assets/emoji/0_110.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1100.png b/TMessagesProj/src/main/assets/emoji/0_1100.png index f8fc5576c..c01d751ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1100.png and b/TMessagesProj/src/main/assets/emoji/0_1100.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1101.png b/TMessagesProj/src/main/assets/emoji/0_1101.png index 98a9d790c..cee579644 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1101.png and b/TMessagesProj/src/main/assets/emoji/0_1101.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1102.png b/TMessagesProj/src/main/assets/emoji/0_1102.png index 882cdd723..4d8344c41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1102.png and b/TMessagesProj/src/main/assets/emoji/0_1102.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1103.png b/TMessagesProj/src/main/assets/emoji/0_1103.png index 6e6243ea9..1a6e59beb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1103.png and b/TMessagesProj/src/main/assets/emoji/0_1103.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1104.png b/TMessagesProj/src/main/assets/emoji/0_1104.png index 74764e741..3746021bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1104.png and b/TMessagesProj/src/main/assets/emoji/0_1104.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1105.png b/TMessagesProj/src/main/assets/emoji/0_1105.png index 6b5417857..f0e4e2489 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1105.png and b/TMessagesProj/src/main/assets/emoji/0_1105.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1106.png b/TMessagesProj/src/main/assets/emoji/0_1106.png index 02d459870..699b3414a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1106.png and b/TMessagesProj/src/main/assets/emoji/0_1106.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1107.png b/TMessagesProj/src/main/assets/emoji/0_1107.png index a60200355..0f31e8de9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1107.png and b/TMessagesProj/src/main/assets/emoji/0_1107.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1108.png b/TMessagesProj/src/main/assets/emoji/0_1108.png index dd87cdaba..44d5a5729 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1108.png and b/TMessagesProj/src/main/assets/emoji/0_1108.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1109.png b/TMessagesProj/src/main/assets/emoji/0_1109.png index 366da32c0..ddec2b002 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1109.png and b/TMessagesProj/src/main/assets/emoji/0_1109.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_111.png b/TMessagesProj/src/main/assets/emoji/0_111.png index 30838f4b2..1230f0b8c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_111.png and b/TMessagesProj/src/main/assets/emoji/0_111.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1110.png b/TMessagesProj/src/main/assets/emoji/0_1110.png index 4a8841fe0..127e12e70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1110.png and b/TMessagesProj/src/main/assets/emoji/0_1110.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1111.png b/TMessagesProj/src/main/assets/emoji/0_1111.png index 7b19e6103..8a80d4972 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1111.png and b/TMessagesProj/src/main/assets/emoji/0_1111.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1112.png b/TMessagesProj/src/main/assets/emoji/0_1112.png index 059451b32..14fe150b7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1112.png and b/TMessagesProj/src/main/assets/emoji/0_1112.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1113.png b/TMessagesProj/src/main/assets/emoji/0_1113.png index bfb4ee7cf..b505f96a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1113.png and b/TMessagesProj/src/main/assets/emoji/0_1113.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1114.png b/TMessagesProj/src/main/assets/emoji/0_1114.png index 033effa12..2b4249ed9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1114.png and b/TMessagesProj/src/main/assets/emoji/0_1114.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1115.png b/TMessagesProj/src/main/assets/emoji/0_1115.png index 9441ff8b3..e48568636 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1115.png and b/TMessagesProj/src/main/assets/emoji/0_1115.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1116.png b/TMessagesProj/src/main/assets/emoji/0_1116.png index 5bec8cbaa..4b81251f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1116.png and b/TMessagesProj/src/main/assets/emoji/0_1116.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1117.png b/TMessagesProj/src/main/assets/emoji/0_1117.png index 52a611d0a..ad011f5fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1117.png and b/TMessagesProj/src/main/assets/emoji/0_1117.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1118.png b/TMessagesProj/src/main/assets/emoji/0_1118.png index 90ccec49a..7fbaf5ebb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1118.png and b/TMessagesProj/src/main/assets/emoji/0_1118.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1119.png b/TMessagesProj/src/main/assets/emoji/0_1119.png index 526d789ec..313cf525c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1119.png and b/TMessagesProj/src/main/assets/emoji/0_1119.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_112.png b/TMessagesProj/src/main/assets/emoji/0_112.png index 2620a740c..530ebe1bd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_112.png and b/TMessagesProj/src/main/assets/emoji/0_112.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1120.png b/TMessagesProj/src/main/assets/emoji/0_1120.png index 92bd17854..ddd4483e8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1120.png and b/TMessagesProj/src/main/assets/emoji/0_1120.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1121.png b/TMessagesProj/src/main/assets/emoji/0_1121.png index 6a9a2d72f..43443e7ec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1121.png and b/TMessagesProj/src/main/assets/emoji/0_1121.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1122.png b/TMessagesProj/src/main/assets/emoji/0_1122.png index 3e216b275..cd9298923 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1122.png and b/TMessagesProj/src/main/assets/emoji/0_1122.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1123.png b/TMessagesProj/src/main/assets/emoji/0_1123.png index 655b4b4a2..78e5d3e16 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1123.png and b/TMessagesProj/src/main/assets/emoji/0_1123.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1124.png b/TMessagesProj/src/main/assets/emoji/0_1124.png index 0917f2cab..40336f228 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1124.png and b/TMessagesProj/src/main/assets/emoji/0_1124.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1125.png b/TMessagesProj/src/main/assets/emoji/0_1125.png index 80781406b..ade2109f8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1125.png and b/TMessagesProj/src/main/assets/emoji/0_1125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1126.png b/TMessagesProj/src/main/assets/emoji/0_1126.png index 964cccb6f..f401a619a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1126.png and b/TMessagesProj/src/main/assets/emoji/0_1126.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1127.png b/TMessagesProj/src/main/assets/emoji/0_1127.png index f31c90f1d..a8112ce40 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1127.png and b/TMessagesProj/src/main/assets/emoji/0_1127.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1128.png b/TMessagesProj/src/main/assets/emoji/0_1128.png index 0573075fb..66bde2e29 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1128.png and b/TMessagesProj/src/main/assets/emoji/0_1128.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1129.png b/TMessagesProj/src/main/assets/emoji/0_1129.png index fa68d3f53..6149bf526 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1129.png and b/TMessagesProj/src/main/assets/emoji/0_1129.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_113.png b/TMessagesProj/src/main/assets/emoji/0_113.png index 0355ae99e..7dcd2ff6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_113.png and b/TMessagesProj/src/main/assets/emoji/0_113.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1130.png b/TMessagesProj/src/main/assets/emoji/0_1130.png index d3caaab55..1f149976b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1130.png and b/TMessagesProj/src/main/assets/emoji/0_1130.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1131.png b/TMessagesProj/src/main/assets/emoji/0_1131.png index 99a7f077c..933bdb1a6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1131.png and b/TMessagesProj/src/main/assets/emoji/0_1131.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1132.png b/TMessagesProj/src/main/assets/emoji/0_1132.png index d5291ed83..102b58aee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1132.png and b/TMessagesProj/src/main/assets/emoji/0_1132.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1133.png b/TMessagesProj/src/main/assets/emoji/0_1133.png index c4a54ff2b..ba15cbe5d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1133.png and b/TMessagesProj/src/main/assets/emoji/0_1133.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1134.png b/TMessagesProj/src/main/assets/emoji/0_1134.png index d3a03b6d0..9a01a2934 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1134.png and b/TMessagesProj/src/main/assets/emoji/0_1134.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1135.png b/TMessagesProj/src/main/assets/emoji/0_1135.png index 3031c0b44..871767984 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1135.png and b/TMessagesProj/src/main/assets/emoji/0_1135.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1136.png b/TMessagesProj/src/main/assets/emoji/0_1136.png index e3a79db5f..dc56584aa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1136.png and b/TMessagesProj/src/main/assets/emoji/0_1136.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1137.png b/TMessagesProj/src/main/assets/emoji/0_1137.png index 891a4da08..15e9b899e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1137.png and b/TMessagesProj/src/main/assets/emoji/0_1137.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1138.png b/TMessagesProj/src/main/assets/emoji/0_1138.png index 4e82b73b9..6d062a396 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1138.png and b/TMessagesProj/src/main/assets/emoji/0_1138.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1139.png b/TMessagesProj/src/main/assets/emoji/0_1139.png index 55db5bd6f..61ab06d46 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1139.png and b/TMessagesProj/src/main/assets/emoji/0_1139.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_114.png b/TMessagesProj/src/main/assets/emoji/0_114.png index 7d7551b20..341fb2f9b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_114.png and b/TMessagesProj/src/main/assets/emoji/0_114.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1140.png b/TMessagesProj/src/main/assets/emoji/0_1140.png index 68d15d6d4..0e2f389c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1140.png and b/TMessagesProj/src/main/assets/emoji/0_1140.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1141.png b/TMessagesProj/src/main/assets/emoji/0_1141.png index d897f924f..5b06731bd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1141.png and b/TMessagesProj/src/main/assets/emoji/0_1141.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1142.png b/TMessagesProj/src/main/assets/emoji/0_1142.png index dadaf8fea..187b1f91c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1142.png and b/TMessagesProj/src/main/assets/emoji/0_1142.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1143.png b/TMessagesProj/src/main/assets/emoji/0_1143.png index e086ea4e2..40a5ef4e0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1143.png and b/TMessagesProj/src/main/assets/emoji/0_1143.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1144.png b/TMessagesProj/src/main/assets/emoji/0_1144.png index 754a54c7a..232178acb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1144.png and b/TMessagesProj/src/main/assets/emoji/0_1144.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1145.png b/TMessagesProj/src/main/assets/emoji/0_1145.png index 348e71cbc..ace82b614 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1145.png and b/TMessagesProj/src/main/assets/emoji/0_1145.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1146.png b/TMessagesProj/src/main/assets/emoji/0_1146.png index 5edfe9e6a..05c96c689 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1146.png and b/TMessagesProj/src/main/assets/emoji/0_1146.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1147.png b/TMessagesProj/src/main/assets/emoji/0_1147.png index ecfdae8cb..87d10c12a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1147.png and b/TMessagesProj/src/main/assets/emoji/0_1147.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1148.png b/TMessagesProj/src/main/assets/emoji/0_1148.png index 7e600fcd3..c0cdbade1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1148.png and b/TMessagesProj/src/main/assets/emoji/0_1148.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1149.png b/TMessagesProj/src/main/assets/emoji/0_1149.png index 9d0d05181..5fe898930 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1149.png and b/TMessagesProj/src/main/assets/emoji/0_1149.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_115.png b/TMessagesProj/src/main/assets/emoji/0_115.png index 1c61e8c89..cd0755864 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_115.png and b/TMessagesProj/src/main/assets/emoji/0_115.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1150.png b/TMessagesProj/src/main/assets/emoji/0_1150.png index 0dcea1fd1..24f128923 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1150.png and b/TMessagesProj/src/main/assets/emoji/0_1150.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1151.png b/TMessagesProj/src/main/assets/emoji/0_1151.png index d5febd3aa..20c377fb3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1151.png and b/TMessagesProj/src/main/assets/emoji/0_1151.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1152.png b/TMessagesProj/src/main/assets/emoji/0_1152.png index 438b1c471..37b09e72a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1152.png and b/TMessagesProj/src/main/assets/emoji/0_1152.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1153.png b/TMessagesProj/src/main/assets/emoji/0_1153.png index b05a8b267..e895d0944 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1153.png and b/TMessagesProj/src/main/assets/emoji/0_1153.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1154.png b/TMessagesProj/src/main/assets/emoji/0_1154.png index 1b4e64e34..2fa67e45d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1154.png and b/TMessagesProj/src/main/assets/emoji/0_1154.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1155.png b/TMessagesProj/src/main/assets/emoji/0_1155.png index 9b92501f1..ee1487697 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1155.png and b/TMessagesProj/src/main/assets/emoji/0_1155.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1156.png b/TMessagesProj/src/main/assets/emoji/0_1156.png index 746a036ff..56cfedc84 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1156.png and b/TMessagesProj/src/main/assets/emoji/0_1156.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1157.png b/TMessagesProj/src/main/assets/emoji/0_1157.png index fe4d0f258..c8e432a94 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1157.png and b/TMessagesProj/src/main/assets/emoji/0_1157.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1158.png b/TMessagesProj/src/main/assets/emoji/0_1158.png index 278b44815..b41bdce5a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1158.png and b/TMessagesProj/src/main/assets/emoji/0_1158.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1159.png b/TMessagesProj/src/main/assets/emoji/0_1159.png index ded03640a..96e77ff55 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1159.png and b/TMessagesProj/src/main/assets/emoji/0_1159.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_116.png b/TMessagesProj/src/main/assets/emoji/0_116.png index 5661cea41..80f4ea755 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_116.png and b/TMessagesProj/src/main/assets/emoji/0_116.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1160.png b/TMessagesProj/src/main/assets/emoji/0_1160.png index c34b3deeb..976b649b0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1160.png and b/TMessagesProj/src/main/assets/emoji/0_1160.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1161.png b/TMessagesProj/src/main/assets/emoji/0_1161.png index 46d20f606..5017e1608 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1161.png and b/TMessagesProj/src/main/assets/emoji/0_1161.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1162.png b/TMessagesProj/src/main/assets/emoji/0_1162.png index 8e13e958c..bee1825b7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1162.png and b/TMessagesProj/src/main/assets/emoji/0_1162.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1163.png b/TMessagesProj/src/main/assets/emoji/0_1163.png index 836d73c58..031dc84a1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1163.png and b/TMessagesProj/src/main/assets/emoji/0_1163.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1164.png b/TMessagesProj/src/main/assets/emoji/0_1164.png index 6798996f1..0415e6859 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1164.png and b/TMessagesProj/src/main/assets/emoji/0_1164.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1165.png b/TMessagesProj/src/main/assets/emoji/0_1165.png index 4ec3deccd..81aced287 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1165.png and b/TMessagesProj/src/main/assets/emoji/0_1165.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1166.png b/TMessagesProj/src/main/assets/emoji/0_1166.png index 6ee256687..819680f4b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1166.png and b/TMessagesProj/src/main/assets/emoji/0_1166.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1167.png b/TMessagesProj/src/main/assets/emoji/0_1167.png index 123fea5f4..9bdd32f12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1167.png and b/TMessagesProj/src/main/assets/emoji/0_1167.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1168.png b/TMessagesProj/src/main/assets/emoji/0_1168.png index b3c45e48e..14cb09de5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1168.png and b/TMessagesProj/src/main/assets/emoji/0_1168.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1169.png b/TMessagesProj/src/main/assets/emoji/0_1169.png index 9cd05edcb..a996baf76 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1169.png and b/TMessagesProj/src/main/assets/emoji/0_1169.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_117.png b/TMessagesProj/src/main/assets/emoji/0_117.png index d50752647..cc7de0cbb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_117.png and b/TMessagesProj/src/main/assets/emoji/0_117.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1170.png b/TMessagesProj/src/main/assets/emoji/0_1170.png index dc10f69e1..84bce55fd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1170.png and b/TMessagesProj/src/main/assets/emoji/0_1170.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1171.png b/TMessagesProj/src/main/assets/emoji/0_1171.png index 7f7f20469..5f8eea8ae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1171.png and b/TMessagesProj/src/main/assets/emoji/0_1171.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1172.png b/TMessagesProj/src/main/assets/emoji/0_1172.png index 54e2a9d44..521d6631d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1172.png and b/TMessagesProj/src/main/assets/emoji/0_1172.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1173.png b/TMessagesProj/src/main/assets/emoji/0_1173.png index 422a1d393..a56dd076f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1173.png and b/TMessagesProj/src/main/assets/emoji/0_1173.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1174.png b/TMessagesProj/src/main/assets/emoji/0_1174.png index 8b1794515..73d5e7ca6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1174.png and b/TMessagesProj/src/main/assets/emoji/0_1174.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1175.png b/TMessagesProj/src/main/assets/emoji/0_1175.png index 7a1bb4ac0..a0c7f3b84 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1175.png and b/TMessagesProj/src/main/assets/emoji/0_1175.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1176.png b/TMessagesProj/src/main/assets/emoji/0_1176.png index 127ddc27b..8c16f2ad9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1176.png and b/TMessagesProj/src/main/assets/emoji/0_1176.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1177.png b/TMessagesProj/src/main/assets/emoji/0_1177.png index 07e722e79..5147a17f8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1177.png and b/TMessagesProj/src/main/assets/emoji/0_1177.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1178.png b/TMessagesProj/src/main/assets/emoji/0_1178.png index d58bb67e3..766d171a7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1178.png and b/TMessagesProj/src/main/assets/emoji/0_1178.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1179.png b/TMessagesProj/src/main/assets/emoji/0_1179.png index b7277feda..a0dfaac2d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1179.png and b/TMessagesProj/src/main/assets/emoji/0_1179.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_118.png b/TMessagesProj/src/main/assets/emoji/0_118.png index efd3d1ec1..211fe9244 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_118.png and b/TMessagesProj/src/main/assets/emoji/0_118.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1180.png b/TMessagesProj/src/main/assets/emoji/0_1180.png index 7d6cbf08c..a034bf63f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1180.png and b/TMessagesProj/src/main/assets/emoji/0_1180.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1181.png b/TMessagesProj/src/main/assets/emoji/0_1181.png index f2eac8368..60e2c2ec0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1181.png and b/TMessagesProj/src/main/assets/emoji/0_1181.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1182.png b/TMessagesProj/src/main/assets/emoji/0_1182.png index a9b6eeb5f..3d7e72520 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1182.png and b/TMessagesProj/src/main/assets/emoji/0_1182.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1183.png b/TMessagesProj/src/main/assets/emoji/0_1183.png index f9ffc15d2..33471c8fe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1183.png and b/TMessagesProj/src/main/assets/emoji/0_1183.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1184.png b/TMessagesProj/src/main/assets/emoji/0_1184.png index bdebfd0ad..083dd0860 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1184.png and b/TMessagesProj/src/main/assets/emoji/0_1184.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1185.png b/TMessagesProj/src/main/assets/emoji/0_1185.png index be6a5e6a4..bdfc459ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1185.png and b/TMessagesProj/src/main/assets/emoji/0_1185.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1186.png b/TMessagesProj/src/main/assets/emoji/0_1186.png index 19c2802fe..dc01face5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1186.png and b/TMessagesProj/src/main/assets/emoji/0_1186.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1187.png b/TMessagesProj/src/main/assets/emoji/0_1187.png index 59acd587d..5a6a74527 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1187.png and b/TMessagesProj/src/main/assets/emoji/0_1187.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1188.png b/TMessagesProj/src/main/assets/emoji/0_1188.png index bda3f1f60..76ba2532e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1188.png and b/TMessagesProj/src/main/assets/emoji/0_1188.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1189.png b/TMessagesProj/src/main/assets/emoji/0_1189.png index 070628f76..54b3584b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1189.png and b/TMessagesProj/src/main/assets/emoji/0_1189.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_119.png b/TMessagesProj/src/main/assets/emoji/0_119.png index 880f93f60..bce837d7a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_119.png and b/TMessagesProj/src/main/assets/emoji/0_119.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1190.png b/TMessagesProj/src/main/assets/emoji/0_1190.png index 3cfc376e4..f684f9664 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1190.png and b/TMessagesProj/src/main/assets/emoji/0_1190.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1191.png b/TMessagesProj/src/main/assets/emoji/0_1191.png index 377c7ab54..7dd7229cf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1191.png and b/TMessagesProj/src/main/assets/emoji/0_1191.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1192.png b/TMessagesProj/src/main/assets/emoji/0_1192.png index 77b5b7318..e50b28e91 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1192.png and b/TMessagesProj/src/main/assets/emoji/0_1192.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1193.png b/TMessagesProj/src/main/assets/emoji/0_1193.png index ecf94f100..5431a43b8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1193.png and b/TMessagesProj/src/main/assets/emoji/0_1193.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1194.png b/TMessagesProj/src/main/assets/emoji/0_1194.png index 7c3235bff..3f5066c05 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1194.png and b/TMessagesProj/src/main/assets/emoji/0_1194.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1195.png b/TMessagesProj/src/main/assets/emoji/0_1195.png index eebee24a7..e17f3137b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1195.png and b/TMessagesProj/src/main/assets/emoji/0_1195.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1196.png b/TMessagesProj/src/main/assets/emoji/0_1196.png index 5907f0a04..ee7fe3d7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1196.png and b/TMessagesProj/src/main/assets/emoji/0_1196.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1197.png b/TMessagesProj/src/main/assets/emoji/0_1197.png index 34b9911db..1532a332a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1197.png and b/TMessagesProj/src/main/assets/emoji/0_1197.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1198.png b/TMessagesProj/src/main/assets/emoji/0_1198.png index d8108897e..a52b00979 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1198.png and b/TMessagesProj/src/main/assets/emoji/0_1198.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1199.png b/TMessagesProj/src/main/assets/emoji/0_1199.png index 51ad2311d..d54236626 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1199.png and b/TMessagesProj/src/main/assets/emoji/0_1199.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_12.png b/TMessagesProj/src/main/assets/emoji/0_12.png index 08675733e..45699ea1c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_12.png and b/TMessagesProj/src/main/assets/emoji/0_12.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_120.png b/TMessagesProj/src/main/assets/emoji/0_120.png index c07d5d1e2..ccf646e44 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_120.png and b/TMessagesProj/src/main/assets/emoji/0_120.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1200.png b/TMessagesProj/src/main/assets/emoji/0_1200.png index 0d2ba7b23..6f5f1be9f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1200.png and b/TMessagesProj/src/main/assets/emoji/0_1200.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1201.png b/TMessagesProj/src/main/assets/emoji/0_1201.png index 420a14a36..53fbd2915 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1201.png and b/TMessagesProj/src/main/assets/emoji/0_1201.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1202.png b/TMessagesProj/src/main/assets/emoji/0_1202.png index 09fd601dc..f9e50ff9c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1202.png and b/TMessagesProj/src/main/assets/emoji/0_1202.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1203.png b/TMessagesProj/src/main/assets/emoji/0_1203.png index 0df86446f..acf75c440 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1203.png and b/TMessagesProj/src/main/assets/emoji/0_1203.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1204.png b/TMessagesProj/src/main/assets/emoji/0_1204.png index 496840d5b..80905968c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1204.png and b/TMessagesProj/src/main/assets/emoji/0_1204.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1205.png b/TMessagesProj/src/main/assets/emoji/0_1205.png index f2b951d0c..4aeaf3308 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1205.png and b/TMessagesProj/src/main/assets/emoji/0_1205.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1206.png b/TMessagesProj/src/main/assets/emoji/0_1206.png index 0f28d769f..6d8d3740c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1206.png and b/TMessagesProj/src/main/assets/emoji/0_1206.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1207.png b/TMessagesProj/src/main/assets/emoji/0_1207.png index 4df6c2a21..ae0ec37af 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1207.png and b/TMessagesProj/src/main/assets/emoji/0_1207.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1208.png b/TMessagesProj/src/main/assets/emoji/0_1208.png index 35a675dce..e0ca6591b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1208.png and b/TMessagesProj/src/main/assets/emoji/0_1208.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1209.png b/TMessagesProj/src/main/assets/emoji/0_1209.png index 31bcbf81b..d355f077b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1209.png and b/TMessagesProj/src/main/assets/emoji/0_1209.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_121.png b/TMessagesProj/src/main/assets/emoji/0_121.png index 0ec4e1794..c3431ad5b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_121.png and b/TMessagesProj/src/main/assets/emoji/0_121.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1210.png b/TMessagesProj/src/main/assets/emoji/0_1210.png index 55bcfa35c..106fa23df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1210.png and b/TMessagesProj/src/main/assets/emoji/0_1210.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1211.png b/TMessagesProj/src/main/assets/emoji/0_1211.png index aac2a9ab4..7c4af086a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1211.png and b/TMessagesProj/src/main/assets/emoji/0_1211.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1212.png b/TMessagesProj/src/main/assets/emoji/0_1212.png index 46da51e6b..91150f8f5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1212.png and b/TMessagesProj/src/main/assets/emoji/0_1212.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1213.png b/TMessagesProj/src/main/assets/emoji/0_1213.png index b064b3813..2ef4e70c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1213.png and b/TMessagesProj/src/main/assets/emoji/0_1213.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1214.png b/TMessagesProj/src/main/assets/emoji/0_1214.png index 1f5ff3938..04ba3ab15 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1214.png and b/TMessagesProj/src/main/assets/emoji/0_1214.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1215.png b/TMessagesProj/src/main/assets/emoji/0_1215.png index e42d33d84..ed1e380a4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1215.png and b/TMessagesProj/src/main/assets/emoji/0_1215.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1216.png b/TMessagesProj/src/main/assets/emoji/0_1216.png index b3d9e7a88..36a1ce329 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1216.png and b/TMessagesProj/src/main/assets/emoji/0_1216.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1217.png b/TMessagesProj/src/main/assets/emoji/0_1217.png index a133cc9f7..8f75e33a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1217.png and b/TMessagesProj/src/main/assets/emoji/0_1217.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1218.png b/TMessagesProj/src/main/assets/emoji/0_1218.png index 4409d57fd..dfe583b4a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1218.png and b/TMessagesProj/src/main/assets/emoji/0_1218.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1219.png b/TMessagesProj/src/main/assets/emoji/0_1219.png index 326898686..5acc0f7ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1219.png and b/TMessagesProj/src/main/assets/emoji/0_1219.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_122.png b/TMessagesProj/src/main/assets/emoji/0_122.png index d42158369..a142c167b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_122.png and b/TMessagesProj/src/main/assets/emoji/0_122.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1220.png b/TMessagesProj/src/main/assets/emoji/0_1220.png index 3c81d5da5..fb9f94c2a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1220.png and b/TMessagesProj/src/main/assets/emoji/0_1220.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1221.png b/TMessagesProj/src/main/assets/emoji/0_1221.png index 092be145d..10d62b23c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1221.png and b/TMessagesProj/src/main/assets/emoji/0_1221.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1222.png b/TMessagesProj/src/main/assets/emoji/0_1222.png index 706efef5f..1e30568f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1222.png and b/TMessagesProj/src/main/assets/emoji/0_1222.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1223.png b/TMessagesProj/src/main/assets/emoji/0_1223.png index 889522947..fa03141e8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1223.png and b/TMessagesProj/src/main/assets/emoji/0_1223.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1224.png b/TMessagesProj/src/main/assets/emoji/0_1224.png index a75abcac7..472052cf3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1224.png and b/TMessagesProj/src/main/assets/emoji/0_1224.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1225.png b/TMessagesProj/src/main/assets/emoji/0_1225.png index d9dc1aefa..18dbe4b94 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1225.png and b/TMessagesProj/src/main/assets/emoji/0_1225.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1226.png b/TMessagesProj/src/main/assets/emoji/0_1226.png index 0fb5a4e18..6522e18a7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1226.png and b/TMessagesProj/src/main/assets/emoji/0_1226.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1227.png b/TMessagesProj/src/main/assets/emoji/0_1227.png index 653cf9b9a..4315668ea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1227.png and b/TMessagesProj/src/main/assets/emoji/0_1227.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1228.png b/TMessagesProj/src/main/assets/emoji/0_1228.png index 133f37f23..d79370739 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1228.png and b/TMessagesProj/src/main/assets/emoji/0_1228.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1229.png b/TMessagesProj/src/main/assets/emoji/0_1229.png index 873771537..f015d14dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1229.png and b/TMessagesProj/src/main/assets/emoji/0_1229.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_123.png b/TMessagesProj/src/main/assets/emoji/0_123.png index de5ea75d9..232d3d5e4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_123.png and b/TMessagesProj/src/main/assets/emoji/0_123.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1230.png b/TMessagesProj/src/main/assets/emoji/0_1230.png index 909f977c7..7f1d59831 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1230.png and b/TMessagesProj/src/main/assets/emoji/0_1230.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1231.png b/TMessagesProj/src/main/assets/emoji/0_1231.png index e155aded6..465c2de5d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1231.png and b/TMessagesProj/src/main/assets/emoji/0_1231.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1232.png b/TMessagesProj/src/main/assets/emoji/0_1232.png index c0117ede2..a3fb8bd2f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1232.png and b/TMessagesProj/src/main/assets/emoji/0_1232.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1233.png b/TMessagesProj/src/main/assets/emoji/0_1233.png index a65b94ba6..587656e97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1233.png and b/TMessagesProj/src/main/assets/emoji/0_1233.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1234.png b/TMessagesProj/src/main/assets/emoji/0_1234.png index c9577f7e5..f5e6c5f01 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1234.png and b/TMessagesProj/src/main/assets/emoji/0_1234.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1235.png b/TMessagesProj/src/main/assets/emoji/0_1235.png index 0b2a50e18..3735e21da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1235.png and b/TMessagesProj/src/main/assets/emoji/0_1235.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1236.png b/TMessagesProj/src/main/assets/emoji/0_1236.png index d846d11a1..50e1c793c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1236.png and b/TMessagesProj/src/main/assets/emoji/0_1236.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1237.png b/TMessagesProj/src/main/assets/emoji/0_1237.png index 30c6e8a1b..256c518c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1237.png and b/TMessagesProj/src/main/assets/emoji/0_1237.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1238.png b/TMessagesProj/src/main/assets/emoji/0_1238.png index 6767727c6..fe109d33f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1238.png and b/TMessagesProj/src/main/assets/emoji/0_1238.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1239.png b/TMessagesProj/src/main/assets/emoji/0_1239.png index 26b82f532..a0e8dddc4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1239.png and b/TMessagesProj/src/main/assets/emoji/0_1239.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_124.png b/TMessagesProj/src/main/assets/emoji/0_124.png index f17ab5ca8..e8889b009 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_124.png and b/TMessagesProj/src/main/assets/emoji/0_124.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1240.png b/TMessagesProj/src/main/assets/emoji/0_1240.png index 84446dc3a..3f712812f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1240.png and b/TMessagesProj/src/main/assets/emoji/0_1240.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1241.png b/TMessagesProj/src/main/assets/emoji/0_1241.png index a83416df4..f8d0e5d82 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1241.png and b/TMessagesProj/src/main/assets/emoji/0_1241.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1242.png b/TMessagesProj/src/main/assets/emoji/0_1242.png index d704252bc..d581f0658 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1242.png and b/TMessagesProj/src/main/assets/emoji/0_1242.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1243.png b/TMessagesProj/src/main/assets/emoji/0_1243.png index 3724491de..27f599377 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1243.png and b/TMessagesProj/src/main/assets/emoji/0_1243.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1244.png b/TMessagesProj/src/main/assets/emoji/0_1244.png index 43bb24368..ae44c3e49 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1244.png and b/TMessagesProj/src/main/assets/emoji/0_1244.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1245.png b/TMessagesProj/src/main/assets/emoji/0_1245.png index 3434af5d2..bb0752a9c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1245.png and b/TMessagesProj/src/main/assets/emoji/0_1245.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1246.png b/TMessagesProj/src/main/assets/emoji/0_1246.png index 5d77c0c59..c7c23f343 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1246.png and b/TMessagesProj/src/main/assets/emoji/0_1246.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1247.png b/TMessagesProj/src/main/assets/emoji/0_1247.png index b7c61b0bc..6da2c9bf9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1247.png and b/TMessagesProj/src/main/assets/emoji/0_1247.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1248.png b/TMessagesProj/src/main/assets/emoji/0_1248.png index 0e360ff6a..a6540bc34 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1248.png and b/TMessagesProj/src/main/assets/emoji/0_1248.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1249.png b/TMessagesProj/src/main/assets/emoji/0_1249.png index 6f06cfa70..e17b8fe9a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1249.png and b/TMessagesProj/src/main/assets/emoji/0_1249.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_125.png b/TMessagesProj/src/main/assets/emoji/0_125.png index c0d0bf7f7..bcc1eb61b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_125.png and b/TMessagesProj/src/main/assets/emoji/0_125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1250.png b/TMessagesProj/src/main/assets/emoji/0_1250.png index 5c9502af6..ce631c5bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1250.png and b/TMessagesProj/src/main/assets/emoji/0_1250.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1251.png b/TMessagesProj/src/main/assets/emoji/0_1251.png index 8c8cdec58..c7db1ed2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1251.png and b/TMessagesProj/src/main/assets/emoji/0_1251.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1252.png b/TMessagesProj/src/main/assets/emoji/0_1252.png index 3df7473ce..3c11c3333 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1252.png and b/TMessagesProj/src/main/assets/emoji/0_1252.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1253.png b/TMessagesProj/src/main/assets/emoji/0_1253.png index 24abff0ef..b430960ab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1253.png and b/TMessagesProj/src/main/assets/emoji/0_1253.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1254.png b/TMessagesProj/src/main/assets/emoji/0_1254.png index be04a6be1..e9f38103c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1254.png and b/TMessagesProj/src/main/assets/emoji/0_1254.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1255.png b/TMessagesProj/src/main/assets/emoji/0_1255.png index 52431d119..244428480 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1255.png and b/TMessagesProj/src/main/assets/emoji/0_1255.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1256.png b/TMessagesProj/src/main/assets/emoji/0_1256.png index f0d32b559..e3164ebb4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1256.png and b/TMessagesProj/src/main/assets/emoji/0_1256.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1257.png b/TMessagesProj/src/main/assets/emoji/0_1257.png index 490d3c4b8..342dd3c00 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1257.png and b/TMessagesProj/src/main/assets/emoji/0_1257.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1258.png b/TMessagesProj/src/main/assets/emoji/0_1258.png index 55d4784ea..e76437ef0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1258.png and b/TMessagesProj/src/main/assets/emoji/0_1258.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1259.png b/TMessagesProj/src/main/assets/emoji/0_1259.png index f81c46231..799ae55e9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1259.png and b/TMessagesProj/src/main/assets/emoji/0_1259.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_126.png b/TMessagesProj/src/main/assets/emoji/0_126.png index 94a8d56fb..186426714 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_126.png and b/TMessagesProj/src/main/assets/emoji/0_126.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1260.png b/TMessagesProj/src/main/assets/emoji/0_1260.png index 5a64860e6..2846d3d24 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1260.png and b/TMessagesProj/src/main/assets/emoji/0_1260.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1261.png b/TMessagesProj/src/main/assets/emoji/0_1261.png index 7e8e8c1fe..6e4b2e1e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1261.png and b/TMessagesProj/src/main/assets/emoji/0_1261.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1262.png b/TMessagesProj/src/main/assets/emoji/0_1262.png index 8547a4d2e..2321cfc10 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1262.png and b/TMessagesProj/src/main/assets/emoji/0_1262.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1263.png b/TMessagesProj/src/main/assets/emoji/0_1263.png index ab87d147e..6062d4aa6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1263.png and b/TMessagesProj/src/main/assets/emoji/0_1263.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1264.png b/TMessagesProj/src/main/assets/emoji/0_1264.png index 489cf19c7..186853217 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1264.png and b/TMessagesProj/src/main/assets/emoji/0_1264.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1265.png b/TMessagesProj/src/main/assets/emoji/0_1265.png index e0f5555bb..4b4a94b3b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1265.png and b/TMessagesProj/src/main/assets/emoji/0_1265.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1266.png b/TMessagesProj/src/main/assets/emoji/0_1266.png index d6221b04f..7c6d9c1b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1266.png and b/TMessagesProj/src/main/assets/emoji/0_1266.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1267.png b/TMessagesProj/src/main/assets/emoji/0_1267.png index 4b28981ed..ca66c1d14 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1267.png and b/TMessagesProj/src/main/assets/emoji/0_1267.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1268.png b/TMessagesProj/src/main/assets/emoji/0_1268.png index cee3b2256..09eba19fa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1268.png and b/TMessagesProj/src/main/assets/emoji/0_1268.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1269.png b/TMessagesProj/src/main/assets/emoji/0_1269.png index 2b3539743..e427e871a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1269.png and b/TMessagesProj/src/main/assets/emoji/0_1269.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_127.png b/TMessagesProj/src/main/assets/emoji/0_127.png index a7d45e2c4..45d7e1191 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_127.png and b/TMessagesProj/src/main/assets/emoji/0_127.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1270.png b/TMessagesProj/src/main/assets/emoji/0_1270.png index 935f51c53..5db0ac8b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1270.png and b/TMessagesProj/src/main/assets/emoji/0_1270.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1271.png b/TMessagesProj/src/main/assets/emoji/0_1271.png index b5d4e2f38..87b0fda70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1271.png and b/TMessagesProj/src/main/assets/emoji/0_1271.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1272.png b/TMessagesProj/src/main/assets/emoji/0_1272.png index 8c6f0caac..325bff039 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1272.png and b/TMessagesProj/src/main/assets/emoji/0_1272.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1273.png b/TMessagesProj/src/main/assets/emoji/0_1273.png index 7809f6972..be76b395c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1273.png and b/TMessagesProj/src/main/assets/emoji/0_1273.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1274.png b/TMessagesProj/src/main/assets/emoji/0_1274.png index 9b3d89d08..87d287338 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1274.png and b/TMessagesProj/src/main/assets/emoji/0_1274.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1275.png b/TMessagesProj/src/main/assets/emoji/0_1275.png index a3a189770..9326f8ecd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1275.png and b/TMessagesProj/src/main/assets/emoji/0_1275.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1276.png b/TMessagesProj/src/main/assets/emoji/0_1276.png index ebf5a3a86..dcf387f36 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1276.png and b/TMessagesProj/src/main/assets/emoji/0_1276.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1277.png b/TMessagesProj/src/main/assets/emoji/0_1277.png index 325591ecc..472a1f45a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1277.png and b/TMessagesProj/src/main/assets/emoji/0_1277.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1278.png b/TMessagesProj/src/main/assets/emoji/0_1278.png index 9df347781..4b9049945 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1278.png and b/TMessagesProj/src/main/assets/emoji/0_1278.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1279.png b/TMessagesProj/src/main/assets/emoji/0_1279.png index c42a84977..afa50e870 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1279.png and b/TMessagesProj/src/main/assets/emoji/0_1279.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_128.png b/TMessagesProj/src/main/assets/emoji/0_128.png index 0dc03573f..1a80bfa36 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_128.png and b/TMessagesProj/src/main/assets/emoji/0_128.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1280.png b/TMessagesProj/src/main/assets/emoji/0_1280.png index 5555672d7..d741b488e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1280.png and b/TMessagesProj/src/main/assets/emoji/0_1280.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1281.png b/TMessagesProj/src/main/assets/emoji/0_1281.png index d3eef14f3..bcd12d2b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1281.png and b/TMessagesProj/src/main/assets/emoji/0_1281.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1282.png b/TMessagesProj/src/main/assets/emoji/0_1282.png index b9335073b..727cac951 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1282.png and b/TMessagesProj/src/main/assets/emoji/0_1282.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1283.png b/TMessagesProj/src/main/assets/emoji/0_1283.png index 675097342..e6f3e931d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1283.png and b/TMessagesProj/src/main/assets/emoji/0_1283.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1284.png b/TMessagesProj/src/main/assets/emoji/0_1284.png index b1076d1c3..8fedcf847 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1284.png and b/TMessagesProj/src/main/assets/emoji/0_1284.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1285.png b/TMessagesProj/src/main/assets/emoji/0_1285.png index 374a87d44..57ebfb898 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1285.png and b/TMessagesProj/src/main/assets/emoji/0_1285.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1286.png b/TMessagesProj/src/main/assets/emoji/0_1286.png index e8d0ae922..2f339acc9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1286.png and b/TMessagesProj/src/main/assets/emoji/0_1286.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1287.png b/TMessagesProj/src/main/assets/emoji/0_1287.png index f1e702c91..5a68fade5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1287.png and b/TMessagesProj/src/main/assets/emoji/0_1287.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1288.png b/TMessagesProj/src/main/assets/emoji/0_1288.png index bfe8340f2..eff6cd894 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1288.png and b/TMessagesProj/src/main/assets/emoji/0_1288.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1289.png b/TMessagesProj/src/main/assets/emoji/0_1289.png index 281529703..ba3f5828d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1289.png and b/TMessagesProj/src/main/assets/emoji/0_1289.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_129.png b/TMessagesProj/src/main/assets/emoji/0_129.png index 6592b8b02..ab293b44a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_129.png and b/TMessagesProj/src/main/assets/emoji/0_129.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1290.png b/TMessagesProj/src/main/assets/emoji/0_1290.png index 93041b04b..e9b78f5c0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1290.png and b/TMessagesProj/src/main/assets/emoji/0_1290.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1291.png b/TMessagesProj/src/main/assets/emoji/0_1291.png index 279353d79..1613f8f3c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1291.png and b/TMessagesProj/src/main/assets/emoji/0_1291.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1292.png b/TMessagesProj/src/main/assets/emoji/0_1292.png index cfef507cb..298e6dee6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1292.png and b/TMessagesProj/src/main/assets/emoji/0_1292.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1293.png b/TMessagesProj/src/main/assets/emoji/0_1293.png index 9c1a13513..24835b0ad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1293.png and b/TMessagesProj/src/main/assets/emoji/0_1293.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1294.png b/TMessagesProj/src/main/assets/emoji/0_1294.png index 2c3b4c292..a941a6f45 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1294.png and b/TMessagesProj/src/main/assets/emoji/0_1294.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1295.png b/TMessagesProj/src/main/assets/emoji/0_1295.png index c3eff5cfa..0c2041ca7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1295.png and b/TMessagesProj/src/main/assets/emoji/0_1295.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1296.png b/TMessagesProj/src/main/assets/emoji/0_1296.png index 892cf2f7c..b7491f0cd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1296.png and b/TMessagesProj/src/main/assets/emoji/0_1296.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1297.png b/TMessagesProj/src/main/assets/emoji/0_1297.png index 6654ee0a9..e96facfb3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1297.png and b/TMessagesProj/src/main/assets/emoji/0_1297.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1298.png b/TMessagesProj/src/main/assets/emoji/0_1298.png index 62629a974..a2240b851 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1298.png and b/TMessagesProj/src/main/assets/emoji/0_1298.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1299.png b/TMessagesProj/src/main/assets/emoji/0_1299.png index a2ef02331..f0137b890 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1299.png and b/TMessagesProj/src/main/assets/emoji/0_1299.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_13.png b/TMessagesProj/src/main/assets/emoji/0_13.png index 972d5d786..47282bc90 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_13.png and b/TMessagesProj/src/main/assets/emoji/0_13.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_130.png b/TMessagesProj/src/main/assets/emoji/0_130.png index 5d5997ab8..7345c6e9c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_130.png and b/TMessagesProj/src/main/assets/emoji/0_130.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1300.png b/TMessagesProj/src/main/assets/emoji/0_1300.png index bdf1f5f47..f6444072e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1300.png and b/TMessagesProj/src/main/assets/emoji/0_1300.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1301.png b/TMessagesProj/src/main/assets/emoji/0_1301.png index 097853269..2d84ea767 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1301.png and b/TMessagesProj/src/main/assets/emoji/0_1301.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1302.png b/TMessagesProj/src/main/assets/emoji/0_1302.png index 12cbf6aed..0842dbc70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1302.png and b/TMessagesProj/src/main/assets/emoji/0_1302.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1303.png b/TMessagesProj/src/main/assets/emoji/0_1303.png index 699388bf6..9ead496b4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1303.png and b/TMessagesProj/src/main/assets/emoji/0_1303.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1304.png b/TMessagesProj/src/main/assets/emoji/0_1304.png index bf1cf6270..d8c11b812 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1304.png and b/TMessagesProj/src/main/assets/emoji/0_1304.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1305.png b/TMessagesProj/src/main/assets/emoji/0_1305.png index f3716a176..00483018f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1305.png and b/TMessagesProj/src/main/assets/emoji/0_1305.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1306.png b/TMessagesProj/src/main/assets/emoji/0_1306.png index ee109b78e..7628c6647 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1306.png and b/TMessagesProj/src/main/assets/emoji/0_1306.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1307.png b/TMessagesProj/src/main/assets/emoji/0_1307.png index 0d80dd33e..e907819d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1307.png and b/TMessagesProj/src/main/assets/emoji/0_1307.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1308.png b/TMessagesProj/src/main/assets/emoji/0_1308.png index 7c5ba958d..40b2a5b66 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1308.png and b/TMessagesProj/src/main/assets/emoji/0_1308.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1309.png b/TMessagesProj/src/main/assets/emoji/0_1309.png index 15cfd7601..bf17c88a5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1309.png and b/TMessagesProj/src/main/assets/emoji/0_1309.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_131.png b/TMessagesProj/src/main/assets/emoji/0_131.png index 04dffd363..7030d4a2e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_131.png and b/TMessagesProj/src/main/assets/emoji/0_131.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1310.png b/TMessagesProj/src/main/assets/emoji/0_1310.png index f95144dcc..4cdfbc280 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1310.png and b/TMessagesProj/src/main/assets/emoji/0_1310.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1311.png b/TMessagesProj/src/main/assets/emoji/0_1311.png index e970feb5d..44562a076 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1311.png and b/TMessagesProj/src/main/assets/emoji/0_1311.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1312.png b/TMessagesProj/src/main/assets/emoji/0_1312.png index 211ee2881..36a55ccbc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1312.png and b/TMessagesProj/src/main/assets/emoji/0_1312.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1313.png b/TMessagesProj/src/main/assets/emoji/0_1313.png index 58acacf7e..34dec6860 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1313.png and b/TMessagesProj/src/main/assets/emoji/0_1313.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1314.png b/TMessagesProj/src/main/assets/emoji/0_1314.png index 6fb116e01..5ee7f996c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1314.png and b/TMessagesProj/src/main/assets/emoji/0_1314.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1315.png b/TMessagesProj/src/main/assets/emoji/0_1315.png index e38b35e73..e170c2190 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1315.png and b/TMessagesProj/src/main/assets/emoji/0_1315.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1316.png b/TMessagesProj/src/main/assets/emoji/0_1316.png index 159c1eead..25afb4055 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1316.png and b/TMessagesProj/src/main/assets/emoji/0_1316.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1317.png b/TMessagesProj/src/main/assets/emoji/0_1317.png index 1334c236c..adbbd2ce3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1317.png and b/TMessagesProj/src/main/assets/emoji/0_1317.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1318.png b/TMessagesProj/src/main/assets/emoji/0_1318.png index adf519eb2..a9ee2751e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1318.png and b/TMessagesProj/src/main/assets/emoji/0_1318.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1319.png b/TMessagesProj/src/main/assets/emoji/0_1319.png index bf7fd0a1e..cb84e5403 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1319.png and b/TMessagesProj/src/main/assets/emoji/0_1319.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_132.png b/TMessagesProj/src/main/assets/emoji/0_132.png index f90a6db3e..228223a46 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_132.png and b/TMessagesProj/src/main/assets/emoji/0_132.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1320.png b/TMessagesProj/src/main/assets/emoji/0_1320.png index 00ce88731..f75c856a6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1320.png and b/TMessagesProj/src/main/assets/emoji/0_1320.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1321.png b/TMessagesProj/src/main/assets/emoji/0_1321.png index 6aa8939a7..161eddd09 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1321.png and b/TMessagesProj/src/main/assets/emoji/0_1321.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1322.png b/TMessagesProj/src/main/assets/emoji/0_1322.png index 2b2e06242..70417e13c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1322.png and b/TMessagesProj/src/main/assets/emoji/0_1322.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1323.png b/TMessagesProj/src/main/assets/emoji/0_1323.png index a70864ff4..1e1242997 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1323.png and b/TMessagesProj/src/main/assets/emoji/0_1323.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1324.png b/TMessagesProj/src/main/assets/emoji/0_1324.png index 2e2d60a22..113c795f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1324.png and b/TMessagesProj/src/main/assets/emoji/0_1324.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1325.png b/TMessagesProj/src/main/assets/emoji/0_1325.png index 9c828afc8..eb8c8612d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1325.png and b/TMessagesProj/src/main/assets/emoji/0_1325.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1326.png b/TMessagesProj/src/main/assets/emoji/0_1326.png index 38ebb52e6..5485e09e5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1326.png and b/TMessagesProj/src/main/assets/emoji/0_1326.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1327.png b/TMessagesProj/src/main/assets/emoji/0_1327.png index 1d27161c9..f4302575a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1327.png and b/TMessagesProj/src/main/assets/emoji/0_1327.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1328.png b/TMessagesProj/src/main/assets/emoji/0_1328.png index a96c6fed4..c962cf585 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1328.png and b/TMessagesProj/src/main/assets/emoji/0_1328.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1329.png b/TMessagesProj/src/main/assets/emoji/0_1329.png index 5acc2599f..e45e92114 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1329.png and b/TMessagesProj/src/main/assets/emoji/0_1329.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_133.png b/TMessagesProj/src/main/assets/emoji/0_133.png index 0ff2ca1bf..399df5985 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_133.png and b/TMessagesProj/src/main/assets/emoji/0_133.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1330.png b/TMessagesProj/src/main/assets/emoji/0_1330.png index 20edf68c6..494a604ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1330.png and b/TMessagesProj/src/main/assets/emoji/0_1330.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1331.png b/TMessagesProj/src/main/assets/emoji/0_1331.png index 2abc20573..7f5af4fca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1331.png and b/TMessagesProj/src/main/assets/emoji/0_1331.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1332.png b/TMessagesProj/src/main/assets/emoji/0_1332.png index debd9e76d..2a47f7f9f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1332.png and b/TMessagesProj/src/main/assets/emoji/0_1332.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1333.png b/TMessagesProj/src/main/assets/emoji/0_1333.png index e9c3fdde0..3141ad175 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1333.png and b/TMessagesProj/src/main/assets/emoji/0_1333.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1334.png b/TMessagesProj/src/main/assets/emoji/0_1334.png index 1627f9370..e0991f87f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1334.png and b/TMessagesProj/src/main/assets/emoji/0_1334.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1335.png b/TMessagesProj/src/main/assets/emoji/0_1335.png index ab304460f..5905544b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1335.png and b/TMessagesProj/src/main/assets/emoji/0_1335.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1336.png b/TMessagesProj/src/main/assets/emoji/0_1336.png index 4db6405ca..3ab4b6493 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1336.png and b/TMessagesProj/src/main/assets/emoji/0_1336.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1337.png b/TMessagesProj/src/main/assets/emoji/0_1337.png index a510d6cdd..253b174ef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1337.png and b/TMessagesProj/src/main/assets/emoji/0_1337.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1338.png b/TMessagesProj/src/main/assets/emoji/0_1338.png index e2a07172a..60ccbb33e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1338.png and b/TMessagesProj/src/main/assets/emoji/0_1338.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1339.png b/TMessagesProj/src/main/assets/emoji/0_1339.png index a424b731f..f4f628724 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1339.png and b/TMessagesProj/src/main/assets/emoji/0_1339.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_134.png b/TMessagesProj/src/main/assets/emoji/0_134.png index 28bf1d9bf..212769714 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_134.png and b/TMessagesProj/src/main/assets/emoji/0_134.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1340.png b/TMessagesProj/src/main/assets/emoji/0_1340.png index 96e6f6772..9adad417d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1340.png and b/TMessagesProj/src/main/assets/emoji/0_1340.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1341.png b/TMessagesProj/src/main/assets/emoji/0_1341.png index a0b0953a3..347bfeaae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1341.png and b/TMessagesProj/src/main/assets/emoji/0_1341.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1342.png b/TMessagesProj/src/main/assets/emoji/0_1342.png index f823b8742..a0c9f9d5d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1342.png and b/TMessagesProj/src/main/assets/emoji/0_1342.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1343.png b/TMessagesProj/src/main/assets/emoji/0_1343.png index 61cc4d05a..7a7e81f10 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1343.png and b/TMessagesProj/src/main/assets/emoji/0_1343.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1344.png b/TMessagesProj/src/main/assets/emoji/0_1344.png index 145305070..0b9737d7d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1344.png and b/TMessagesProj/src/main/assets/emoji/0_1344.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1345.png b/TMessagesProj/src/main/assets/emoji/0_1345.png index 9bc159370..e41ef9a1c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1345.png and b/TMessagesProj/src/main/assets/emoji/0_1345.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1346.png b/TMessagesProj/src/main/assets/emoji/0_1346.png index 40be6db3e..1f8560994 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1346.png and b/TMessagesProj/src/main/assets/emoji/0_1346.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1347.png b/TMessagesProj/src/main/assets/emoji/0_1347.png index 9e8fe026a..5da3ab141 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1347.png and b/TMessagesProj/src/main/assets/emoji/0_1347.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1348.png b/TMessagesProj/src/main/assets/emoji/0_1348.png index 8323666f4..607f2bed7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1348.png and b/TMessagesProj/src/main/assets/emoji/0_1348.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1349.png b/TMessagesProj/src/main/assets/emoji/0_1349.png index 6205c94bf..3e1c87a62 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1349.png and b/TMessagesProj/src/main/assets/emoji/0_1349.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_135.png b/TMessagesProj/src/main/assets/emoji/0_135.png index 4e91fa38d..14a6091c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_135.png and b/TMessagesProj/src/main/assets/emoji/0_135.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1350.png b/TMessagesProj/src/main/assets/emoji/0_1350.png index a1cd8895c..ff60c308d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1350.png and b/TMessagesProj/src/main/assets/emoji/0_1350.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1351.png b/TMessagesProj/src/main/assets/emoji/0_1351.png index 51616967d..d60da68c7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1351.png and b/TMessagesProj/src/main/assets/emoji/0_1351.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1352.png b/TMessagesProj/src/main/assets/emoji/0_1352.png index 3d261526d..5b3231245 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1352.png and b/TMessagesProj/src/main/assets/emoji/0_1352.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1353.png b/TMessagesProj/src/main/assets/emoji/0_1353.png index d89784310..f78f64f86 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1353.png and b/TMessagesProj/src/main/assets/emoji/0_1353.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1354.png b/TMessagesProj/src/main/assets/emoji/0_1354.png index b55317889..d05797338 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1354.png and b/TMessagesProj/src/main/assets/emoji/0_1354.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1355.png b/TMessagesProj/src/main/assets/emoji/0_1355.png index 49fb18e51..726c1431f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1355.png and b/TMessagesProj/src/main/assets/emoji/0_1355.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1356.png b/TMessagesProj/src/main/assets/emoji/0_1356.png index f3fb25493..728110888 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1356.png and b/TMessagesProj/src/main/assets/emoji/0_1356.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1357.png b/TMessagesProj/src/main/assets/emoji/0_1357.png index b1d9c023d..36e1c5d50 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1357.png and b/TMessagesProj/src/main/assets/emoji/0_1357.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1358.png b/TMessagesProj/src/main/assets/emoji/0_1358.png index f9306e5b8..78aeca956 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1358.png and b/TMessagesProj/src/main/assets/emoji/0_1358.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1359.png b/TMessagesProj/src/main/assets/emoji/0_1359.png index e3ef8617a..23f5de233 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1359.png and b/TMessagesProj/src/main/assets/emoji/0_1359.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_136.png b/TMessagesProj/src/main/assets/emoji/0_136.png index cd0ac8efa..d51b6626e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_136.png and b/TMessagesProj/src/main/assets/emoji/0_136.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1360.png b/TMessagesProj/src/main/assets/emoji/0_1360.png index 43b740777..2f4824db4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1360.png and b/TMessagesProj/src/main/assets/emoji/0_1360.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1361.png b/TMessagesProj/src/main/assets/emoji/0_1361.png index 3ea9039ce..c21d05d60 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1361.png and b/TMessagesProj/src/main/assets/emoji/0_1361.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1362.png b/TMessagesProj/src/main/assets/emoji/0_1362.png index 05ece0665..aa028cf2e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1362.png and b/TMessagesProj/src/main/assets/emoji/0_1362.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1363.png b/TMessagesProj/src/main/assets/emoji/0_1363.png index dc1c89ed9..1075a2a30 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1363.png and b/TMessagesProj/src/main/assets/emoji/0_1363.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1364.png b/TMessagesProj/src/main/assets/emoji/0_1364.png index a0f0fb811..cc1a00d33 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1364.png and b/TMessagesProj/src/main/assets/emoji/0_1364.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1365.png b/TMessagesProj/src/main/assets/emoji/0_1365.png index 82dc7e850..ed3acc7db 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1365.png and b/TMessagesProj/src/main/assets/emoji/0_1365.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1366.png b/TMessagesProj/src/main/assets/emoji/0_1366.png index 2466f3ced..d55f78735 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1366.png and b/TMessagesProj/src/main/assets/emoji/0_1366.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1367.png b/TMessagesProj/src/main/assets/emoji/0_1367.png index 1be28164b..a8aee7c18 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1367.png and b/TMessagesProj/src/main/assets/emoji/0_1367.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1368.png b/TMessagesProj/src/main/assets/emoji/0_1368.png index 2d0d87bde..7b95276a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1368.png and b/TMessagesProj/src/main/assets/emoji/0_1368.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1369.png b/TMessagesProj/src/main/assets/emoji/0_1369.png index c70e547f3..cbed03aaa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1369.png and b/TMessagesProj/src/main/assets/emoji/0_1369.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_137.png b/TMessagesProj/src/main/assets/emoji/0_137.png index aa305aa55..4dd094da9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_137.png and b/TMessagesProj/src/main/assets/emoji/0_137.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1370.png b/TMessagesProj/src/main/assets/emoji/0_1370.png index 07babfb84..680029fda 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1370.png and b/TMessagesProj/src/main/assets/emoji/0_1370.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1371.png b/TMessagesProj/src/main/assets/emoji/0_1371.png index aa053cbe0..959314fa0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1371.png and b/TMessagesProj/src/main/assets/emoji/0_1371.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1372.png b/TMessagesProj/src/main/assets/emoji/0_1372.png index df10f157b..c66acd247 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1372.png and b/TMessagesProj/src/main/assets/emoji/0_1372.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1373.png b/TMessagesProj/src/main/assets/emoji/0_1373.png index 3914c9cc2..ebeb8d83c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1373.png and b/TMessagesProj/src/main/assets/emoji/0_1373.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1374.png b/TMessagesProj/src/main/assets/emoji/0_1374.png index 190fb673f..0ec1e7100 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1374.png and b/TMessagesProj/src/main/assets/emoji/0_1374.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1375.png b/TMessagesProj/src/main/assets/emoji/0_1375.png index 00e6ce45d..26b354395 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1375.png and b/TMessagesProj/src/main/assets/emoji/0_1375.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1376.png b/TMessagesProj/src/main/assets/emoji/0_1376.png index c823de457..3624f9a59 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1376.png and b/TMessagesProj/src/main/assets/emoji/0_1376.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1377.png b/TMessagesProj/src/main/assets/emoji/0_1377.png index 01390f1ca..26246693d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1377.png and b/TMessagesProj/src/main/assets/emoji/0_1377.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1378.png b/TMessagesProj/src/main/assets/emoji/0_1378.png index 9af61a699..d8be2bedc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1378.png and b/TMessagesProj/src/main/assets/emoji/0_1378.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1379.png b/TMessagesProj/src/main/assets/emoji/0_1379.png index 0145ae750..27ea02aab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1379.png and b/TMessagesProj/src/main/assets/emoji/0_1379.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_138.png b/TMessagesProj/src/main/assets/emoji/0_138.png index e1f70443c..8847e9494 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_138.png and b/TMessagesProj/src/main/assets/emoji/0_138.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1380.png b/TMessagesProj/src/main/assets/emoji/0_1380.png index 6e92097e2..9b80e3708 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1380.png and b/TMessagesProj/src/main/assets/emoji/0_1380.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1381.png b/TMessagesProj/src/main/assets/emoji/0_1381.png index a887aca17..1f77bf445 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1381.png and b/TMessagesProj/src/main/assets/emoji/0_1381.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1382.png b/TMessagesProj/src/main/assets/emoji/0_1382.png index b8b9f6a8a..ec2a90f96 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1382.png and b/TMessagesProj/src/main/assets/emoji/0_1382.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1383.png b/TMessagesProj/src/main/assets/emoji/0_1383.png index e395d6015..913eb86db 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1383.png and b/TMessagesProj/src/main/assets/emoji/0_1383.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1384.png b/TMessagesProj/src/main/assets/emoji/0_1384.png index dcbd30831..49cba07b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1384.png and b/TMessagesProj/src/main/assets/emoji/0_1384.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1385.png b/TMessagesProj/src/main/assets/emoji/0_1385.png index 25fa9d925..3f6cc7d59 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1385.png and b/TMessagesProj/src/main/assets/emoji/0_1385.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1386.png b/TMessagesProj/src/main/assets/emoji/0_1386.png index 75520e512..52b7bb47e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1386.png and b/TMessagesProj/src/main/assets/emoji/0_1386.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1387.png b/TMessagesProj/src/main/assets/emoji/0_1387.png index 04f520827..ba292fcfc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1387.png and b/TMessagesProj/src/main/assets/emoji/0_1387.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1388.png b/TMessagesProj/src/main/assets/emoji/0_1388.png index 68893a02d..f1954fd7e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1388.png and b/TMessagesProj/src/main/assets/emoji/0_1388.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1389.png b/TMessagesProj/src/main/assets/emoji/0_1389.png index 9ad2ba6fe..202f34bd7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1389.png and b/TMessagesProj/src/main/assets/emoji/0_1389.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_139.png b/TMessagesProj/src/main/assets/emoji/0_139.png index 221214081..c5ceef675 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_139.png and b/TMessagesProj/src/main/assets/emoji/0_139.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1390.png b/TMessagesProj/src/main/assets/emoji/0_1390.png index 94b8d1421..4b6eca7b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1390.png and b/TMessagesProj/src/main/assets/emoji/0_1390.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1391.png b/TMessagesProj/src/main/assets/emoji/0_1391.png index d686fb707..436171a9b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1391.png and b/TMessagesProj/src/main/assets/emoji/0_1391.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1392.png b/TMessagesProj/src/main/assets/emoji/0_1392.png index a75b53023..44aec3772 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1392.png and b/TMessagesProj/src/main/assets/emoji/0_1392.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1393.png b/TMessagesProj/src/main/assets/emoji/0_1393.png index c5d390b85..5d2258336 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1393.png and b/TMessagesProj/src/main/assets/emoji/0_1393.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1394.png b/TMessagesProj/src/main/assets/emoji/0_1394.png index 191734e26..af87b2c83 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1394.png and b/TMessagesProj/src/main/assets/emoji/0_1394.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1395.png b/TMessagesProj/src/main/assets/emoji/0_1395.png index 64d9bfaf7..f6c007f44 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1395.png and b/TMessagesProj/src/main/assets/emoji/0_1395.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1396.png b/TMessagesProj/src/main/assets/emoji/0_1396.png index 38cf10ad1..3d2b25cf4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1396.png and b/TMessagesProj/src/main/assets/emoji/0_1396.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1397.png b/TMessagesProj/src/main/assets/emoji/0_1397.png index b38807267..f95c1f39a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1397.png and b/TMessagesProj/src/main/assets/emoji/0_1397.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1398.png b/TMessagesProj/src/main/assets/emoji/0_1398.png index d5740d815..be9c279a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1398.png and b/TMessagesProj/src/main/assets/emoji/0_1398.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1399.png b/TMessagesProj/src/main/assets/emoji/0_1399.png index 321006f6d..38961de53 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1399.png and b/TMessagesProj/src/main/assets/emoji/0_1399.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_14.png b/TMessagesProj/src/main/assets/emoji/0_14.png index 5ac11d67f..b9281e239 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_14.png and b/TMessagesProj/src/main/assets/emoji/0_14.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_140.png b/TMessagesProj/src/main/assets/emoji/0_140.png index aa98b0160..63009dbaa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_140.png and b/TMessagesProj/src/main/assets/emoji/0_140.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1400.png b/TMessagesProj/src/main/assets/emoji/0_1400.png index b46671a9c..04c3fba51 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1400.png and b/TMessagesProj/src/main/assets/emoji/0_1400.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1401.png b/TMessagesProj/src/main/assets/emoji/0_1401.png index 707d3a6fd..6eb93e733 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1401.png and b/TMessagesProj/src/main/assets/emoji/0_1401.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1402.png b/TMessagesProj/src/main/assets/emoji/0_1402.png index aa0c767f7..4eac1d7f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1402.png and b/TMessagesProj/src/main/assets/emoji/0_1402.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1403.png b/TMessagesProj/src/main/assets/emoji/0_1403.png index 8a7b6d372..e06d192fb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1403.png and b/TMessagesProj/src/main/assets/emoji/0_1403.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1404.png b/TMessagesProj/src/main/assets/emoji/0_1404.png index d282d2598..55669c42a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1404.png and b/TMessagesProj/src/main/assets/emoji/0_1404.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1405.png b/TMessagesProj/src/main/assets/emoji/0_1405.png index 134a49435..e811a8aad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1405.png and b/TMessagesProj/src/main/assets/emoji/0_1405.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1406.png b/TMessagesProj/src/main/assets/emoji/0_1406.png index b604735b9..170c32a98 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1406.png and b/TMessagesProj/src/main/assets/emoji/0_1406.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1407.png b/TMessagesProj/src/main/assets/emoji/0_1407.png index f4baf974d..d0af0df45 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1407.png and b/TMessagesProj/src/main/assets/emoji/0_1407.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1408.png b/TMessagesProj/src/main/assets/emoji/0_1408.png index b11d0cedd..4438ea20b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1408.png and b/TMessagesProj/src/main/assets/emoji/0_1408.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1409.png b/TMessagesProj/src/main/assets/emoji/0_1409.png index c41f3d786..55c488094 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1409.png and b/TMessagesProj/src/main/assets/emoji/0_1409.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_141.png b/TMessagesProj/src/main/assets/emoji/0_141.png index c7e21e39a..cc58df183 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_141.png and b/TMessagesProj/src/main/assets/emoji/0_141.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1410.png b/TMessagesProj/src/main/assets/emoji/0_1410.png index 243a29fb3..a7b4add97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1410.png and b/TMessagesProj/src/main/assets/emoji/0_1410.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1411.png b/TMessagesProj/src/main/assets/emoji/0_1411.png index f40f38bb1..de7b77167 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1411.png and b/TMessagesProj/src/main/assets/emoji/0_1411.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1412.png b/TMessagesProj/src/main/assets/emoji/0_1412.png index 28c11f117..0f036e845 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1412.png and b/TMessagesProj/src/main/assets/emoji/0_1412.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1413.png b/TMessagesProj/src/main/assets/emoji/0_1413.png index 103ffc1c1..31d4dd3b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1413.png and b/TMessagesProj/src/main/assets/emoji/0_1413.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1414.png b/TMessagesProj/src/main/assets/emoji/0_1414.png index 1105b3d60..59a047a82 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1414.png and b/TMessagesProj/src/main/assets/emoji/0_1414.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1415.png b/TMessagesProj/src/main/assets/emoji/0_1415.png index bdb6fb214..a0c17262b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1415.png and b/TMessagesProj/src/main/assets/emoji/0_1415.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1416.png b/TMessagesProj/src/main/assets/emoji/0_1416.png index 546e1b3e1..8fcbd4c5e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1416.png and b/TMessagesProj/src/main/assets/emoji/0_1416.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1417.png b/TMessagesProj/src/main/assets/emoji/0_1417.png index b67d52197..b5c9b6671 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1417.png and b/TMessagesProj/src/main/assets/emoji/0_1417.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1418.png b/TMessagesProj/src/main/assets/emoji/0_1418.png index 147084434..248f792cc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1418.png and b/TMessagesProj/src/main/assets/emoji/0_1418.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1419.png b/TMessagesProj/src/main/assets/emoji/0_1419.png index 03d21766d..5eadd138d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1419.png and b/TMessagesProj/src/main/assets/emoji/0_1419.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_142.png b/TMessagesProj/src/main/assets/emoji/0_142.png index 88a6d4290..b01f2801f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_142.png and b/TMessagesProj/src/main/assets/emoji/0_142.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1420.png b/TMessagesProj/src/main/assets/emoji/0_1420.png index a73668d5a..e9c4f10d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1420.png and b/TMessagesProj/src/main/assets/emoji/0_1420.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1421.png b/TMessagesProj/src/main/assets/emoji/0_1421.png index 51182909d..50ee6e0f1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1421.png and b/TMessagesProj/src/main/assets/emoji/0_1421.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1422.png b/TMessagesProj/src/main/assets/emoji/0_1422.png index 8b6aeeec2..da4226fac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1422.png and b/TMessagesProj/src/main/assets/emoji/0_1422.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1423.png b/TMessagesProj/src/main/assets/emoji/0_1423.png index ad637b3f9..08f3d13ce 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1423.png and b/TMessagesProj/src/main/assets/emoji/0_1423.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1424.png b/TMessagesProj/src/main/assets/emoji/0_1424.png index d3dd9b5ac..d55b39fea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1424.png and b/TMessagesProj/src/main/assets/emoji/0_1424.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1425.png b/TMessagesProj/src/main/assets/emoji/0_1425.png index 28470f00f..473054c7f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1425.png and b/TMessagesProj/src/main/assets/emoji/0_1425.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1426.png b/TMessagesProj/src/main/assets/emoji/0_1426.png index 720cb4ef7..89761d90f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1426.png and b/TMessagesProj/src/main/assets/emoji/0_1426.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1427.png b/TMessagesProj/src/main/assets/emoji/0_1427.png index b59f59820..23fd888b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1427.png and b/TMessagesProj/src/main/assets/emoji/0_1427.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1428.png b/TMessagesProj/src/main/assets/emoji/0_1428.png index 3feb11a05..846d68ec9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1428.png and b/TMessagesProj/src/main/assets/emoji/0_1428.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1429.png b/TMessagesProj/src/main/assets/emoji/0_1429.png index c615aa216..23b3ab90b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1429.png and b/TMessagesProj/src/main/assets/emoji/0_1429.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_143.png b/TMessagesProj/src/main/assets/emoji/0_143.png index f7a44012c..0497a94bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_143.png and b/TMessagesProj/src/main/assets/emoji/0_143.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1430.png b/TMessagesProj/src/main/assets/emoji/0_1430.png index ebf93bf4d..87ad65b28 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1430.png and b/TMessagesProj/src/main/assets/emoji/0_1430.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1431.png b/TMessagesProj/src/main/assets/emoji/0_1431.png index 7ddcf3bb6..986fac78c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1431.png and b/TMessagesProj/src/main/assets/emoji/0_1431.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1432.png b/TMessagesProj/src/main/assets/emoji/0_1432.png index 956d77d7f..c8631a0c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1432.png and b/TMessagesProj/src/main/assets/emoji/0_1432.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1433.png b/TMessagesProj/src/main/assets/emoji/0_1433.png index 6ffea9132..5e2fbe447 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1433.png and b/TMessagesProj/src/main/assets/emoji/0_1433.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1434.png b/TMessagesProj/src/main/assets/emoji/0_1434.png index 3b9e1a7d1..46d0662cb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1434.png and b/TMessagesProj/src/main/assets/emoji/0_1434.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1435.png b/TMessagesProj/src/main/assets/emoji/0_1435.png index df2bd519f..5260c3106 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1435.png and b/TMessagesProj/src/main/assets/emoji/0_1435.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1436.png b/TMessagesProj/src/main/assets/emoji/0_1436.png index c51cfd4fd..ded90c757 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1436.png and b/TMessagesProj/src/main/assets/emoji/0_1436.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1437.png b/TMessagesProj/src/main/assets/emoji/0_1437.png index 8a93c6d63..f5f0f0525 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1437.png and b/TMessagesProj/src/main/assets/emoji/0_1437.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1438.png b/TMessagesProj/src/main/assets/emoji/0_1438.png index fa1f71967..e13d1806e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1438.png and b/TMessagesProj/src/main/assets/emoji/0_1438.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1439.png b/TMessagesProj/src/main/assets/emoji/0_1439.png index f356c9d9b..55554841f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1439.png and b/TMessagesProj/src/main/assets/emoji/0_1439.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_144.png b/TMessagesProj/src/main/assets/emoji/0_144.png index f663b625e..a74a51e68 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_144.png and b/TMessagesProj/src/main/assets/emoji/0_144.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1440.png b/TMessagesProj/src/main/assets/emoji/0_1440.png index 8476988e6..68b8d7d3b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1440.png and b/TMessagesProj/src/main/assets/emoji/0_1440.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1441.png b/TMessagesProj/src/main/assets/emoji/0_1441.png index 564ef4420..3c2aec87d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1441.png and b/TMessagesProj/src/main/assets/emoji/0_1441.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1442.png b/TMessagesProj/src/main/assets/emoji/0_1442.png index c4e9de2ce..26a67865d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1442.png and b/TMessagesProj/src/main/assets/emoji/0_1442.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1443.png b/TMessagesProj/src/main/assets/emoji/0_1443.png index 07ed203cb..d5d9b4277 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1443.png and b/TMessagesProj/src/main/assets/emoji/0_1443.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1444.png b/TMessagesProj/src/main/assets/emoji/0_1444.png index 4ceaa480e..3ce672745 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1444.png and b/TMessagesProj/src/main/assets/emoji/0_1444.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1445.png b/TMessagesProj/src/main/assets/emoji/0_1445.png index 3aeebb01f..dd8eff19b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1445.png and b/TMessagesProj/src/main/assets/emoji/0_1445.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1446.png b/TMessagesProj/src/main/assets/emoji/0_1446.png index fb8783d72..1e0350e37 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1446.png and b/TMessagesProj/src/main/assets/emoji/0_1446.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1447.png b/TMessagesProj/src/main/assets/emoji/0_1447.png index 367b7724b..06a3b5de0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1447.png and b/TMessagesProj/src/main/assets/emoji/0_1447.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1448.png b/TMessagesProj/src/main/assets/emoji/0_1448.png index ff8abd259..b88ecb241 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1448.png and b/TMessagesProj/src/main/assets/emoji/0_1448.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1449.png b/TMessagesProj/src/main/assets/emoji/0_1449.png index c3a103b18..05b84af77 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1449.png and b/TMessagesProj/src/main/assets/emoji/0_1449.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_145.png b/TMessagesProj/src/main/assets/emoji/0_145.png index 007545b38..efd523bfa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_145.png and b/TMessagesProj/src/main/assets/emoji/0_145.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1450.png b/TMessagesProj/src/main/assets/emoji/0_1450.png index 70ca81d89..21d01b12b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1450.png and b/TMessagesProj/src/main/assets/emoji/0_1450.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1451.png b/TMessagesProj/src/main/assets/emoji/0_1451.png index 33fede404..95643b4f3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1451.png and b/TMessagesProj/src/main/assets/emoji/0_1451.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1452.png b/TMessagesProj/src/main/assets/emoji/0_1452.png index f4cf3dcdc..01465aade 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1452.png and b/TMessagesProj/src/main/assets/emoji/0_1452.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1453.png b/TMessagesProj/src/main/assets/emoji/0_1453.png index 73b7d61fd..293902d77 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1453.png and b/TMessagesProj/src/main/assets/emoji/0_1453.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1454.png b/TMessagesProj/src/main/assets/emoji/0_1454.png index a5697a809..f74c4fdc2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1454.png and b/TMessagesProj/src/main/assets/emoji/0_1454.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1455.png b/TMessagesProj/src/main/assets/emoji/0_1455.png index eedc97859..6e3a976d4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1455.png and b/TMessagesProj/src/main/assets/emoji/0_1455.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1456.png b/TMessagesProj/src/main/assets/emoji/0_1456.png index 3185e7382..368eb95a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1456.png and b/TMessagesProj/src/main/assets/emoji/0_1456.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1457.png b/TMessagesProj/src/main/assets/emoji/0_1457.png index f0509e480..eb3452665 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1457.png and b/TMessagesProj/src/main/assets/emoji/0_1457.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1458.png b/TMessagesProj/src/main/assets/emoji/0_1458.png index 765652b42..22d83a991 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1458.png and b/TMessagesProj/src/main/assets/emoji/0_1458.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1459.png b/TMessagesProj/src/main/assets/emoji/0_1459.png index 11f9b4669..09ecfea17 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1459.png and b/TMessagesProj/src/main/assets/emoji/0_1459.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_146.png b/TMessagesProj/src/main/assets/emoji/0_146.png index 553847320..0d3c9d2a5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_146.png and b/TMessagesProj/src/main/assets/emoji/0_146.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1460.png b/TMessagesProj/src/main/assets/emoji/0_1460.png index 587e30951..7a31a11bd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1460.png and b/TMessagesProj/src/main/assets/emoji/0_1460.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1461.png b/TMessagesProj/src/main/assets/emoji/0_1461.png index 16925cee0..dec31190a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1461.png and b/TMessagesProj/src/main/assets/emoji/0_1461.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1462.png b/TMessagesProj/src/main/assets/emoji/0_1462.png index e6cbd7f20..a622919be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1462.png and b/TMessagesProj/src/main/assets/emoji/0_1462.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1463.png b/TMessagesProj/src/main/assets/emoji/0_1463.png index 2f3bb179b..d8ba9622d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1463.png and b/TMessagesProj/src/main/assets/emoji/0_1463.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1464.png b/TMessagesProj/src/main/assets/emoji/0_1464.png index 71f1d27f7..0ebdf5942 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1464.png and b/TMessagesProj/src/main/assets/emoji/0_1464.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1465.png b/TMessagesProj/src/main/assets/emoji/0_1465.png index 3a80bf0bc..28f67c55f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1465.png and b/TMessagesProj/src/main/assets/emoji/0_1465.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1466.png b/TMessagesProj/src/main/assets/emoji/0_1466.png index 722027e0e..933422406 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1466.png and b/TMessagesProj/src/main/assets/emoji/0_1466.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1467.png b/TMessagesProj/src/main/assets/emoji/0_1467.png index 58958e6f2..56951201b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1467.png and b/TMessagesProj/src/main/assets/emoji/0_1467.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1468.png b/TMessagesProj/src/main/assets/emoji/0_1468.png index 523915516..2b896d616 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1468.png and b/TMessagesProj/src/main/assets/emoji/0_1468.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1469.png b/TMessagesProj/src/main/assets/emoji/0_1469.png index 341591473..cc6fe4307 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1469.png and b/TMessagesProj/src/main/assets/emoji/0_1469.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_147.png b/TMessagesProj/src/main/assets/emoji/0_147.png index f32816096..b268351c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_147.png and b/TMessagesProj/src/main/assets/emoji/0_147.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1470.png b/TMessagesProj/src/main/assets/emoji/0_1470.png index 2e3f4da69..af7b53172 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1470.png and b/TMessagesProj/src/main/assets/emoji/0_1470.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1471.png b/TMessagesProj/src/main/assets/emoji/0_1471.png index 520df2059..333f85867 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1471.png and b/TMessagesProj/src/main/assets/emoji/0_1471.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1472.png b/TMessagesProj/src/main/assets/emoji/0_1472.png index fd2bf8a18..968347131 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1472.png and b/TMessagesProj/src/main/assets/emoji/0_1472.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1473.png b/TMessagesProj/src/main/assets/emoji/0_1473.png index 189fc488a..439ca3bad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1473.png and b/TMessagesProj/src/main/assets/emoji/0_1473.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1474.png b/TMessagesProj/src/main/assets/emoji/0_1474.png index d7ac54884..4925a17b1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1474.png and b/TMessagesProj/src/main/assets/emoji/0_1474.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1475.png b/TMessagesProj/src/main/assets/emoji/0_1475.png index 37aad71d5..0d8142f78 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1475.png and b/TMessagesProj/src/main/assets/emoji/0_1475.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1476.png b/TMessagesProj/src/main/assets/emoji/0_1476.png index 1736a7b42..4dc4c9921 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1476.png and b/TMessagesProj/src/main/assets/emoji/0_1476.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1477.png b/TMessagesProj/src/main/assets/emoji/0_1477.png index 53eeca1a0..92e50fe1f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1477.png and b/TMessagesProj/src/main/assets/emoji/0_1477.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1478.png b/TMessagesProj/src/main/assets/emoji/0_1478.png index 7a74fb038..b13828781 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1478.png and b/TMessagesProj/src/main/assets/emoji/0_1478.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1479.png b/TMessagesProj/src/main/assets/emoji/0_1479.png index cb467e578..ac725086d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1479.png and b/TMessagesProj/src/main/assets/emoji/0_1479.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_148.png b/TMessagesProj/src/main/assets/emoji/0_148.png index c89ac165b..572df7f8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_148.png and b/TMessagesProj/src/main/assets/emoji/0_148.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1480.png b/TMessagesProj/src/main/assets/emoji/0_1480.png index 416628bf7..bd793e438 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1480.png and b/TMessagesProj/src/main/assets/emoji/0_1480.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1481.png b/TMessagesProj/src/main/assets/emoji/0_1481.png index 6a12f6fb2..a43805253 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1481.png and b/TMessagesProj/src/main/assets/emoji/0_1481.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1482.png b/TMessagesProj/src/main/assets/emoji/0_1482.png index 881da3c43..208b99d36 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1482.png and b/TMessagesProj/src/main/assets/emoji/0_1482.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1483.png b/TMessagesProj/src/main/assets/emoji/0_1483.png index 58241395c..092214ed3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1483.png and b/TMessagesProj/src/main/assets/emoji/0_1483.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1484.png b/TMessagesProj/src/main/assets/emoji/0_1484.png index 2ad7d7620..789971a98 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1484.png and b/TMessagesProj/src/main/assets/emoji/0_1484.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1485.png b/TMessagesProj/src/main/assets/emoji/0_1485.png index 81bddfc1c..794f134cd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1485.png and b/TMessagesProj/src/main/assets/emoji/0_1485.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1486.png b/TMessagesProj/src/main/assets/emoji/0_1486.png index 63ba8bd83..1b0c930e6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1486.png and b/TMessagesProj/src/main/assets/emoji/0_1486.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1487.png b/TMessagesProj/src/main/assets/emoji/0_1487.png index aa7618e71..4e23f48ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1487.png and b/TMessagesProj/src/main/assets/emoji/0_1487.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1488.png b/TMessagesProj/src/main/assets/emoji/0_1488.png index 6db861fb8..72ced224d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1488.png and b/TMessagesProj/src/main/assets/emoji/0_1488.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1489.png b/TMessagesProj/src/main/assets/emoji/0_1489.png index d00d24817..0d643f99d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1489.png and b/TMessagesProj/src/main/assets/emoji/0_1489.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_149.png b/TMessagesProj/src/main/assets/emoji/0_149.png index 83e58865a..518ec8d69 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_149.png and b/TMessagesProj/src/main/assets/emoji/0_149.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1490.png b/TMessagesProj/src/main/assets/emoji/0_1490.png index bb1e9eebb..e85dce23c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1490.png and b/TMessagesProj/src/main/assets/emoji/0_1490.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1491.png b/TMessagesProj/src/main/assets/emoji/0_1491.png index 644ce650e..9376949cd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1491.png and b/TMessagesProj/src/main/assets/emoji/0_1491.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1492.png b/TMessagesProj/src/main/assets/emoji/0_1492.png index c04c9bb6c..9f4e61af9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1492.png and b/TMessagesProj/src/main/assets/emoji/0_1492.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1493.png b/TMessagesProj/src/main/assets/emoji/0_1493.png index 6a0bd1a7d..6713794d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1493.png and b/TMessagesProj/src/main/assets/emoji/0_1493.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1494.png b/TMessagesProj/src/main/assets/emoji/0_1494.png index 9d31e09f2..b66ee026d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1494.png and b/TMessagesProj/src/main/assets/emoji/0_1494.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1495.png b/TMessagesProj/src/main/assets/emoji/0_1495.png index 2a14d5099..a8839a985 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1495.png and b/TMessagesProj/src/main/assets/emoji/0_1495.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1496.png b/TMessagesProj/src/main/assets/emoji/0_1496.png index 7f958a99f..c81a85de9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1496.png and b/TMessagesProj/src/main/assets/emoji/0_1496.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1497.png b/TMessagesProj/src/main/assets/emoji/0_1497.png index 10b81bec2..372746461 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1497.png and b/TMessagesProj/src/main/assets/emoji/0_1497.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1498.png b/TMessagesProj/src/main/assets/emoji/0_1498.png index aeddf9bf4..48785b34c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1498.png and b/TMessagesProj/src/main/assets/emoji/0_1498.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1499.png b/TMessagesProj/src/main/assets/emoji/0_1499.png index 432ad394b..7ec6261c7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1499.png and b/TMessagesProj/src/main/assets/emoji/0_1499.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_15.png b/TMessagesProj/src/main/assets/emoji/0_15.png index e58ec92f9..c98f98327 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_15.png and b/TMessagesProj/src/main/assets/emoji/0_15.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_150.png b/TMessagesProj/src/main/assets/emoji/0_150.png index b8818f8b3..62a085f00 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_150.png and b/TMessagesProj/src/main/assets/emoji/0_150.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1500.png b/TMessagesProj/src/main/assets/emoji/0_1500.png index 665b4541f..aaa6eb07f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1500.png and b/TMessagesProj/src/main/assets/emoji/0_1500.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1501.png b/TMessagesProj/src/main/assets/emoji/0_1501.png index 6641f9cae..e7b338b8e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1501.png and b/TMessagesProj/src/main/assets/emoji/0_1501.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1502.png b/TMessagesProj/src/main/assets/emoji/0_1502.png index 229f3a88f..ddc0163fa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1502.png and b/TMessagesProj/src/main/assets/emoji/0_1502.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1503.png b/TMessagesProj/src/main/assets/emoji/0_1503.png index dcd618955..d56f7f4f8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1503.png and b/TMessagesProj/src/main/assets/emoji/0_1503.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1504.png b/TMessagesProj/src/main/assets/emoji/0_1504.png index 4997a7f88..1da160688 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1504.png and b/TMessagesProj/src/main/assets/emoji/0_1504.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1505.png b/TMessagesProj/src/main/assets/emoji/0_1505.png index 58ac155ec..06c585812 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1505.png and b/TMessagesProj/src/main/assets/emoji/0_1505.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1506.png b/TMessagesProj/src/main/assets/emoji/0_1506.png index 5ab2bab43..1b96fc0f9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1506.png and b/TMessagesProj/src/main/assets/emoji/0_1506.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1507.png b/TMessagesProj/src/main/assets/emoji/0_1507.png index 5cfd7faa9..d660be105 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1507.png and b/TMessagesProj/src/main/assets/emoji/0_1507.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1508.png b/TMessagesProj/src/main/assets/emoji/0_1508.png index cbd391d27..923552f23 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1508.png and b/TMessagesProj/src/main/assets/emoji/0_1508.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1509.png b/TMessagesProj/src/main/assets/emoji/0_1509.png index e0687288a..2a1ad2622 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1509.png and b/TMessagesProj/src/main/assets/emoji/0_1509.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_151.png b/TMessagesProj/src/main/assets/emoji/0_151.png index 1b9231ad6..525b0951e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_151.png and b/TMessagesProj/src/main/assets/emoji/0_151.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1510.png b/TMessagesProj/src/main/assets/emoji/0_1510.png index 3a9d46070..f91e22258 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1510.png and b/TMessagesProj/src/main/assets/emoji/0_1510.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1511.png b/TMessagesProj/src/main/assets/emoji/0_1511.png index 07b90efec..975edd67e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1511.png and b/TMessagesProj/src/main/assets/emoji/0_1511.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1512.png b/TMessagesProj/src/main/assets/emoji/0_1512.png index 33ad6c1bb..cded1ad3a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1512.png and b/TMessagesProj/src/main/assets/emoji/0_1512.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1513.png b/TMessagesProj/src/main/assets/emoji/0_1513.png index 4d6940a97..fdfe6c7c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1513.png and b/TMessagesProj/src/main/assets/emoji/0_1513.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1514.png b/TMessagesProj/src/main/assets/emoji/0_1514.png index 3db82e9f0..967c22138 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1514.png and b/TMessagesProj/src/main/assets/emoji/0_1514.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1515.png b/TMessagesProj/src/main/assets/emoji/0_1515.png index 530e874fc..13ce75f2f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1515.png and b/TMessagesProj/src/main/assets/emoji/0_1515.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1516.png b/TMessagesProj/src/main/assets/emoji/0_1516.png index 5f9457bcd..8984d9a4f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1516.png and b/TMessagesProj/src/main/assets/emoji/0_1516.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1517.png b/TMessagesProj/src/main/assets/emoji/0_1517.png index 3d1ddf506..bb52496ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1517.png and b/TMessagesProj/src/main/assets/emoji/0_1517.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1518.png b/TMessagesProj/src/main/assets/emoji/0_1518.png index 4c3f81631..156f73f13 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1518.png and b/TMessagesProj/src/main/assets/emoji/0_1518.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1519.png b/TMessagesProj/src/main/assets/emoji/0_1519.png index 2ea9d777b..0309c12d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1519.png and b/TMessagesProj/src/main/assets/emoji/0_1519.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_152.png b/TMessagesProj/src/main/assets/emoji/0_152.png index c0073aec1..6d83ebf8e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_152.png and b/TMessagesProj/src/main/assets/emoji/0_152.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1520.png b/TMessagesProj/src/main/assets/emoji/0_1520.png index df18727d6..1d928d145 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1520.png and b/TMessagesProj/src/main/assets/emoji/0_1520.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1521.png b/TMessagesProj/src/main/assets/emoji/0_1521.png index e3b98dfa7..94f21420b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1521.png and b/TMessagesProj/src/main/assets/emoji/0_1521.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1522.png b/TMessagesProj/src/main/assets/emoji/0_1522.png index 465ef319d..5eed69fa1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1522.png and b/TMessagesProj/src/main/assets/emoji/0_1522.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1523.png b/TMessagesProj/src/main/assets/emoji/0_1523.png index 4d6c09acf..7d704fb3c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1523.png and b/TMessagesProj/src/main/assets/emoji/0_1523.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1524.png b/TMessagesProj/src/main/assets/emoji/0_1524.png index 6168965bf..74715ba0c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1524.png and b/TMessagesProj/src/main/assets/emoji/0_1524.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1525.png b/TMessagesProj/src/main/assets/emoji/0_1525.png index a4f955adf..f24472deb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1525.png and b/TMessagesProj/src/main/assets/emoji/0_1525.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1526.png b/TMessagesProj/src/main/assets/emoji/0_1526.png index 103f6d419..0195be48f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1526.png and b/TMessagesProj/src/main/assets/emoji/0_1526.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1527.png b/TMessagesProj/src/main/assets/emoji/0_1527.png index 624bc997b..f5550f83f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1527.png and b/TMessagesProj/src/main/assets/emoji/0_1527.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1528.png b/TMessagesProj/src/main/assets/emoji/0_1528.png index 8e961255e..b0d9fa4e4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1528.png and b/TMessagesProj/src/main/assets/emoji/0_1528.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1529.png b/TMessagesProj/src/main/assets/emoji/0_1529.png index cbe9d4800..9921b997a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1529.png and b/TMessagesProj/src/main/assets/emoji/0_1529.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_153.png b/TMessagesProj/src/main/assets/emoji/0_153.png index 76d3daf15..e0963af47 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_153.png and b/TMessagesProj/src/main/assets/emoji/0_153.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1530.png b/TMessagesProj/src/main/assets/emoji/0_1530.png index 83d3b6219..06ba7e899 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1530.png and b/TMessagesProj/src/main/assets/emoji/0_1530.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1531.png b/TMessagesProj/src/main/assets/emoji/0_1531.png index 4fc96cbfe..597d7c69d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1531.png and b/TMessagesProj/src/main/assets/emoji/0_1531.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1532.png b/TMessagesProj/src/main/assets/emoji/0_1532.png index 461b30e62..d1fa6cb21 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1532.png and b/TMessagesProj/src/main/assets/emoji/0_1532.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1533.png b/TMessagesProj/src/main/assets/emoji/0_1533.png index 8342fa588..975868c4d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1533.png and b/TMessagesProj/src/main/assets/emoji/0_1533.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1534.png b/TMessagesProj/src/main/assets/emoji/0_1534.png index 181abcde7..022bb719a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1534.png and b/TMessagesProj/src/main/assets/emoji/0_1534.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1535.png b/TMessagesProj/src/main/assets/emoji/0_1535.png index b75363f2c..03432bfb6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1535.png and b/TMessagesProj/src/main/assets/emoji/0_1535.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1536.png b/TMessagesProj/src/main/assets/emoji/0_1536.png index 4c954b4ec..bd8d9b258 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1536.png and b/TMessagesProj/src/main/assets/emoji/0_1536.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1537.png b/TMessagesProj/src/main/assets/emoji/0_1537.png index 1ce2032ff..19e11bd6e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1537.png and b/TMessagesProj/src/main/assets/emoji/0_1537.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1538.png b/TMessagesProj/src/main/assets/emoji/0_1538.png index 61aa3df0f..8b9efe2ef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1538.png and b/TMessagesProj/src/main/assets/emoji/0_1538.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1539.png b/TMessagesProj/src/main/assets/emoji/0_1539.png index 0de8109b0..f96f51a54 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1539.png and b/TMessagesProj/src/main/assets/emoji/0_1539.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_154.png b/TMessagesProj/src/main/assets/emoji/0_154.png index 2add17a92..2f54e8d5a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_154.png and b/TMessagesProj/src/main/assets/emoji/0_154.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1540.png b/TMessagesProj/src/main/assets/emoji/0_1540.png index c55831058..1a9e67abb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1540.png and b/TMessagesProj/src/main/assets/emoji/0_1540.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1541.png b/TMessagesProj/src/main/assets/emoji/0_1541.png index 83deed765..dbcbcf9fb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1541.png and b/TMessagesProj/src/main/assets/emoji/0_1541.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1542.png b/TMessagesProj/src/main/assets/emoji/0_1542.png index 6a60c8cff..25501cb6d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1542.png and b/TMessagesProj/src/main/assets/emoji/0_1542.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1543.png b/TMessagesProj/src/main/assets/emoji/0_1543.png index d85f2a78e..460f05b2a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1543.png and b/TMessagesProj/src/main/assets/emoji/0_1543.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1544.png b/TMessagesProj/src/main/assets/emoji/0_1544.png index 3a7dd4f04..7224eeef6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1544.png and b/TMessagesProj/src/main/assets/emoji/0_1544.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1545.png b/TMessagesProj/src/main/assets/emoji/0_1545.png index 52070f1e4..41ab81b1e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1545.png and b/TMessagesProj/src/main/assets/emoji/0_1545.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1546.png b/TMessagesProj/src/main/assets/emoji/0_1546.png index 1e09dbf1a..d31a3071b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1546.png and b/TMessagesProj/src/main/assets/emoji/0_1546.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1547.png b/TMessagesProj/src/main/assets/emoji/0_1547.png index bffa1596b..8e776b267 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1547.png and b/TMessagesProj/src/main/assets/emoji/0_1547.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1548.png b/TMessagesProj/src/main/assets/emoji/0_1548.png index cea9ef16f..c25344030 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1548.png and b/TMessagesProj/src/main/assets/emoji/0_1548.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1549.png b/TMessagesProj/src/main/assets/emoji/0_1549.png index 606611bf9..9ba903005 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1549.png and b/TMessagesProj/src/main/assets/emoji/0_1549.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_155.png b/TMessagesProj/src/main/assets/emoji/0_155.png index 4f1034456..2c23d988d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_155.png and b/TMessagesProj/src/main/assets/emoji/0_155.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1550.png b/TMessagesProj/src/main/assets/emoji/0_1550.png index 8aa4555a5..387323bb3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1550.png and b/TMessagesProj/src/main/assets/emoji/0_1550.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1551.png b/TMessagesProj/src/main/assets/emoji/0_1551.png index ca2883347..455a9ac2d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1551.png and b/TMessagesProj/src/main/assets/emoji/0_1551.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1552.png b/TMessagesProj/src/main/assets/emoji/0_1552.png index 805ba35d2..d50cc7547 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1552.png and b/TMessagesProj/src/main/assets/emoji/0_1552.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1553.png b/TMessagesProj/src/main/assets/emoji/0_1553.png index 2c8defb45..207a136b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1553.png and b/TMessagesProj/src/main/assets/emoji/0_1553.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1554.png b/TMessagesProj/src/main/assets/emoji/0_1554.png index 43d67c172..f59b09dbf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1554.png and b/TMessagesProj/src/main/assets/emoji/0_1554.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1555.png b/TMessagesProj/src/main/assets/emoji/0_1555.png index cb02b0681..095720ab4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1555.png and b/TMessagesProj/src/main/assets/emoji/0_1555.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1556.png b/TMessagesProj/src/main/assets/emoji/0_1556.png index 4be52e754..833bc8522 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1556.png and b/TMessagesProj/src/main/assets/emoji/0_1556.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1557.png b/TMessagesProj/src/main/assets/emoji/0_1557.png index db73b4206..acd569dd2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1557.png and b/TMessagesProj/src/main/assets/emoji/0_1557.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1558.png b/TMessagesProj/src/main/assets/emoji/0_1558.png index 2d17783db..63cd9ba9d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1558.png and b/TMessagesProj/src/main/assets/emoji/0_1558.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1559.png b/TMessagesProj/src/main/assets/emoji/0_1559.png index 1986f9c74..23ac634a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1559.png and b/TMessagesProj/src/main/assets/emoji/0_1559.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_156.png b/TMessagesProj/src/main/assets/emoji/0_156.png index 6670d897a..c1c72e76c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_156.png and b/TMessagesProj/src/main/assets/emoji/0_156.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1560.png b/TMessagesProj/src/main/assets/emoji/0_1560.png index c1da317f0..5edb1cd78 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1560.png and b/TMessagesProj/src/main/assets/emoji/0_1560.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1561.png b/TMessagesProj/src/main/assets/emoji/0_1561.png index 5feaba92b..4fdd84abb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1561.png and b/TMessagesProj/src/main/assets/emoji/0_1561.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1562.png b/TMessagesProj/src/main/assets/emoji/0_1562.png index fd3f3c8aa..a3ce1f5ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1562.png and b/TMessagesProj/src/main/assets/emoji/0_1562.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1563.png b/TMessagesProj/src/main/assets/emoji/0_1563.png index 80679df62..a96da846a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1563.png and b/TMessagesProj/src/main/assets/emoji/0_1563.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1564.png b/TMessagesProj/src/main/assets/emoji/0_1564.png index 8e0866ff1..c94f076ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1564.png and b/TMessagesProj/src/main/assets/emoji/0_1564.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1565.png b/TMessagesProj/src/main/assets/emoji/0_1565.png index 5085ba397..2d8c8e04f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1565.png and b/TMessagesProj/src/main/assets/emoji/0_1565.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1566.png b/TMessagesProj/src/main/assets/emoji/0_1566.png index 99a553859..c9892c9ba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1566.png and b/TMessagesProj/src/main/assets/emoji/0_1566.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1567.png b/TMessagesProj/src/main/assets/emoji/0_1567.png index fb6a3623d..00bf125a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1567.png and b/TMessagesProj/src/main/assets/emoji/0_1567.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1568.png b/TMessagesProj/src/main/assets/emoji/0_1568.png index 83201171a..eb07a113c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1568.png and b/TMessagesProj/src/main/assets/emoji/0_1568.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1569.png b/TMessagesProj/src/main/assets/emoji/0_1569.png index d18f5bfa1..0847f61e8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1569.png and b/TMessagesProj/src/main/assets/emoji/0_1569.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_157.png b/TMessagesProj/src/main/assets/emoji/0_157.png index 96149b097..6318eb5c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_157.png and b/TMessagesProj/src/main/assets/emoji/0_157.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1570.png b/TMessagesProj/src/main/assets/emoji/0_1570.png index e78a045e1..aaa13fc7f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1570.png and b/TMessagesProj/src/main/assets/emoji/0_1570.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1571.png b/TMessagesProj/src/main/assets/emoji/0_1571.png index 0018629c7..887d97bee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1571.png and b/TMessagesProj/src/main/assets/emoji/0_1571.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1572.png b/TMessagesProj/src/main/assets/emoji/0_1572.png index 8a19ec682..1d4a50428 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1572.png and b/TMessagesProj/src/main/assets/emoji/0_1572.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1573.png b/TMessagesProj/src/main/assets/emoji/0_1573.png index 737f02ddc..0c9d7b60a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1573.png and b/TMessagesProj/src/main/assets/emoji/0_1573.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1574.png b/TMessagesProj/src/main/assets/emoji/0_1574.png index ac83e2347..e16100b14 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1574.png and b/TMessagesProj/src/main/assets/emoji/0_1574.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1575.png b/TMessagesProj/src/main/assets/emoji/0_1575.png index 91dd33c5f..669818531 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1575.png and b/TMessagesProj/src/main/assets/emoji/0_1575.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1576.png b/TMessagesProj/src/main/assets/emoji/0_1576.png index 1854f6b95..1d6acf15b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1576.png and b/TMessagesProj/src/main/assets/emoji/0_1576.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1577.png b/TMessagesProj/src/main/assets/emoji/0_1577.png index 6e03c500d..cb68b2dd5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1577.png and b/TMessagesProj/src/main/assets/emoji/0_1577.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1578.png b/TMessagesProj/src/main/assets/emoji/0_1578.png index 091eb70d3..12c82e924 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1578.png and b/TMessagesProj/src/main/assets/emoji/0_1578.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1579.png b/TMessagesProj/src/main/assets/emoji/0_1579.png index 342f95ae7..2e292df87 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1579.png and b/TMessagesProj/src/main/assets/emoji/0_1579.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_158.png b/TMessagesProj/src/main/assets/emoji/0_158.png index a358f619c..f710de608 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_158.png and b/TMessagesProj/src/main/assets/emoji/0_158.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1580.png b/TMessagesProj/src/main/assets/emoji/0_1580.png index 407a80848..a4c596e92 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1580.png and b/TMessagesProj/src/main/assets/emoji/0_1580.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1581.png b/TMessagesProj/src/main/assets/emoji/0_1581.png index 126374db1..c933b14bb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1581.png and b/TMessagesProj/src/main/assets/emoji/0_1581.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1582.png b/TMessagesProj/src/main/assets/emoji/0_1582.png index 223f5c64f..ac430906e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1582.png and b/TMessagesProj/src/main/assets/emoji/0_1582.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1583.png b/TMessagesProj/src/main/assets/emoji/0_1583.png index 722a2e3ec..9154d8c98 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1583.png and b/TMessagesProj/src/main/assets/emoji/0_1583.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1584.png b/TMessagesProj/src/main/assets/emoji/0_1584.png index 35083d082..e923c547e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1584.png and b/TMessagesProj/src/main/assets/emoji/0_1584.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1585.png b/TMessagesProj/src/main/assets/emoji/0_1585.png index eabe8a6f1..85d46efcf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1585.png and b/TMessagesProj/src/main/assets/emoji/0_1585.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1586.png b/TMessagesProj/src/main/assets/emoji/0_1586.png index e0da28fb7..d57205ede 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1586.png and b/TMessagesProj/src/main/assets/emoji/0_1586.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1587.png b/TMessagesProj/src/main/assets/emoji/0_1587.png index 56e189f0f..c435cf6e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1587.png and b/TMessagesProj/src/main/assets/emoji/0_1587.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1588.png b/TMessagesProj/src/main/assets/emoji/0_1588.png index 5cadab1a5..cb08db621 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1588.png and b/TMessagesProj/src/main/assets/emoji/0_1588.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1589.png b/TMessagesProj/src/main/assets/emoji/0_1589.png index f276af036..a125dc944 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1589.png and b/TMessagesProj/src/main/assets/emoji/0_1589.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_159.png b/TMessagesProj/src/main/assets/emoji/0_159.png index 1193ad79c..910f1c723 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_159.png and b/TMessagesProj/src/main/assets/emoji/0_159.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1590.png b/TMessagesProj/src/main/assets/emoji/0_1590.png index 43033615d..08b3e2982 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1590.png and b/TMessagesProj/src/main/assets/emoji/0_1590.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1591.png b/TMessagesProj/src/main/assets/emoji/0_1591.png index 660c74eb1..f9c69a403 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1591.png and b/TMessagesProj/src/main/assets/emoji/0_1591.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1592.png b/TMessagesProj/src/main/assets/emoji/0_1592.png index 60f32a123..d56aed943 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1592.png and b/TMessagesProj/src/main/assets/emoji/0_1592.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1593.png b/TMessagesProj/src/main/assets/emoji/0_1593.png index 544dd9d56..95c3dbbea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1593.png and b/TMessagesProj/src/main/assets/emoji/0_1593.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1594.png b/TMessagesProj/src/main/assets/emoji/0_1594.png index 84eeda9db..e9e352905 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1594.png and b/TMessagesProj/src/main/assets/emoji/0_1594.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1595.png b/TMessagesProj/src/main/assets/emoji/0_1595.png index f0f57b376..56b114c6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1595.png and b/TMessagesProj/src/main/assets/emoji/0_1595.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1596.png b/TMessagesProj/src/main/assets/emoji/0_1596.png index fe26c220b..caa055f32 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1596.png and b/TMessagesProj/src/main/assets/emoji/0_1596.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1597.png b/TMessagesProj/src/main/assets/emoji/0_1597.png index 1ff38e131..e3afa56dd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1597.png and b/TMessagesProj/src/main/assets/emoji/0_1597.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1598.png b/TMessagesProj/src/main/assets/emoji/0_1598.png index 5102347ff..314129c8e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1598.png and b/TMessagesProj/src/main/assets/emoji/0_1598.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1599.png b/TMessagesProj/src/main/assets/emoji/0_1599.png index d97b138e7..0b551f344 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1599.png and b/TMessagesProj/src/main/assets/emoji/0_1599.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_16.png b/TMessagesProj/src/main/assets/emoji/0_16.png index bb115dc5f..1e3ef42c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_16.png and b/TMessagesProj/src/main/assets/emoji/0_16.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_160.png b/TMessagesProj/src/main/assets/emoji/0_160.png index 2721d7632..de9130211 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_160.png and b/TMessagesProj/src/main/assets/emoji/0_160.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1600.png b/TMessagesProj/src/main/assets/emoji/0_1600.png index 68cf1cab7..b5d6f8487 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1600.png and b/TMessagesProj/src/main/assets/emoji/0_1600.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1601.png b/TMessagesProj/src/main/assets/emoji/0_1601.png index 6fca26809..d48fa4b93 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1601.png and b/TMessagesProj/src/main/assets/emoji/0_1601.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1602.png b/TMessagesProj/src/main/assets/emoji/0_1602.png index 76f542e59..bd1e7a6a6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1602.png and b/TMessagesProj/src/main/assets/emoji/0_1602.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1603.png b/TMessagesProj/src/main/assets/emoji/0_1603.png index 3ad59f326..575966df4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1603.png and b/TMessagesProj/src/main/assets/emoji/0_1603.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1604.png b/TMessagesProj/src/main/assets/emoji/0_1604.png index 15898fc17..043928aaa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1604.png and b/TMessagesProj/src/main/assets/emoji/0_1604.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1605.png b/TMessagesProj/src/main/assets/emoji/0_1605.png index 15588ce48..80988c025 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1605.png and b/TMessagesProj/src/main/assets/emoji/0_1605.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1606.png b/TMessagesProj/src/main/assets/emoji/0_1606.png index b2a9cd323..b8cc869a1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1606.png and b/TMessagesProj/src/main/assets/emoji/0_1606.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1607.png b/TMessagesProj/src/main/assets/emoji/0_1607.png index 6ce988b15..0b5214243 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1607.png and b/TMessagesProj/src/main/assets/emoji/0_1607.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1608.png b/TMessagesProj/src/main/assets/emoji/0_1608.png index a6d637263..00644e6d7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1608.png and b/TMessagesProj/src/main/assets/emoji/0_1608.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1609.png b/TMessagesProj/src/main/assets/emoji/0_1609.png index d2fda5230..68ceed925 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1609.png and b/TMessagesProj/src/main/assets/emoji/0_1609.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_161.png b/TMessagesProj/src/main/assets/emoji/0_161.png index 96e2e961c..03d2f68a5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_161.png and b/TMessagesProj/src/main/assets/emoji/0_161.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1610.png b/TMessagesProj/src/main/assets/emoji/0_1610.png index 179a3093b..eaaae32d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1610.png and b/TMessagesProj/src/main/assets/emoji/0_1610.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1611.png b/TMessagesProj/src/main/assets/emoji/0_1611.png index 177f52a83..c4b05b0ce 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1611.png and b/TMessagesProj/src/main/assets/emoji/0_1611.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1612.png b/TMessagesProj/src/main/assets/emoji/0_1612.png index c473c1ea3..838bfbc41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1612.png and b/TMessagesProj/src/main/assets/emoji/0_1612.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1613.png b/TMessagesProj/src/main/assets/emoji/0_1613.png index af2e2ba53..e82c96cf3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1613.png and b/TMessagesProj/src/main/assets/emoji/0_1613.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1614.png b/TMessagesProj/src/main/assets/emoji/0_1614.png index 3e91e24ef..c7dcaaf70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1614.png and b/TMessagesProj/src/main/assets/emoji/0_1614.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1615.png b/TMessagesProj/src/main/assets/emoji/0_1615.png index 0254c49bd..cdba196aa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1615.png and b/TMessagesProj/src/main/assets/emoji/0_1615.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1616.png b/TMessagesProj/src/main/assets/emoji/0_1616.png index 114c27b65..ff8045678 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1616.png and b/TMessagesProj/src/main/assets/emoji/0_1616.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1617.png b/TMessagesProj/src/main/assets/emoji/0_1617.png index 50d5b10cc..1ecb1fa75 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1617.png and b/TMessagesProj/src/main/assets/emoji/0_1617.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1618.png b/TMessagesProj/src/main/assets/emoji/0_1618.png index 6a87cb131..7b9b8f4cc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1618.png and b/TMessagesProj/src/main/assets/emoji/0_1618.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1619.png b/TMessagesProj/src/main/assets/emoji/0_1619.png index b0e64deb1..483fa051f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1619.png and b/TMessagesProj/src/main/assets/emoji/0_1619.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_162.png b/TMessagesProj/src/main/assets/emoji/0_162.png index cb7ef678c..29fc59e0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_162.png and b/TMessagesProj/src/main/assets/emoji/0_162.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1620.png b/TMessagesProj/src/main/assets/emoji/0_1620.png index 382e87f2b..3e4852821 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1620.png and b/TMessagesProj/src/main/assets/emoji/0_1620.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1621.png b/TMessagesProj/src/main/assets/emoji/0_1621.png index ba80f9427..9330aaceb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1621.png and b/TMessagesProj/src/main/assets/emoji/0_1621.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1622.png b/TMessagesProj/src/main/assets/emoji/0_1622.png index 73a71ab7f..bf78de41e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1622.png and b/TMessagesProj/src/main/assets/emoji/0_1622.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1623.png b/TMessagesProj/src/main/assets/emoji/0_1623.png index b558dcf97..0ebc29c6d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1623.png and b/TMessagesProj/src/main/assets/emoji/0_1623.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1624.png b/TMessagesProj/src/main/assets/emoji/0_1624.png index 728a20d1c..87cf4ea21 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1624.png and b/TMessagesProj/src/main/assets/emoji/0_1624.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1625.png b/TMessagesProj/src/main/assets/emoji/0_1625.png index 173d444a0..74085e7ef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1625.png and b/TMessagesProj/src/main/assets/emoji/0_1625.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1626.png b/TMessagesProj/src/main/assets/emoji/0_1626.png index 6d55a4d34..3b749f6a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1626.png and b/TMessagesProj/src/main/assets/emoji/0_1626.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1627.png b/TMessagesProj/src/main/assets/emoji/0_1627.png index 4b2bd6829..7a959661e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1627.png and b/TMessagesProj/src/main/assets/emoji/0_1627.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1628.png b/TMessagesProj/src/main/assets/emoji/0_1628.png index 76b929dfe..9c27674b1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1628.png and b/TMessagesProj/src/main/assets/emoji/0_1628.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1629.png b/TMessagesProj/src/main/assets/emoji/0_1629.png index 9170719df..e02247f2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1629.png and b/TMessagesProj/src/main/assets/emoji/0_1629.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_163.png b/TMessagesProj/src/main/assets/emoji/0_163.png index 711ee3900..df13e3de8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_163.png and b/TMessagesProj/src/main/assets/emoji/0_163.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1630.png b/TMessagesProj/src/main/assets/emoji/0_1630.png index d11268ee6..ff111db8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1630.png and b/TMessagesProj/src/main/assets/emoji/0_1630.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1631.png b/TMessagesProj/src/main/assets/emoji/0_1631.png index 402626117..e7e5a9859 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1631.png and b/TMessagesProj/src/main/assets/emoji/0_1631.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1632.png b/TMessagesProj/src/main/assets/emoji/0_1632.png index 1e1c9dfa0..ccbc39c8d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1632.png and b/TMessagesProj/src/main/assets/emoji/0_1632.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1633.png b/TMessagesProj/src/main/assets/emoji/0_1633.png index aa51b0e6e..e9ea4ec78 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1633.png and b/TMessagesProj/src/main/assets/emoji/0_1633.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1634.png b/TMessagesProj/src/main/assets/emoji/0_1634.png index d0069aafb..ff374b768 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1634.png and b/TMessagesProj/src/main/assets/emoji/0_1634.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1635.png b/TMessagesProj/src/main/assets/emoji/0_1635.png index 5af05883e..3778f7465 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1635.png and b/TMessagesProj/src/main/assets/emoji/0_1635.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1636.png b/TMessagesProj/src/main/assets/emoji/0_1636.png index be5816777..2d4cd894a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1636.png and b/TMessagesProj/src/main/assets/emoji/0_1636.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1637.png b/TMessagesProj/src/main/assets/emoji/0_1637.png index fc9bd2d7b..ce17dac4c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1637.png and b/TMessagesProj/src/main/assets/emoji/0_1637.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1638.png b/TMessagesProj/src/main/assets/emoji/0_1638.png index 803e5260a..f8b693bfb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1638.png and b/TMessagesProj/src/main/assets/emoji/0_1638.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1639.png b/TMessagesProj/src/main/assets/emoji/0_1639.png index 599f243e9..3171756cc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1639.png and b/TMessagesProj/src/main/assets/emoji/0_1639.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_164.png b/TMessagesProj/src/main/assets/emoji/0_164.png index 08fc03e43..4525c8e37 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_164.png and b/TMessagesProj/src/main/assets/emoji/0_164.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1640.png b/TMessagesProj/src/main/assets/emoji/0_1640.png index 16ac67364..9c57d0da7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1640.png and b/TMessagesProj/src/main/assets/emoji/0_1640.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1641.png b/TMessagesProj/src/main/assets/emoji/0_1641.png index 4b4830cf1..eaa9f403c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1641.png and b/TMessagesProj/src/main/assets/emoji/0_1641.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1642.png b/TMessagesProj/src/main/assets/emoji/0_1642.png index de4fcb08b..0cac47860 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1642.png and b/TMessagesProj/src/main/assets/emoji/0_1642.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1643.png b/TMessagesProj/src/main/assets/emoji/0_1643.png index e22d5b84c..af76961f9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1643.png and b/TMessagesProj/src/main/assets/emoji/0_1643.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1644.png b/TMessagesProj/src/main/assets/emoji/0_1644.png index 7f61ef1e4..d3727db5f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1644.png and b/TMessagesProj/src/main/assets/emoji/0_1644.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1645.png b/TMessagesProj/src/main/assets/emoji/0_1645.png index 17ce64d4d..a39a3d757 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1645.png and b/TMessagesProj/src/main/assets/emoji/0_1645.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1646.png b/TMessagesProj/src/main/assets/emoji/0_1646.png index 737ed5eca..d50457cb7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1646.png and b/TMessagesProj/src/main/assets/emoji/0_1646.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1647.png b/TMessagesProj/src/main/assets/emoji/0_1647.png index df47d4a6f..fe3844be1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1647.png and b/TMessagesProj/src/main/assets/emoji/0_1647.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1648.png b/TMessagesProj/src/main/assets/emoji/0_1648.png index 49493d26e..e90d73ef6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1648.png and b/TMessagesProj/src/main/assets/emoji/0_1648.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1649.png b/TMessagesProj/src/main/assets/emoji/0_1649.png index 597ab94d8..ac35067ef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1649.png and b/TMessagesProj/src/main/assets/emoji/0_1649.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_165.png b/TMessagesProj/src/main/assets/emoji/0_165.png index bf70f9687..9dd05138d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_165.png and b/TMessagesProj/src/main/assets/emoji/0_165.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1650.png b/TMessagesProj/src/main/assets/emoji/0_1650.png index 3eda7d2db..b7809597b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1650.png and b/TMessagesProj/src/main/assets/emoji/0_1650.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1651.png b/TMessagesProj/src/main/assets/emoji/0_1651.png index 70ad3cd57..85675c36d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1651.png and b/TMessagesProj/src/main/assets/emoji/0_1651.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1652.png b/TMessagesProj/src/main/assets/emoji/0_1652.png index f297c2ba5..e12d878f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1652.png and b/TMessagesProj/src/main/assets/emoji/0_1652.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1653.png b/TMessagesProj/src/main/assets/emoji/0_1653.png index 3e7af1224..f7b16f1e5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1653.png and b/TMessagesProj/src/main/assets/emoji/0_1653.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1654.png b/TMessagesProj/src/main/assets/emoji/0_1654.png index d5ea027b6..69081dd65 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1654.png and b/TMessagesProj/src/main/assets/emoji/0_1654.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1655.png b/TMessagesProj/src/main/assets/emoji/0_1655.png index c90d1ce2b..9462e399a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1655.png and b/TMessagesProj/src/main/assets/emoji/0_1655.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1656.png b/TMessagesProj/src/main/assets/emoji/0_1656.png index f0e252b9a..1effeb1bd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1656.png and b/TMessagesProj/src/main/assets/emoji/0_1656.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1657.png b/TMessagesProj/src/main/assets/emoji/0_1657.png index 3382ee223..c5f278db2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1657.png and b/TMessagesProj/src/main/assets/emoji/0_1657.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1658.png b/TMessagesProj/src/main/assets/emoji/0_1658.png index 00ae42cb3..98e0a302c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1658.png and b/TMessagesProj/src/main/assets/emoji/0_1658.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1659.png b/TMessagesProj/src/main/assets/emoji/0_1659.png index fa78241e3..cf7c40236 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1659.png and b/TMessagesProj/src/main/assets/emoji/0_1659.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_166.png b/TMessagesProj/src/main/assets/emoji/0_166.png index 06c17cc34..5f030e781 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_166.png and b/TMessagesProj/src/main/assets/emoji/0_166.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1660.png b/TMessagesProj/src/main/assets/emoji/0_1660.png index b885e2f01..8b5a7b3d3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1660.png and b/TMessagesProj/src/main/assets/emoji/0_1660.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1661.png b/TMessagesProj/src/main/assets/emoji/0_1661.png index a5b1d95f8..ce06f1cef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1661.png and b/TMessagesProj/src/main/assets/emoji/0_1661.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1662.png b/TMessagesProj/src/main/assets/emoji/0_1662.png index bc6846cfc..7f034d62f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1662.png and b/TMessagesProj/src/main/assets/emoji/0_1662.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1663.png b/TMessagesProj/src/main/assets/emoji/0_1663.png index ffefaf9d4..703a7bcd9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1663.png and b/TMessagesProj/src/main/assets/emoji/0_1663.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1664.png b/TMessagesProj/src/main/assets/emoji/0_1664.png index e3277bfcc..ab0cb8c15 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1664.png and b/TMessagesProj/src/main/assets/emoji/0_1664.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1665.png b/TMessagesProj/src/main/assets/emoji/0_1665.png index eb2c63aaf..02127a038 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1665.png and b/TMessagesProj/src/main/assets/emoji/0_1665.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1666.png b/TMessagesProj/src/main/assets/emoji/0_1666.png index 47da60fb0..ce841eccc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1666.png and b/TMessagesProj/src/main/assets/emoji/0_1666.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1667.png b/TMessagesProj/src/main/assets/emoji/0_1667.png index 781fae0a3..cf2eedff0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1667.png and b/TMessagesProj/src/main/assets/emoji/0_1667.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1668.png b/TMessagesProj/src/main/assets/emoji/0_1668.png index b0bc54a25..fd554ea76 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1668.png and b/TMessagesProj/src/main/assets/emoji/0_1668.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1669.png b/TMessagesProj/src/main/assets/emoji/0_1669.png index bea82981b..ad167d8b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1669.png and b/TMessagesProj/src/main/assets/emoji/0_1669.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_167.png b/TMessagesProj/src/main/assets/emoji/0_167.png index 6b33759d5..e9dac81cf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_167.png and b/TMessagesProj/src/main/assets/emoji/0_167.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1670.png b/TMessagesProj/src/main/assets/emoji/0_1670.png index 682f58d2f..013c05b4a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1670.png and b/TMessagesProj/src/main/assets/emoji/0_1670.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1671.png b/TMessagesProj/src/main/assets/emoji/0_1671.png index 1351eb679..23980e1ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1671.png and b/TMessagesProj/src/main/assets/emoji/0_1671.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1672.png b/TMessagesProj/src/main/assets/emoji/0_1672.png index e657132a5..57057875e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1672.png and b/TMessagesProj/src/main/assets/emoji/0_1672.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1673.png b/TMessagesProj/src/main/assets/emoji/0_1673.png index a4954dfad..6e6dce103 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1673.png and b/TMessagesProj/src/main/assets/emoji/0_1673.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1674.png b/TMessagesProj/src/main/assets/emoji/0_1674.png index d76507f0b..a8153ef4c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1674.png and b/TMessagesProj/src/main/assets/emoji/0_1674.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1675.png b/TMessagesProj/src/main/assets/emoji/0_1675.png index 721f49a99..3392cc5c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1675.png and b/TMessagesProj/src/main/assets/emoji/0_1675.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1676.png b/TMessagesProj/src/main/assets/emoji/0_1676.png index 70717f487..13889c775 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1676.png and b/TMessagesProj/src/main/assets/emoji/0_1676.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1677.png b/TMessagesProj/src/main/assets/emoji/0_1677.png index 9ea42a017..79cd8f0d4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1677.png and b/TMessagesProj/src/main/assets/emoji/0_1677.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1678.png b/TMessagesProj/src/main/assets/emoji/0_1678.png index 07f7dbfcb..92db9950c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1678.png and b/TMessagesProj/src/main/assets/emoji/0_1678.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1679.png b/TMessagesProj/src/main/assets/emoji/0_1679.png index d6c549e97..111ffdeef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1679.png and b/TMessagesProj/src/main/assets/emoji/0_1679.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_168.png b/TMessagesProj/src/main/assets/emoji/0_168.png index 829d93d4e..f178e6c11 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_168.png and b/TMessagesProj/src/main/assets/emoji/0_168.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1680.png b/TMessagesProj/src/main/assets/emoji/0_1680.png index 491a1d895..1b631836d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1680.png and b/TMessagesProj/src/main/assets/emoji/0_1680.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1681.png b/TMessagesProj/src/main/assets/emoji/0_1681.png index 80357978a..c824a06cd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1681.png and b/TMessagesProj/src/main/assets/emoji/0_1681.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1682.png b/TMessagesProj/src/main/assets/emoji/0_1682.png index 631f1f8a3..99be99466 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1682.png and b/TMessagesProj/src/main/assets/emoji/0_1682.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1683.png b/TMessagesProj/src/main/assets/emoji/0_1683.png index 61153e94d..d28208b61 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1683.png and b/TMessagesProj/src/main/assets/emoji/0_1683.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1684.png b/TMessagesProj/src/main/assets/emoji/0_1684.png index 883e348ff..20492bb3c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1684.png and b/TMessagesProj/src/main/assets/emoji/0_1684.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1685.png b/TMessagesProj/src/main/assets/emoji/0_1685.png index 495eece85..eabebdff8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1685.png and b/TMessagesProj/src/main/assets/emoji/0_1685.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1686.png b/TMessagesProj/src/main/assets/emoji/0_1686.png index 7f2e2439f..df4819046 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1686.png and b/TMessagesProj/src/main/assets/emoji/0_1686.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1687.png b/TMessagesProj/src/main/assets/emoji/0_1687.png index b29f3858c..957cff34e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1687.png and b/TMessagesProj/src/main/assets/emoji/0_1687.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1688.png b/TMessagesProj/src/main/assets/emoji/0_1688.png index ceda121c4..136dce045 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1688.png and b/TMessagesProj/src/main/assets/emoji/0_1688.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1689.png b/TMessagesProj/src/main/assets/emoji/0_1689.png index 602ae5b6b..81c4590a8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1689.png and b/TMessagesProj/src/main/assets/emoji/0_1689.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_169.png b/TMessagesProj/src/main/assets/emoji/0_169.png index ae19ad413..6846fe73e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_169.png and b/TMessagesProj/src/main/assets/emoji/0_169.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1690.png b/TMessagesProj/src/main/assets/emoji/0_1690.png index dd2c8be17..83f048213 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1690.png and b/TMessagesProj/src/main/assets/emoji/0_1690.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1691.png b/TMessagesProj/src/main/assets/emoji/0_1691.png index c0f7983b7..7e71f24e4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1691.png and b/TMessagesProj/src/main/assets/emoji/0_1691.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1692.png b/TMessagesProj/src/main/assets/emoji/0_1692.png index 5dc916b12..292381cdf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1692.png and b/TMessagesProj/src/main/assets/emoji/0_1692.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1693.png b/TMessagesProj/src/main/assets/emoji/0_1693.png index 973b273d2..a3bf47f12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1693.png and b/TMessagesProj/src/main/assets/emoji/0_1693.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1694.png b/TMessagesProj/src/main/assets/emoji/0_1694.png index 1f6feaaa9..fe461a0a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1694.png and b/TMessagesProj/src/main/assets/emoji/0_1694.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1695.png b/TMessagesProj/src/main/assets/emoji/0_1695.png index 0a1e6f1f7..375c781cb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1695.png and b/TMessagesProj/src/main/assets/emoji/0_1695.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1696.png b/TMessagesProj/src/main/assets/emoji/0_1696.png index 0395803f2..c650eed58 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1696.png and b/TMessagesProj/src/main/assets/emoji/0_1696.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1697.png b/TMessagesProj/src/main/assets/emoji/0_1697.png index 5803995ae..45f2f3df9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1697.png and b/TMessagesProj/src/main/assets/emoji/0_1697.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1698.png b/TMessagesProj/src/main/assets/emoji/0_1698.png index 0abf0e5c9..721be654c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1698.png and b/TMessagesProj/src/main/assets/emoji/0_1698.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1699.png b/TMessagesProj/src/main/assets/emoji/0_1699.png index 3248ffb3c..767d06c51 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1699.png and b/TMessagesProj/src/main/assets/emoji/0_1699.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_17.png b/TMessagesProj/src/main/assets/emoji/0_17.png index ff79cece2..2e14d5a3b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_17.png and b/TMessagesProj/src/main/assets/emoji/0_17.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_170.png b/TMessagesProj/src/main/assets/emoji/0_170.png index a113d5236..8d88d0345 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_170.png and b/TMessagesProj/src/main/assets/emoji/0_170.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1700.png b/TMessagesProj/src/main/assets/emoji/0_1700.png index 83e09cb96..dad43b23f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1700.png and b/TMessagesProj/src/main/assets/emoji/0_1700.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1701.png b/TMessagesProj/src/main/assets/emoji/0_1701.png index 548be5231..0db6a7045 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1701.png and b/TMessagesProj/src/main/assets/emoji/0_1701.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1702.png b/TMessagesProj/src/main/assets/emoji/0_1702.png index a657b6fd1..9a1508d52 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1702.png and b/TMessagesProj/src/main/assets/emoji/0_1702.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1703.png b/TMessagesProj/src/main/assets/emoji/0_1703.png index 4002c5bf2..075c6e4c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1703.png and b/TMessagesProj/src/main/assets/emoji/0_1703.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1704.png b/TMessagesProj/src/main/assets/emoji/0_1704.png index cae24c946..06f5a2599 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1704.png and b/TMessagesProj/src/main/assets/emoji/0_1704.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1705.png b/TMessagesProj/src/main/assets/emoji/0_1705.png index 812e25790..cae21fc08 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1705.png and b/TMessagesProj/src/main/assets/emoji/0_1705.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1706.png b/TMessagesProj/src/main/assets/emoji/0_1706.png index 305f8012f..139638636 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1706.png and b/TMessagesProj/src/main/assets/emoji/0_1706.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1707.png b/TMessagesProj/src/main/assets/emoji/0_1707.png index 236bcedbf..d69b58fa8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1707.png and b/TMessagesProj/src/main/assets/emoji/0_1707.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1708.png b/TMessagesProj/src/main/assets/emoji/0_1708.png index 419966b4b..5ca3f8b8e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1708.png and b/TMessagesProj/src/main/assets/emoji/0_1708.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1709.png b/TMessagesProj/src/main/assets/emoji/0_1709.png index 42a0f6086..00d9e5d97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1709.png and b/TMessagesProj/src/main/assets/emoji/0_1709.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_171.png b/TMessagesProj/src/main/assets/emoji/0_171.png index dcc1bcac5..574958ffc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_171.png and b/TMessagesProj/src/main/assets/emoji/0_171.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1710.png b/TMessagesProj/src/main/assets/emoji/0_1710.png index a8cd255b4..ea03f38bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1710.png and b/TMessagesProj/src/main/assets/emoji/0_1710.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1711.png b/TMessagesProj/src/main/assets/emoji/0_1711.png index 0c21ec709..c5ec88d29 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1711.png and b/TMessagesProj/src/main/assets/emoji/0_1711.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1712.png b/TMessagesProj/src/main/assets/emoji/0_1712.png index 0dc7e56da..b6b0bd23f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1712.png and b/TMessagesProj/src/main/assets/emoji/0_1712.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1713.png b/TMessagesProj/src/main/assets/emoji/0_1713.png index 45fdd69e3..7bf533840 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1713.png and b/TMessagesProj/src/main/assets/emoji/0_1713.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1714.png b/TMessagesProj/src/main/assets/emoji/0_1714.png index ba73c8d6c..5ed857453 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1714.png and b/TMessagesProj/src/main/assets/emoji/0_1714.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1715.png b/TMessagesProj/src/main/assets/emoji/0_1715.png index 742f18bdf..214a87ba1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1715.png and b/TMessagesProj/src/main/assets/emoji/0_1715.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1716.png b/TMessagesProj/src/main/assets/emoji/0_1716.png index a5d38d4b6..6ead42c63 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1716.png and b/TMessagesProj/src/main/assets/emoji/0_1716.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1717.png b/TMessagesProj/src/main/assets/emoji/0_1717.png index c690c6130..6d32230ab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1717.png and b/TMessagesProj/src/main/assets/emoji/0_1717.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1718.png b/TMessagesProj/src/main/assets/emoji/0_1718.png index 92f8deb59..fa19c1cad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1718.png and b/TMessagesProj/src/main/assets/emoji/0_1718.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1719.png b/TMessagesProj/src/main/assets/emoji/0_1719.png index 801ea0815..844a7bd9f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1719.png and b/TMessagesProj/src/main/assets/emoji/0_1719.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_172.png b/TMessagesProj/src/main/assets/emoji/0_172.png index ce3be2708..04c0b124a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_172.png and b/TMessagesProj/src/main/assets/emoji/0_172.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1720.png b/TMessagesProj/src/main/assets/emoji/0_1720.png index 25340b03f..c3d91dda5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1720.png and b/TMessagesProj/src/main/assets/emoji/0_1720.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1721.png b/TMessagesProj/src/main/assets/emoji/0_1721.png index b5dcc4e48..2ceeb442b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1721.png and b/TMessagesProj/src/main/assets/emoji/0_1721.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1722.png b/TMessagesProj/src/main/assets/emoji/0_1722.png index ff2b62d0b..e3a814cff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1722.png and b/TMessagesProj/src/main/assets/emoji/0_1722.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1723.png b/TMessagesProj/src/main/assets/emoji/0_1723.png index a99f3348e..08bd0bb41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1723.png and b/TMessagesProj/src/main/assets/emoji/0_1723.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1724.png b/TMessagesProj/src/main/assets/emoji/0_1724.png index b5ef90535..91a4d94a6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1724.png and b/TMessagesProj/src/main/assets/emoji/0_1724.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1725.png b/TMessagesProj/src/main/assets/emoji/0_1725.png index 361c81892..1ef4e986d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1725.png and b/TMessagesProj/src/main/assets/emoji/0_1725.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1726.png b/TMessagesProj/src/main/assets/emoji/0_1726.png index 5430e8ec7..5db031d59 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1726.png and b/TMessagesProj/src/main/assets/emoji/0_1726.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1727.png b/TMessagesProj/src/main/assets/emoji/0_1727.png index f6e4a4006..1700a8bf6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1727.png and b/TMessagesProj/src/main/assets/emoji/0_1727.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1728.png b/TMessagesProj/src/main/assets/emoji/0_1728.png index cc78ec26c..a4b3b8563 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1728.png and b/TMessagesProj/src/main/assets/emoji/0_1728.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1729.png b/TMessagesProj/src/main/assets/emoji/0_1729.png index 42e0594d0..42abeae5e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1729.png and b/TMessagesProj/src/main/assets/emoji/0_1729.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_173.png b/TMessagesProj/src/main/assets/emoji/0_173.png index 03dbde408..d1c7f26fd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_173.png and b/TMessagesProj/src/main/assets/emoji/0_173.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1730.png b/TMessagesProj/src/main/assets/emoji/0_1730.png index 3bb83835f..305913469 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1730.png and b/TMessagesProj/src/main/assets/emoji/0_1730.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1731.png b/TMessagesProj/src/main/assets/emoji/0_1731.png index 4f73b9c34..736daa189 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1731.png and b/TMessagesProj/src/main/assets/emoji/0_1731.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1732.png b/TMessagesProj/src/main/assets/emoji/0_1732.png index 11c957b1c..4a280f3d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1732.png and b/TMessagesProj/src/main/assets/emoji/0_1732.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1733.png b/TMessagesProj/src/main/assets/emoji/0_1733.png index bbf27d13e..4f6d818a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1733.png and b/TMessagesProj/src/main/assets/emoji/0_1733.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1734.png b/TMessagesProj/src/main/assets/emoji/0_1734.png index d35108116..492798309 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1734.png and b/TMessagesProj/src/main/assets/emoji/0_1734.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1735.png b/TMessagesProj/src/main/assets/emoji/0_1735.png index 8c4df540c..4c39a3f32 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1735.png and b/TMessagesProj/src/main/assets/emoji/0_1735.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1736.png b/TMessagesProj/src/main/assets/emoji/0_1736.png index ba119aa60..3bd1d0c65 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1736.png and b/TMessagesProj/src/main/assets/emoji/0_1736.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1737.png b/TMessagesProj/src/main/assets/emoji/0_1737.png index 07082dd06..27a04dbea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1737.png and b/TMessagesProj/src/main/assets/emoji/0_1737.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1738.png b/TMessagesProj/src/main/assets/emoji/0_1738.png index 366551f4a..a03169935 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1738.png and b/TMessagesProj/src/main/assets/emoji/0_1738.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1739.png b/TMessagesProj/src/main/assets/emoji/0_1739.png index 3bcf8e73c..d9c928218 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1739.png and b/TMessagesProj/src/main/assets/emoji/0_1739.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_174.png b/TMessagesProj/src/main/assets/emoji/0_174.png index 688a7bec5..724796a47 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_174.png and b/TMessagesProj/src/main/assets/emoji/0_174.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1740.png b/TMessagesProj/src/main/assets/emoji/0_1740.png index 201ed26e6..702f40f7b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1740.png and b/TMessagesProj/src/main/assets/emoji/0_1740.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1741.png b/TMessagesProj/src/main/assets/emoji/0_1741.png index edb611278..b167aa8c8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1741.png and b/TMessagesProj/src/main/assets/emoji/0_1741.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1742.png b/TMessagesProj/src/main/assets/emoji/0_1742.png index 11f48721e..cd11e6963 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1742.png and b/TMessagesProj/src/main/assets/emoji/0_1742.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1743.png b/TMessagesProj/src/main/assets/emoji/0_1743.png index 9c56d2ff0..8b7b89c0b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1743.png and b/TMessagesProj/src/main/assets/emoji/0_1743.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1744.png b/TMessagesProj/src/main/assets/emoji/0_1744.png index e0ff80928..d63965ddf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1744.png and b/TMessagesProj/src/main/assets/emoji/0_1744.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1745.png b/TMessagesProj/src/main/assets/emoji/0_1745.png index da0b08faf..7fdeea2c5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1745.png and b/TMessagesProj/src/main/assets/emoji/0_1745.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1746.png b/TMessagesProj/src/main/assets/emoji/0_1746.png index 5a8859841..674ddbc88 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1746.png and b/TMessagesProj/src/main/assets/emoji/0_1746.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1747.png b/TMessagesProj/src/main/assets/emoji/0_1747.png index 3fe7f0ae3..8e01dac5a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1747.png and b/TMessagesProj/src/main/assets/emoji/0_1747.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1748.png b/TMessagesProj/src/main/assets/emoji/0_1748.png index 8538076da..026c85981 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1748.png and b/TMessagesProj/src/main/assets/emoji/0_1748.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1749.png b/TMessagesProj/src/main/assets/emoji/0_1749.png index 8f88a8560..24240b0c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1749.png and b/TMessagesProj/src/main/assets/emoji/0_1749.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_175.png b/TMessagesProj/src/main/assets/emoji/0_175.png index fc3255b9e..9f34eb1de 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_175.png and b/TMessagesProj/src/main/assets/emoji/0_175.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1750.png b/TMessagesProj/src/main/assets/emoji/0_1750.png index 48686b421..633c85a07 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1750.png and b/TMessagesProj/src/main/assets/emoji/0_1750.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1751.png b/TMessagesProj/src/main/assets/emoji/0_1751.png index fb970c2a7..78c312523 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1751.png and b/TMessagesProj/src/main/assets/emoji/0_1751.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1752.png b/TMessagesProj/src/main/assets/emoji/0_1752.png index 1a0c86968..eae9ebefe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1752.png and b/TMessagesProj/src/main/assets/emoji/0_1752.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1753.png b/TMessagesProj/src/main/assets/emoji/0_1753.png index 625d10cf1..c340845a4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1753.png and b/TMessagesProj/src/main/assets/emoji/0_1753.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1754.png b/TMessagesProj/src/main/assets/emoji/0_1754.png index 9e87fc162..3b471675a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1754.png and b/TMessagesProj/src/main/assets/emoji/0_1754.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1755.png b/TMessagesProj/src/main/assets/emoji/0_1755.png index 7b2c47477..70091051a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1755.png and b/TMessagesProj/src/main/assets/emoji/0_1755.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1756.png b/TMessagesProj/src/main/assets/emoji/0_1756.png index 49694edf1..6c15a20aa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1756.png and b/TMessagesProj/src/main/assets/emoji/0_1756.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1757.png b/TMessagesProj/src/main/assets/emoji/0_1757.png index e76d6be65..c7feef09a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1757.png and b/TMessagesProj/src/main/assets/emoji/0_1757.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1758.png b/TMessagesProj/src/main/assets/emoji/0_1758.png index 8db8bc2d6..3d5af8ceb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1758.png and b/TMessagesProj/src/main/assets/emoji/0_1758.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1759.png b/TMessagesProj/src/main/assets/emoji/0_1759.png index 784c5590f..75c00439e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1759.png and b/TMessagesProj/src/main/assets/emoji/0_1759.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_176.png b/TMessagesProj/src/main/assets/emoji/0_176.png index 267db2b8a..478fe162a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_176.png and b/TMessagesProj/src/main/assets/emoji/0_176.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1760.png b/TMessagesProj/src/main/assets/emoji/0_1760.png index 85ba04736..6de2c20fd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1760.png and b/TMessagesProj/src/main/assets/emoji/0_1760.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1761.png b/TMessagesProj/src/main/assets/emoji/0_1761.png index 2efa9c50a..244e0cb83 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1761.png and b/TMessagesProj/src/main/assets/emoji/0_1761.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1762.png b/TMessagesProj/src/main/assets/emoji/0_1762.png index 8227ec275..e48222fa3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1762.png and b/TMessagesProj/src/main/assets/emoji/0_1762.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1763.png b/TMessagesProj/src/main/assets/emoji/0_1763.png index 915d3f4c2..36fc30fb6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1763.png and b/TMessagesProj/src/main/assets/emoji/0_1763.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1764.png b/TMessagesProj/src/main/assets/emoji/0_1764.png index f6b3f190d..55c18627c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1764.png and b/TMessagesProj/src/main/assets/emoji/0_1764.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1765.png b/TMessagesProj/src/main/assets/emoji/0_1765.png index 8f6a321b7..e4516c879 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1765.png and b/TMessagesProj/src/main/assets/emoji/0_1765.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1766.png b/TMessagesProj/src/main/assets/emoji/0_1766.png index 6826f27cc..9f40b6a00 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1766.png and b/TMessagesProj/src/main/assets/emoji/0_1766.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1767.png b/TMessagesProj/src/main/assets/emoji/0_1767.png index 462b13354..8d6ea50d3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1767.png and b/TMessagesProj/src/main/assets/emoji/0_1767.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1768.png b/TMessagesProj/src/main/assets/emoji/0_1768.png index 07fc64865..19f8f2acb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1768.png and b/TMessagesProj/src/main/assets/emoji/0_1768.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1769.png b/TMessagesProj/src/main/assets/emoji/0_1769.png index 72dc7b00f..b6d1e0637 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1769.png and b/TMessagesProj/src/main/assets/emoji/0_1769.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_177.png b/TMessagesProj/src/main/assets/emoji/0_177.png index 55f4d1a30..4661766f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_177.png and b/TMessagesProj/src/main/assets/emoji/0_177.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1770.png b/TMessagesProj/src/main/assets/emoji/0_1770.png index e4217c47f..879472f52 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1770.png and b/TMessagesProj/src/main/assets/emoji/0_1770.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1771.png b/TMessagesProj/src/main/assets/emoji/0_1771.png index c6032b836..da762aa50 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1771.png and b/TMessagesProj/src/main/assets/emoji/0_1771.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1772.png b/TMessagesProj/src/main/assets/emoji/0_1772.png index f476a178b..5d3504edf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1772.png and b/TMessagesProj/src/main/assets/emoji/0_1772.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1773.png b/TMessagesProj/src/main/assets/emoji/0_1773.png index 21c464829..725a6284a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1773.png and b/TMessagesProj/src/main/assets/emoji/0_1773.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1774.png b/TMessagesProj/src/main/assets/emoji/0_1774.png index 946409f93..2594003de 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1774.png and b/TMessagesProj/src/main/assets/emoji/0_1774.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1775.png b/TMessagesProj/src/main/assets/emoji/0_1775.png index db7eee6c8..2c48d7658 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1775.png and b/TMessagesProj/src/main/assets/emoji/0_1775.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1776.png b/TMessagesProj/src/main/assets/emoji/0_1776.png index ccd9f501d..7674cb8f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1776.png and b/TMessagesProj/src/main/assets/emoji/0_1776.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1777.png b/TMessagesProj/src/main/assets/emoji/0_1777.png index bd4b2d796..1da759067 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1777.png and b/TMessagesProj/src/main/assets/emoji/0_1777.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1778.png b/TMessagesProj/src/main/assets/emoji/0_1778.png index 5e2d511d1..933a19dc5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1778.png and b/TMessagesProj/src/main/assets/emoji/0_1778.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1779.png b/TMessagesProj/src/main/assets/emoji/0_1779.png index 472b775ae..ad1109a15 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1779.png and b/TMessagesProj/src/main/assets/emoji/0_1779.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_178.png b/TMessagesProj/src/main/assets/emoji/0_178.png index 463d9428a..2029cdda0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_178.png and b/TMessagesProj/src/main/assets/emoji/0_178.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1780.png b/TMessagesProj/src/main/assets/emoji/0_1780.png index 9ca6c6853..9fa991db6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1780.png and b/TMessagesProj/src/main/assets/emoji/0_1780.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1781.png b/TMessagesProj/src/main/assets/emoji/0_1781.png index 2abca5021..bc9cffba5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1781.png and b/TMessagesProj/src/main/assets/emoji/0_1781.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1782.png b/TMessagesProj/src/main/assets/emoji/0_1782.png index 569aaa7a3..f9e3764ad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1782.png and b/TMessagesProj/src/main/assets/emoji/0_1782.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1783.png b/TMessagesProj/src/main/assets/emoji/0_1783.png index 51c578780..db4deb2a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1783.png and b/TMessagesProj/src/main/assets/emoji/0_1783.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1784.png b/TMessagesProj/src/main/assets/emoji/0_1784.png index 926aa2b7b..ddcba9885 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1784.png and b/TMessagesProj/src/main/assets/emoji/0_1784.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1785.png b/TMessagesProj/src/main/assets/emoji/0_1785.png index 52c967113..21e373486 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1785.png and b/TMessagesProj/src/main/assets/emoji/0_1785.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1786.png b/TMessagesProj/src/main/assets/emoji/0_1786.png index 18e82e5dd..608cbed9c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1786.png and b/TMessagesProj/src/main/assets/emoji/0_1786.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1787.png b/TMessagesProj/src/main/assets/emoji/0_1787.png index 773fa8f28..122991b3e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1787.png and b/TMessagesProj/src/main/assets/emoji/0_1787.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1788.png b/TMessagesProj/src/main/assets/emoji/0_1788.png index 3645f8d9b..bf19476fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1788.png and b/TMessagesProj/src/main/assets/emoji/0_1788.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1789.png b/TMessagesProj/src/main/assets/emoji/0_1789.png index 4ef37cd7e..1855e75f9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1789.png and b/TMessagesProj/src/main/assets/emoji/0_1789.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_179.png b/TMessagesProj/src/main/assets/emoji/0_179.png index 47ab79dd8..fee8bdc58 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_179.png and b/TMessagesProj/src/main/assets/emoji/0_179.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1790.png b/TMessagesProj/src/main/assets/emoji/0_1790.png index 7c9747892..170e0aef7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1790.png and b/TMessagesProj/src/main/assets/emoji/0_1790.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1791.png b/TMessagesProj/src/main/assets/emoji/0_1791.png index 9196717b2..83b80324e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1791.png and b/TMessagesProj/src/main/assets/emoji/0_1791.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1792.png b/TMessagesProj/src/main/assets/emoji/0_1792.png index e1ddbd6f9..856ff92fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1792.png and b/TMessagesProj/src/main/assets/emoji/0_1792.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1793.png b/TMessagesProj/src/main/assets/emoji/0_1793.png index 3ff684915..f5a967d48 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1793.png and b/TMessagesProj/src/main/assets/emoji/0_1793.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1794.png b/TMessagesProj/src/main/assets/emoji/0_1794.png index 04e3ad210..218b75d08 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1794.png and b/TMessagesProj/src/main/assets/emoji/0_1794.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1795.png b/TMessagesProj/src/main/assets/emoji/0_1795.png index 004b8090d..af2a21c54 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1795.png and b/TMessagesProj/src/main/assets/emoji/0_1795.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1796.png b/TMessagesProj/src/main/assets/emoji/0_1796.png index 9e80d3a39..4c2c61c5f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1796.png and b/TMessagesProj/src/main/assets/emoji/0_1796.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1797.png b/TMessagesProj/src/main/assets/emoji/0_1797.png index 5f3080769..6bf7a3c33 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1797.png and b/TMessagesProj/src/main/assets/emoji/0_1797.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1798.png b/TMessagesProj/src/main/assets/emoji/0_1798.png index fb26343eb..efdc06a85 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1798.png and b/TMessagesProj/src/main/assets/emoji/0_1798.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1799.png b/TMessagesProj/src/main/assets/emoji/0_1799.png index fb065be00..b1bb53720 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1799.png and b/TMessagesProj/src/main/assets/emoji/0_1799.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_18.png b/TMessagesProj/src/main/assets/emoji/0_18.png index 978736fd8..087c48a88 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_18.png and b/TMessagesProj/src/main/assets/emoji/0_18.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_180.png b/TMessagesProj/src/main/assets/emoji/0_180.png index 680a659c3..07e430cd8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_180.png and b/TMessagesProj/src/main/assets/emoji/0_180.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1800.png b/TMessagesProj/src/main/assets/emoji/0_1800.png index 23d431299..5ce856520 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1800.png and b/TMessagesProj/src/main/assets/emoji/0_1800.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1801.png b/TMessagesProj/src/main/assets/emoji/0_1801.png index 28ccba271..0449df7c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1801.png and b/TMessagesProj/src/main/assets/emoji/0_1801.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1802.png b/TMessagesProj/src/main/assets/emoji/0_1802.png index 40af53d65..4c4ca2227 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1802.png and b/TMessagesProj/src/main/assets/emoji/0_1802.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1803.png b/TMessagesProj/src/main/assets/emoji/0_1803.png index 011bf647b..5073db07b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1803.png and b/TMessagesProj/src/main/assets/emoji/0_1803.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1804.png b/TMessagesProj/src/main/assets/emoji/0_1804.png index ce4c07941..b80a77394 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1804.png and b/TMessagesProj/src/main/assets/emoji/0_1804.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1805.png b/TMessagesProj/src/main/assets/emoji/0_1805.png index 75fcc1b24..30d06eccb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1805.png and b/TMessagesProj/src/main/assets/emoji/0_1805.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1806.png b/TMessagesProj/src/main/assets/emoji/0_1806.png index d64a58a9a..0621b4560 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1806.png and b/TMessagesProj/src/main/assets/emoji/0_1806.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1807.png b/TMessagesProj/src/main/assets/emoji/0_1807.png index d0f70c936..2300fbaa4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1807.png and b/TMessagesProj/src/main/assets/emoji/0_1807.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1808.png b/TMessagesProj/src/main/assets/emoji/0_1808.png index 3c7d7aef0..decbd5f6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1808.png and b/TMessagesProj/src/main/assets/emoji/0_1808.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1809.png b/TMessagesProj/src/main/assets/emoji/0_1809.png index aaa293b02..79a02c0d7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1809.png and b/TMessagesProj/src/main/assets/emoji/0_1809.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_181.png b/TMessagesProj/src/main/assets/emoji/0_181.png index 609277b69..ceb34e109 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_181.png and b/TMessagesProj/src/main/assets/emoji/0_181.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1810.png b/TMessagesProj/src/main/assets/emoji/0_1810.png index bb24d714e..274a51072 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1810.png and b/TMessagesProj/src/main/assets/emoji/0_1810.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1811.png b/TMessagesProj/src/main/assets/emoji/0_1811.png index 1192999d0..ce5a37451 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1811.png and b/TMessagesProj/src/main/assets/emoji/0_1811.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1812.png b/TMessagesProj/src/main/assets/emoji/0_1812.png index 67b31f402..575c6285b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1812.png and b/TMessagesProj/src/main/assets/emoji/0_1812.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1813.png b/TMessagesProj/src/main/assets/emoji/0_1813.png index cf55b06b9..777bbb2cc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1813.png and b/TMessagesProj/src/main/assets/emoji/0_1813.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1814.png b/TMessagesProj/src/main/assets/emoji/0_1814.png index 738e105d1..925f9ab1a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1814.png and b/TMessagesProj/src/main/assets/emoji/0_1814.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1815.png b/TMessagesProj/src/main/assets/emoji/0_1815.png index 6dbfbf9da..5476cce7a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1815.png and b/TMessagesProj/src/main/assets/emoji/0_1815.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1816.png b/TMessagesProj/src/main/assets/emoji/0_1816.png index 1aaf4867b..ec95da0f8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1816.png and b/TMessagesProj/src/main/assets/emoji/0_1816.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1817.png b/TMessagesProj/src/main/assets/emoji/0_1817.png index 8cddcef7c..7c9330d7a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1817.png and b/TMessagesProj/src/main/assets/emoji/0_1817.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1818.png b/TMessagesProj/src/main/assets/emoji/0_1818.png index ec7a77ec6..6071580fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1818.png and b/TMessagesProj/src/main/assets/emoji/0_1818.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1819.png b/TMessagesProj/src/main/assets/emoji/0_1819.png index 373c09284..8acd96cab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1819.png and b/TMessagesProj/src/main/assets/emoji/0_1819.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_182.png b/TMessagesProj/src/main/assets/emoji/0_182.png index 035cf5e92..4754a095b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_182.png and b/TMessagesProj/src/main/assets/emoji/0_182.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1820.png b/TMessagesProj/src/main/assets/emoji/0_1820.png index 4442df1c1..3ba91b0e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1820.png and b/TMessagesProj/src/main/assets/emoji/0_1820.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1821.png b/TMessagesProj/src/main/assets/emoji/0_1821.png index e4932d66f..7ee514ec6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1821.png and b/TMessagesProj/src/main/assets/emoji/0_1821.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1822.png b/TMessagesProj/src/main/assets/emoji/0_1822.png index 38c85ce2e..a3ab36794 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1822.png and b/TMessagesProj/src/main/assets/emoji/0_1822.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1823.png b/TMessagesProj/src/main/assets/emoji/0_1823.png index cd00e3c21..f149f9c58 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1823.png and b/TMessagesProj/src/main/assets/emoji/0_1823.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1824.png b/TMessagesProj/src/main/assets/emoji/0_1824.png index ef8f92005..2042af0b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1824.png and b/TMessagesProj/src/main/assets/emoji/0_1824.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1825.png b/TMessagesProj/src/main/assets/emoji/0_1825.png index 5d3d552b6..432883438 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1825.png and b/TMessagesProj/src/main/assets/emoji/0_1825.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1826.png b/TMessagesProj/src/main/assets/emoji/0_1826.png index faa638ca0..b063602c7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1826.png and b/TMessagesProj/src/main/assets/emoji/0_1826.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1827.png b/TMessagesProj/src/main/assets/emoji/0_1827.png index 5ec81f45e..c9710c1e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1827.png and b/TMessagesProj/src/main/assets/emoji/0_1827.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1828.png b/TMessagesProj/src/main/assets/emoji/0_1828.png index 878223c47..f9d8a7888 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1828.png and b/TMessagesProj/src/main/assets/emoji/0_1828.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1829.png b/TMessagesProj/src/main/assets/emoji/0_1829.png index 8c1d8a325..e7e6b1e59 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1829.png and b/TMessagesProj/src/main/assets/emoji/0_1829.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_183.png b/TMessagesProj/src/main/assets/emoji/0_183.png index fcf111010..30cd665e6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_183.png and b/TMessagesProj/src/main/assets/emoji/0_183.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1830.png b/TMessagesProj/src/main/assets/emoji/0_1830.png index 026b6034c..47bdce988 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1830.png and b/TMessagesProj/src/main/assets/emoji/0_1830.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1831.png b/TMessagesProj/src/main/assets/emoji/0_1831.png index 031997259..74d5fc1ca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1831.png and b/TMessagesProj/src/main/assets/emoji/0_1831.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1832.png b/TMessagesProj/src/main/assets/emoji/0_1832.png index 36b5669c6..da2528fc4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1832.png and b/TMessagesProj/src/main/assets/emoji/0_1832.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1833.png b/TMessagesProj/src/main/assets/emoji/0_1833.png index 8ca93a59a..a31c413da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1833.png and b/TMessagesProj/src/main/assets/emoji/0_1833.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1834.png b/TMessagesProj/src/main/assets/emoji/0_1834.png index e73b80e4d..dce7cef06 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1834.png and b/TMessagesProj/src/main/assets/emoji/0_1834.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1835.png b/TMessagesProj/src/main/assets/emoji/0_1835.png index f9c472c16..6da966974 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1835.png and b/TMessagesProj/src/main/assets/emoji/0_1835.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1836.png b/TMessagesProj/src/main/assets/emoji/0_1836.png index 200c15b60..71498284c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1836.png and b/TMessagesProj/src/main/assets/emoji/0_1836.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1837.png b/TMessagesProj/src/main/assets/emoji/0_1837.png index 7e7ab5a15..8400de153 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1837.png and b/TMessagesProj/src/main/assets/emoji/0_1837.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1838.png b/TMessagesProj/src/main/assets/emoji/0_1838.png index 18db0a26a..d6aa98568 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1838.png and b/TMessagesProj/src/main/assets/emoji/0_1838.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1839.png b/TMessagesProj/src/main/assets/emoji/0_1839.png index 313f16ce6..6dba0e8ce 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1839.png and b/TMessagesProj/src/main/assets/emoji/0_1839.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_184.png b/TMessagesProj/src/main/assets/emoji/0_184.png index 08ac775e3..4b26b2159 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_184.png and b/TMessagesProj/src/main/assets/emoji/0_184.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1840.png b/TMessagesProj/src/main/assets/emoji/0_1840.png index a4e2797df..090edab91 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1840.png and b/TMessagesProj/src/main/assets/emoji/0_1840.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1841.png b/TMessagesProj/src/main/assets/emoji/0_1841.png index 723fe25ef..52b945594 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1841.png and b/TMessagesProj/src/main/assets/emoji/0_1841.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1842.png b/TMessagesProj/src/main/assets/emoji/0_1842.png index 9e130b219..1e2e0f914 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1842.png and b/TMessagesProj/src/main/assets/emoji/0_1842.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1843.png b/TMessagesProj/src/main/assets/emoji/0_1843.png index feae3968d..3283b7ad3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1843.png and b/TMessagesProj/src/main/assets/emoji/0_1843.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1844.png b/TMessagesProj/src/main/assets/emoji/0_1844.png index 9374d1f20..5dd1d8bb3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1844.png and b/TMessagesProj/src/main/assets/emoji/0_1844.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1845.png b/TMessagesProj/src/main/assets/emoji/0_1845.png index c98ca7d4b..2ec3a624b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1845.png and b/TMessagesProj/src/main/assets/emoji/0_1845.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1846.png b/TMessagesProj/src/main/assets/emoji/0_1846.png index f92a9c533..1e5016171 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1846.png and b/TMessagesProj/src/main/assets/emoji/0_1846.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1847.png b/TMessagesProj/src/main/assets/emoji/0_1847.png index 349ce80d3..fefe8f5be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1847.png and b/TMessagesProj/src/main/assets/emoji/0_1847.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1848.png b/TMessagesProj/src/main/assets/emoji/0_1848.png index c6d650692..6911a2b07 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1848.png and b/TMessagesProj/src/main/assets/emoji/0_1848.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1849.png b/TMessagesProj/src/main/assets/emoji/0_1849.png index c2d03bb81..e6f47282e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1849.png and b/TMessagesProj/src/main/assets/emoji/0_1849.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_185.png b/TMessagesProj/src/main/assets/emoji/0_185.png index 6c846c770..c45c3f3c7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_185.png and b/TMessagesProj/src/main/assets/emoji/0_185.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1850.png b/TMessagesProj/src/main/assets/emoji/0_1850.png index caf01b84e..7d7b7d3bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1850.png and b/TMessagesProj/src/main/assets/emoji/0_1850.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1851.png b/TMessagesProj/src/main/assets/emoji/0_1851.png index b40794472..b54612aba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1851.png and b/TMessagesProj/src/main/assets/emoji/0_1851.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1852.png b/TMessagesProj/src/main/assets/emoji/0_1852.png index 9ecc0b1d4..9c610f409 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1852.png and b/TMessagesProj/src/main/assets/emoji/0_1852.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1853.png b/TMessagesProj/src/main/assets/emoji/0_1853.png index 9742c0e48..126706d8b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1853.png and b/TMessagesProj/src/main/assets/emoji/0_1853.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1854.png b/TMessagesProj/src/main/assets/emoji/0_1854.png index 6a045ee16..282068608 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1854.png and b/TMessagesProj/src/main/assets/emoji/0_1854.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1855.png b/TMessagesProj/src/main/assets/emoji/0_1855.png index 363debe95..e438efc35 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1855.png and b/TMessagesProj/src/main/assets/emoji/0_1855.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1856.png b/TMessagesProj/src/main/assets/emoji/0_1856.png index deeb38927..8cea17412 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1856.png and b/TMessagesProj/src/main/assets/emoji/0_1856.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1857.png b/TMessagesProj/src/main/assets/emoji/0_1857.png index 484e19797..68691d4db 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1857.png and b/TMessagesProj/src/main/assets/emoji/0_1857.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1858.png b/TMessagesProj/src/main/assets/emoji/0_1858.png index fe34ec835..488917328 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1858.png and b/TMessagesProj/src/main/assets/emoji/0_1858.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1859.png b/TMessagesProj/src/main/assets/emoji/0_1859.png index 4b353dcaa..2ca7a99d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1859.png and b/TMessagesProj/src/main/assets/emoji/0_1859.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_186.png b/TMessagesProj/src/main/assets/emoji/0_186.png index 0f234bdcf..091d0b0d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_186.png and b/TMessagesProj/src/main/assets/emoji/0_186.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1860.png b/TMessagesProj/src/main/assets/emoji/0_1860.png index 98bf9e64d..c5815d879 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1860.png and b/TMessagesProj/src/main/assets/emoji/0_1860.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1861.png b/TMessagesProj/src/main/assets/emoji/0_1861.png index fc9ec5fc1..88c97de5d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1861.png and b/TMessagesProj/src/main/assets/emoji/0_1861.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1862.png b/TMessagesProj/src/main/assets/emoji/0_1862.png index 458e9828e..15e282a18 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1862.png and b/TMessagesProj/src/main/assets/emoji/0_1862.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1863.png b/TMessagesProj/src/main/assets/emoji/0_1863.png index 4c7d96ec4..f2b903d13 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1863.png and b/TMessagesProj/src/main/assets/emoji/0_1863.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1864.png b/TMessagesProj/src/main/assets/emoji/0_1864.png index 464333a8d..befef0757 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1864.png and b/TMessagesProj/src/main/assets/emoji/0_1864.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1865.png b/TMessagesProj/src/main/assets/emoji/0_1865.png index 917df7f6d..211b9ac5c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1865.png and b/TMessagesProj/src/main/assets/emoji/0_1865.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1866.png b/TMessagesProj/src/main/assets/emoji/0_1866.png index ad719be70..4ce5fa1f9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1866.png and b/TMessagesProj/src/main/assets/emoji/0_1866.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1867.png b/TMessagesProj/src/main/assets/emoji/0_1867.png index 268dbfca1..767d5b299 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1867.png and b/TMessagesProj/src/main/assets/emoji/0_1867.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1868.png b/TMessagesProj/src/main/assets/emoji/0_1868.png index 0d7740dbc..f3d7d0c70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1868.png and b/TMessagesProj/src/main/assets/emoji/0_1868.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1869.png b/TMessagesProj/src/main/assets/emoji/0_1869.png index 1580dd765..d0cc157e1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1869.png and b/TMessagesProj/src/main/assets/emoji/0_1869.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_187.png b/TMessagesProj/src/main/assets/emoji/0_187.png index 955b0e9b9..718259926 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_187.png and b/TMessagesProj/src/main/assets/emoji/0_187.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1870.png b/TMessagesProj/src/main/assets/emoji/0_1870.png index 99afae623..36c01ecae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1870.png and b/TMessagesProj/src/main/assets/emoji/0_1870.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1871.png b/TMessagesProj/src/main/assets/emoji/0_1871.png index 8f76738fe..e70ad18a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1871.png and b/TMessagesProj/src/main/assets/emoji/0_1871.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1872.png b/TMessagesProj/src/main/assets/emoji/0_1872.png index 2450e3f85..bb654e341 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1872.png and b/TMessagesProj/src/main/assets/emoji/0_1872.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1873.png b/TMessagesProj/src/main/assets/emoji/0_1873.png index 33d3ff136..c018d209e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1873.png and b/TMessagesProj/src/main/assets/emoji/0_1873.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1874.png b/TMessagesProj/src/main/assets/emoji/0_1874.png index 514b33ab7..fec56a7ed 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1874.png and b/TMessagesProj/src/main/assets/emoji/0_1874.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1875.png b/TMessagesProj/src/main/assets/emoji/0_1875.png index 554d7977a..437961964 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1875.png and b/TMessagesProj/src/main/assets/emoji/0_1875.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1876.png b/TMessagesProj/src/main/assets/emoji/0_1876.png index 659d231e5..5ca081b5d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1876.png and b/TMessagesProj/src/main/assets/emoji/0_1876.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1877.png b/TMessagesProj/src/main/assets/emoji/0_1877.png index 0a3e3507c..0ca8defc2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1877.png and b/TMessagesProj/src/main/assets/emoji/0_1877.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1878.png b/TMessagesProj/src/main/assets/emoji/0_1878.png index 447610e12..d0e076a96 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1878.png and b/TMessagesProj/src/main/assets/emoji/0_1878.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1879.png b/TMessagesProj/src/main/assets/emoji/0_1879.png index 518ab9cec..947fc2f1c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1879.png and b/TMessagesProj/src/main/assets/emoji/0_1879.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_188.png b/TMessagesProj/src/main/assets/emoji/0_188.png index 1b65ce93a..4fd7124bb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_188.png and b/TMessagesProj/src/main/assets/emoji/0_188.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1880.png b/TMessagesProj/src/main/assets/emoji/0_1880.png index 3a22cc377..39b19ec67 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1880.png and b/TMessagesProj/src/main/assets/emoji/0_1880.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1881.png b/TMessagesProj/src/main/assets/emoji/0_1881.png index 5c5b88245..7a63a638c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1881.png and b/TMessagesProj/src/main/assets/emoji/0_1881.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1882.png b/TMessagesProj/src/main/assets/emoji/0_1882.png index 5b3b281f0..6ce334233 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1882.png and b/TMessagesProj/src/main/assets/emoji/0_1882.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1883.png b/TMessagesProj/src/main/assets/emoji/0_1883.png index 73ee12b4d..2f89bc88e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1883.png and b/TMessagesProj/src/main/assets/emoji/0_1883.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1884.png b/TMessagesProj/src/main/assets/emoji/0_1884.png index 00bfdcb1f..4607707eb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1884.png and b/TMessagesProj/src/main/assets/emoji/0_1884.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1885.png b/TMessagesProj/src/main/assets/emoji/0_1885.png index 48c7f4020..9667262a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1885.png and b/TMessagesProj/src/main/assets/emoji/0_1885.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1886.png b/TMessagesProj/src/main/assets/emoji/0_1886.png index f8ee4631e..0e5a9df60 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1886.png and b/TMessagesProj/src/main/assets/emoji/0_1886.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1887.png b/TMessagesProj/src/main/assets/emoji/0_1887.png index 586dd2b43..8bc2acf98 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1887.png and b/TMessagesProj/src/main/assets/emoji/0_1887.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1888.png b/TMessagesProj/src/main/assets/emoji/0_1888.png index 8d4d22d55..fd01f419f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1888.png and b/TMessagesProj/src/main/assets/emoji/0_1888.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1889.png b/TMessagesProj/src/main/assets/emoji/0_1889.png index 736bbb087..ef0796bb0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1889.png and b/TMessagesProj/src/main/assets/emoji/0_1889.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_189.png b/TMessagesProj/src/main/assets/emoji/0_189.png index a4bb3a992..71554431b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_189.png and b/TMessagesProj/src/main/assets/emoji/0_189.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1890.png b/TMessagesProj/src/main/assets/emoji/0_1890.png index 6b618b575..1e59a32b8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1890.png and b/TMessagesProj/src/main/assets/emoji/0_1890.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1891.png b/TMessagesProj/src/main/assets/emoji/0_1891.png index 7b52ff016..23f188f89 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1891.png and b/TMessagesProj/src/main/assets/emoji/0_1891.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1892.png b/TMessagesProj/src/main/assets/emoji/0_1892.png index 167db99ea..f8519440d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1892.png and b/TMessagesProj/src/main/assets/emoji/0_1892.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1893.png b/TMessagesProj/src/main/assets/emoji/0_1893.png index 8d04e6934..1438f28bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1893.png and b/TMessagesProj/src/main/assets/emoji/0_1893.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1894.png b/TMessagesProj/src/main/assets/emoji/0_1894.png index 1d67afc5e..b9eb8a9e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1894.png and b/TMessagesProj/src/main/assets/emoji/0_1894.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1895.png b/TMessagesProj/src/main/assets/emoji/0_1895.png index 2e038ece6..749c1a419 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1895.png and b/TMessagesProj/src/main/assets/emoji/0_1895.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1896.png b/TMessagesProj/src/main/assets/emoji/0_1896.png index fee075b40..f53fe97a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1896.png and b/TMessagesProj/src/main/assets/emoji/0_1896.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1897.png b/TMessagesProj/src/main/assets/emoji/0_1897.png index d433258be..2ef2a1623 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1897.png and b/TMessagesProj/src/main/assets/emoji/0_1897.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1898.png b/TMessagesProj/src/main/assets/emoji/0_1898.png index 6d14d4665..f9db06e57 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1898.png and b/TMessagesProj/src/main/assets/emoji/0_1898.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1899.png b/TMessagesProj/src/main/assets/emoji/0_1899.png index c5aa51a04..90940261c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1899.png and b/TMessagesProj/src/main/assets/emoji/0_1899.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_19.png b/TMessagesProj/src/main/assets/emoji/0_19.png index a9958864d..f8591ab3b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_19.png and b/TMessagesProj/src/main/assets/emoji/0_19.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_190.png b/TMessagesProj/src/main/assets/emoji/0_190.png index c26c6be8e..a549c5af4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_190.png and b/TMessagesProj/src/main/assets/emoji/0_190.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1900.png b/TMessagesProj/src/main/assets/emoji/0_1900.png index 7523629d4..46b656772 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1900.png and b/TMessagesProj/src/main/assets/emoji/0_1900.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1901.png b/TMessagesProj/src/main/assets/emoji/0_1901.png index e96f3d1fa..78bfd6296 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1901.png and b/TMessagesProj/src/main/assets/emoji/0_1901.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1902.png b/TMessagesProj/src/main/assets/emoji/0_1902.png index 42e3dd4eb..c6579dce8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1902.png and b/TMessagesProj/src/main/assets/emoji/0_1902.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1903.png b/TMessagesProj/src/main/assets/emoji/0_1903.png index 950a83acf..cc7f5ee6b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1903.png and b/TMessagesProj/src/main/assets/emoji/0_1903.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1904.png b/TMessagesProj/src/main/assets/emoji/0_1904.png index a66b5ca2d..be1fe1411 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1904.png and b/TMessagesProj/src/main/assets/emoji/0_1904.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1905.png b/TMessagesProj/src/main/assets/emoji/0_1905.png index 414b0dfdc..c94794c5b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1905.png and b/TMessagesProj/src/main/assets/emoji/0_1905.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1906.png b/TMessagesProj/src/main/assets/emoji/0_1906.png index ee82c6653..2d7efc2ed 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1906.png and b/TMessagesProj/src/main/assets/emoji/0_1906.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1907.png b/TMessagesProj/src/main/assets/emoji/0_1907.png index 8031f0125..01523e88d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1907.png and b/TMessagesProj/src/main/assets/emoji/0_1907.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1908.png b/TMessagesProj/src/main/assets/emoji/0_1908.png index 35510cf1a..823c46682 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1908.png and b/TMessagesProj/src/main/assets/emoji/0_1908.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1909.png b/TMessagesProj/src/main/assets/emoji/0_1909.png index 3786be0f2..691046a64 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1909.png and b/TMessagesProj/src/main/assets/emoji/0_1909.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_191.png b/TMessagesProj/src/main/assets/emoji/0_191.png index a90ce0c04..00b779046 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_191.png and b/TMessagesProj/src/main/assets/emoji/0_191.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1910.png b/TMessagesProj/src/main/assets/emoji/0_1910.png index 79b22df25..2b49251b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1910.png and b/TMessagesProj/src/main/assets/emoji/0_1910.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1911.png b/TMessagesProj/src/main/assets/emoji/0_1911.png index b3fde0d61..659a9802a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1911.png and b/TMessagesProj/src/main/assets/emoji/0_1911.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1912.png b/TMessagesProj/src/main/assets/emoji/0_1912.png index 9389110f4..9b131acbe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1912.png and b/TMessagesProj/src/main/assets/emoji/0_1912.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1913.png b/TMessagesProj/src/main/assets/emoji/0_1913.png index 7a72c88f0..43bc507f8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1913.png and b/TMessagesProj/src/main/assets/emoji/0_1913.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1914.png b/TMessagesProj/src/main/assets/emoji/0_1914.png index 82d34d3bc..65bda7de3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1914.png and b/TMessagesProj/src/main/assets/emoji/0_1914.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1915.png b/TMessagesProj/src/main/assets/emoji/0_1915.png index cbc8094c2..dc5fb0b1e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1915.png and b/TMessagesProj/src/main/assets/emoji/0_1915.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1916.png b/TMessagesProj/src/main/assets/emoji/0_1916.png index 1413b513e..8509e8a7f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1916.png and b/TMessagesProj/src/main/assets/emoji/0_1916.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1917.png b/TMessagesProj/src/main/assets/emoji/0_1917.png index 50912886a..2510acf47 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1917.png and b/TMessagesProj/src/main/assets/emoji/0_1917.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1918.png b/TMessagesProj/src/main/assets/emoji/0_1918.png index f77ede85d..cf8c43c7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1918.png and b/TMessagesProj/src/main/assets/emoji/0_1918.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1919.png b/TMessagesProj/src/main/assets/emoji/0_1919.png index 4b0382731..cf8c43c7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1919.png and b/TMessagesProj/src/main/assets/emoji/0_1919.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_192.png b/TMessagesProj/src/main/assets/emoji/0_192.png index 8cb759eed..6b85dd023 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_192.png and b/TMessagesProj/src/main/assets/emoji/0_192.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1920.png b/TMessagesProj/src/main/assets/emoji/0_1920.png index de8810dc1..4244dd694 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1920.png and b/TMessagesProj/src/main/assets/emoji/0_1920.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1921.png b/TMessagesProj/src/main/assets/emoji/0_1921.png index 5f3ca3842..4244dd694 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1921.png and b/TMessagesProj/src/main/assets/emoji/0_1921.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1922.png b/TMessagesProj/src/main/assets/emoji/0_1922.png index 42764476d..4244dd694 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1922.png and b/TMessagesProj/src/main/assets/emoji/0_1922.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1923.png b/TMessagesProj/src/main/assets/emoji/0_1923.png index 1c2bca65a..cf8c43c7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1923.png and b/TMessagesProj/src/main/assets/emoji/0_1923.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1924.png b/TMessagesProj/src/main/assets/emoji/0_1924.png index 3550e7244..cf8c43c7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1924.png and b/TMessagesProj/src/main/assets/emoji/0_1924.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1925.png b/TMessagesProj/src/main/assets/emoji/0_1925.png index 828b2870d..4244dd694 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1925.png and b/TMessagesProj/src/main/assets/emoji/0_1925.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1926.png b/TMessagesProj/src/main/assets/emoji/0_1926.png index 76d7f30c0..4244dd694 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1926.png and b/TMessagesProj/src/main/assets/emoji/0_1926.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1927.png b/TMessagesProj/src/main/assets/emoji/0_1927.png index 145699835..4244dd694 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1927.png and b/TMessagesProj/src/main/assets/emoji/0_1927.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1928.png b/TMessagesProj/src/main/assets/emoji/0_1928.png index ccfbd3038..cf8c43c7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1928.png and b/TMessagesProj/src/main/assets/emoji/0_1928.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1929.png b/TMessagesProj/src/main/assets/emoji/0_1929.png index ed2de51ca..cf8c43c7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1929.png and b/TMessagesProj/src/main/assets/emoji/0_1929.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_193.png b/TMessagesProj/src/main/assets/emoji/0_193.png index 59cf31e74..7dc192862 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_193.png and b/TMessagesProj/src/main/assets/emoji/0_193.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1930.png b/TMessagesProj/src/main/assets/emoji/0_1930.png index 4eefbdb78..4244dd694 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1930.png and b/TMessagesProj/src/main/assets/emoji/0_1930.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1931.png b/TMessagesProj/src/main/assets/emoji/0_1931.png index d447139e7..4244dd694 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1931.png and b/TMessagesProj/src/main/assets/emoji/0_1931.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1932.png b/TMessagesProj/src/main/assets/emoji/0_1932.png index ae3f784cb..4244dd694 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1932.png and b/TMessagesProj/src/main/assets/emoji/0_1932.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1933.png b/TMessagesProj/src/main/assets/emoji/0_1933.png index 3dc5773d8..c05822a03 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1933.png and b/TMessagesProj/src/main/assets/emoji/0_1933.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1934.png b/TMessagesProj/src/main/assets/emoji/0_1934.png index f72824cfa..c05822a03 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1934.png and b/TMessagesProj/src/main/assets/emoji/0_1934.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1935.png b/TMessagesProj/src/main/assets/emoji/0_1935.png index 757c539ae..ea9128b0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1935.png and b/TMessagesProj/src/main/assets/emoji/0_1935.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1936.png b/TMessagesProj/src/main/assets/emoji/0_1936.png index 530924c34..ea9128b0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1936.png and b/TMessagesProj/src/main/assets/emoji/0_1936.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1937.png b/TMessagesProj/src/main/assets/emoji/0_1937.png index c7378ba57..ea9128b0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1937.png and b/TMessagesProj/src/main/assets/emoji/0_1937.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1938.png b/TMessagesProj/src/main/assets/emoji/0_1938.png index 38d3ec2b2..c05822a03 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1938.png and b/TMessagesProj/src/main/assets/emoji/0_1938.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1939.png b/TMessagesProj/src/main/assets/emoji/0_1939.png index 9a9778f5d..c05822a03 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1939.png and b/TMessagesProj/src/main/assets/emoji/0_1939.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_194.png b/TMessagesProj/src/main/assets/emoji/0_194.png index dfe8c2347..c749e37a4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_194.png and b/TMessagesProj/src/main/assets/emoji/0_194.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1940.png b/TMessagesProj/src/main/assets/emoji/0_1940.png index 933d99d85..ea9128b0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1940.png and b/TMessagesProj/src/main/assets/emoji/0_1940.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1941.png b/TMessagesProj/src/main/assets/emoji/0_1941.png index fbc4e4763..ea9128b0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1941.png and b/TMessagesProj/src/main/assets/emoji/0_1941.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1942.png b/TMessagesProj/src/main/assets/emoji/0_1942.png index ec5da6f3f..ea9128b0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1942.png and b/TMessagesProj/src/main/assets/emoji/0_1942.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1943.png b/TMessagesProj/src/main/assets/emoji/0_1943.png index 4615b22a8..81f683a93 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1943.png and b/TMessagesProj/src/main/assets/emoji/0_1943.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1944.png b/TMessagesProj/src/main/assets/emoji/0_1944.png index 644aa8217..c94848e10 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1944.png and b/TMessagesProj/src/main/assets/emoji/0_1944.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1945.png b/TMessagesProj/src/main/assets/emoji/0_1945.png index 0d90fa1fb..7e9099be4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1945.png and b/TMessagesProj/src/main/assets/emoji/0_1945.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1946.png b/TMessagesProj/src/main/assets/emoji/0_1946.png index aff1308ee..3a098d8dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1946.png and b/TMessagesProj/src/main/assets/emoji/0_1946.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1947.png b/TMessagesProj/src/main/assets/emoji/0_1947.png index c35d52b41..bb6f51c71 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1947.png and b/TMessagesProj/src/main/assets/emoji/0_1947.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1948.png b/TMessagesProj/src/main/assets/emoji/0_1948.png index edaad7746..cff99ac53 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1948.png and b/TMessagesProj/src/main/assets/emoji/0_1948.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1949.png b/TMessagesProj/src/main/assets/emoji/0_1949.png index d9e1767a7..9273acdec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1949.png and b/TMessagesProj/src/main/assets/emoji/0_1949.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_195.png b/TMessagesProj/src/main/assets/emoji/0_195.png index f0f2a8d4b..e9110bfee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_195.png and b/TMessagesProj/src/main/assets/emoji/0_195.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1950.png b/TMessagesProj/src/main/assets/emoji/0_1950.png index a86198738..adf570889 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1950.png and b/TMessagesProj/src/main/assets/emoji/0_1950.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1951.png b/TMessagesProj/src/main/assets/emoji/0_1951.png index a4e1be9ad..370f83981 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1951.png and b/TMessagesProj/src/main/assets/emoji/0_1951.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1952.png b/TMessagesProj/src/main/assets/emoji/0_1952.png index 415d6b94a..80923aa91 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1952.png and b/TMessagesProj/src/main/assets/emoji/0_1952.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1953.png b/TMessagesProj/src/main/assets/emoji/0_1953.png index 16c0c20dc..9a9b6ffcc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1953.png and b/TMessagesProj/src/main/assets/emoji/0_1953.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1954.png b/TMessagesProj/src/main/assets/emoji/0_1954.png index ee21a09a0..7b2c817b8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1954.png and b/TMessagesProj/src/main/assets/emoji/0_1954.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1955.png b/TMessagesProj/src/main/assets/emoji/0_1955.png index 0107ad924..e9f10d922 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1955.png and b/TMessagesProj/src/main/assets/emoji/0_1955.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1956.png b/TMessagesProj/src/main/assets/emoji/0_1956.png index 2992b6774..25a86b82f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1956.png and b/TMessagesProj/src/main/assets/emoji/0_1956.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1957.png b/TMessagesProj/src/main/assets/emoji/0_1957.png index 6d9585eba..460027cc0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1957.png and b/TMessagesProj/src/main/assets/emoji/0_1957.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1958.png b/TMessagesProj/src/main/assets/emoji/0_1958.png index a20f01a66..fc57cf205 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1958.png and b/TMessagesProj/src/main/assets/emoji/0_1958.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1959.png b/TMessagesProj/src/main/assets/emoji/0_1959.png index 1cdc8b07b..d94c1ff59 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1959.png and b/TMessagesProj/src/main/assets/emoji/0_1959.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_196.png b/TMessagesProj/src/main/assets/emoji/0_196.png index dfeadd55b..2eeec9858 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_196.png and b/TMessagesProj/src/main/assets/emoji/0_196.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1960.png b/TMessagesProj/src/main/assets/emoji/0_1960.png index 7caad1dae..31e37d189 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1960.png and b/TMessagesProj/src/main/assets/emoji/0_1960.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1961.png b/TMessagesProj/src/main/assets/emoji/0_1961.png index f0908725d..b222f64f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1961.png and b/TMessagesProj/src/main/assets/emoji/0_1961.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1962.png b/TMessagesProj/src/main/assets/emoji/0_1962.png index c44b74bc3..e6ebc851e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1962.png and b/TMessagesProj/src/main/assets/emoji/0_1962.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1963.png b/TMessagesProj/src/main/assets/emoji/0_1963.png index bced729fa..db163c954 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1963.png and b/TMessagesProj/src/main/assets/emoji/0_1963.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1964.png b/TMessagesProj/src/main/assets/emoji/0_1964.png index aedb47834..b3900fe4b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1964.png and b/TMessagesProj/src/main/assets/emoji/0_1964.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1965.png b/TMessagesProj/src/main/assets/emoji/0_1965.png index 3f7ebc108..fdd76fc85 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1965.png and b/TMessagesProj/src/main/assets/emoji/0_1965.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1966.png b/TMessagesProj/src/main/assets/emoji/0_1966.png index fff9c6300..449274dc2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1966.png and b/TMessagesProj/src/main/assets/emoji/0_1966.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1967.png b/TMessagesProj/src/main/assets/emoji/0_1967.png index 65a3e61f3..79fb206b3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1967.png and b/TMessagesProj/src/main/assets/emoji/0_1967.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1968.png b/TMessagesProj/src/main/assets/emoji/0_1968.png index e26892d15..5af3ab3c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1968.png and b/TMessagesProj/src/main/assets/emoji/0_1968.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1969.png b/TMessagesProj/src/main/assets/emoji/0_1969.png index cf3d2fac7..935d2f9cb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1969.png and b/TMessagesProj/src/main/assets/emoji/0_1969.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_197.png b/TMessagesProj/src/main/assets/emoji/0_197.png index 71d9de9bb..3151fe8cc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_197.png and b/TMessagesProj/src/main/assets/emoji/0_197.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1970.png b/TMessagesProj/src/main/assets/emoji/0_1970.png index 5e23d05f4..2b20471b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1970.png and b/TMessagesProj/src/main/assets/emoji/0_1970.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1971.png b/TMessagesProj/src/main/assets/emoji/0_1971.png index 1cba60355..5c32f0517 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1971.png and b/TMessagesProj/src/main/assets/emoji/0_1971.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1972.png b/TMessagesProj/src/main/assets/emoji/0_1972.png index a3e519172..d3f893c70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1972.png and b/TMessagesProj/src/main/assets/emoji/0_1972.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1973.png b/TMessagesProj/src/main/assets/emoji/0_1973.png index 0a4fc41a1..b7cb01611 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1973.png and b/TMessagesProj/src/main/assets/emoji/0_1973.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1974.png b/TMessagesProj/src/main/assets/emoji/0_1974.png index 9b352feec..3350d0a99 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1974.png and b/TMessagesProj/src/main/assets/emoji/0_1974.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1975.png b/TMessagesProj/src/main/assets/emoji/0_1975.png index 60f4cb0de..5008ace3c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1975.png and b/TMessagesProj/src/main/assets/emoji/0_1975.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1976.png b/TMessagesProj/src/main/assets/emoji/0_1976.png index 8761dac47..bda13e903 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1976.png and b/TMessagesProj/src/main/assets/emoji/0_1976.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1977.png b/TMessagesProj/src/main/assets/emoji/0_1977.png index c4780b387..50ef521ce 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1977.png and b/TMessagesProj/src/main/assets/emoji/0_1977.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1978.png b/TMessagesProj/src/main/assets/emoji/0_1978.png index e62fe3cef..89563fd2f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1978.png and b/TMessagesProj/src/main/assets/emoji/0_1978.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1979.png b/TMessagesProj/src/main/assets/emoji/0_1979.png index 225924e6b..a6d7fa230 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1979.png and b/TMessagesProj/src/main/assets/emoji/0_1979.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_198.png b/TMessagesProj/src/main/assets/emoji/0_198.png index 34768a2a0..3c9cb513e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_198.png and b/TMessagesProj/src/main/assets/emoji/0_198.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1980.png b/TMessagesProj/src/main/assets/emoji/0_1980.png index 76f4631ba..5d9b0b61a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1980.png and b/TMessagesProj/src/main/assets/emoji/0_1980.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1981.png b/TMessagesProj/src/main/assets/emoji/0_1981.png index ab5975bca..167569f39 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1981.png and b/TMessagesProj/src/main/assets/emoji/0_1981.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1982.png b/TMessagesProj/src/main/assets/emoji/0_1982.png index c74155983..a1cf02c74 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1982.png and b/TMessagesProj/src/main/assets/emoji/0_1982.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1983.png b/TMessagesProj/src/main/assets/emoji/0_1983.png index 7e6cda2e0..978dc45d6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1983.png and b/TMessagesProj/src/main/assets/emoji/0_1983.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1984.png b/TMessagesProj/src/main/assets/emoji/0_1984.png index 47e6b5d3c..ca7b3ffd0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1984.png and b/TMessagesProj/src/main/assets/emoji/0_1984.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1985.png b/TMessagesProj/src/main/assets/emoji/0_1985.png index 547b384a6..d4e153a8d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1985.png and b/TMessagesProj/src/main/assets/emoji/0_1985.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1986.png b/TMessagesProj/src/main/assets/emoji/0_1986.png index befcf27cb..8195fc7c9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1986.png and b/TMessagesProj/src/main/assets/emoji/0_1986.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1987.png b/TMessagesProj/src/main/assets/emoji/0_1987.png index 076b4ebf4..3136d7f74 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_1987.png and b/TMessagesProj/src/main/assets/emoji/0_1987.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1988.png b/TMessagesProj/src/main/assets/emoji/0_1988.png new file mode 100644 index 000000000..771323867 Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/0_1988.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_1989.png b/TMessagesProj/src/main/assets/emoji/0_1989.png new file mode 100644 index 000000000..2c7a278e7 Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/0_1989.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_199.png b/TMessagesProj/src/main/assets/emoji/0_199.png index cc4d92986..38cf60307 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_199.png and b/TMessagesProj/src/main/assets/emoji/0_199.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_2.png b/TMessagesProj/src/main/assets/emoji/0_2.png index 4e874d087..0e3388790 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_2.png and b/TMessagesProj/src/main/assets/emoji/0_2.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_20.png b/TMessagesProj/src/main/assets/emoji/0_20.png index f90c8885c..adf483e85 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_20.png and b/TMessagesProj/src/main/assets/emoji/0_20.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_200.png b/TMessagesProj/src/main/assets/emoji/0_200.png index 2f02e3370..d11d0eb2e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_200.png and b/TMessagesProj/src/main/assets/emoji/0_200.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_201.png b/TMessagesProj/src/main/assets/emoji/0_201.png index 81056c464..9ea718879 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_201.png and b/TMessagesProj/src/main/assets/emoji/0_201.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_202.png b/TMessagesProj/src/main/assets/emoji/0_202.png index e5cb5eafe..a08363a8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_202.png and b/TMessagesProj/src/main/assets/emoji/0_202.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_203.png b/TMessagesProj/src/main/assets/emoji/0_203.png index 96d733c24..55b899bf8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_203.png and b/TMessagesProj/src/main/assets/emoji/0_203.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_204.png b/TMessagesProj/src/main/assets/emoji/0_204.png index f5692890e..a009efefd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_204.png and b/TMessagesProj/src/main/assets/emoji/0_204.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_205.png b/TMessagesProj/src/main/assets/emoji/0_205.png index 40a2b479d..979ecc935 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_205.png and b/TMessagesProj/src/main/assets/emoji/0_205.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_206.png b/TMessagesProj/src/main/assets/emoji/0_206.png index 24eef6627..9453997ef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_206.png and b/TMessagesProj/src/main/assets/emoji/0_206.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_207.png b/TMessagesProj/src/main/assets/emoji/0_207.png index 0d76e880c..8d09cf591 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_207.png and b/TMessagesProj/src/main/assets/emoji/0_207.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_208.png b/TMessagesProj/src/main/assets/emoji/0_208.png index 61d399a95..bf8aa8768 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_208.png and b/TMessagesProj/src/main/assets/emoji/0_208.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_209.png b/TMessagesProj/src/main/assets/emoji/0_209.png index 84236d0e5..411bf9a98 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_209.png and b/TMessagesProj/src/main/assets/emoji/0_209.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_21.png b/TMessagesProj/src/main/assets/emoji/0_21.png index 2fc6dbc42..29d280bc6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_21.png and b/TMessagesProj/src/main/assets/emoji/0_21.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_210.png b/TMessagesProj/src/main/assets/emoji/0_210.png index 29d3b11ff..05eab0a29 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_210.png and b/TMessagesProj/src/main/assets/emoji/0_210.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_211.png b/TMessagesProj/src/main/assets/emoji/0_211.png index e670b0034..f07168684 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_211.png and b/TMessagesProj/src/main/assets/emoji/0_211.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_212.png b/TMessagesProj/src/main/assets/emoji/0_212.png index 621f71f3a..96ea71844 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_212.png and b/TMessagesProj/src/main/assets/emoji/0_212.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_213.png b/TMessagesProj/src/main/assets/emoji/0_213.png index c386f83cb..5145c7941 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_213.png and b/TMessagesProj/src/main/assets/emoji/0_213.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_214.png b/TMessagesProj/src/main/assets/emoji/0_214.png index c402088bc..4989806fe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_214.png and b/TMessagesProj/src/main/assets/emoji/0_214.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_215.png b/TMessagesProj/src/main/assets/emoji/0_215.png index 1e66909d4..38cebe8d9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_215.png and b/TMessagesProj/src/main/assets/emoji/0_215.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_216.png b/TMessagesProj/src/main/assets/emoji/0_216.png index bdcc2d689..c4deb62df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_216.png and b/TMessagesProj/src/main/assets/emoji/0_216.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_217.png b/TMessagesProj/src/main/assets/emoji/0_217.png index 8d6d9f1df..3ea86bd88 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_217.png and b/TMessagesProj/src/main/assets/emoji/0_217.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_218.png b/TMessagesProj/src/main/assets/emoji/0_218.png index 068ec49c3..2e00cd7e5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_218.png and b/TMessagesProj/src/main/assets/emoji/0_218.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_219.png b/TMessagesProj/src/main/assets/emoji/0_219.png index 43c6527f3..f0fb566a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_219.png and b/TMessagesProj/src/main/assets/emoji/0_219.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_22.png b/TMessagesProj/src/main/assets/emoji/0_22.png index e7ccf70c6..2ab9ca7f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_22.png and b/TMessagesProj/src/main/assets/emoji/0_22.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_220.png b/TMessagesProj/src/main/assets/emoji/0_220.png index bfb068eb6..79fa3c755 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_220.png and b/TMessagesProj/src/main/assets/emoji/0_220.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_221.png b/TMessagesProj/src/main/assets/emoji/0_221.png index c2c8ee6a5..0be590116 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_221.png and b/TMessagesProj/src/main/assets/emoji/0_221.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_222.png b/TMessagesProj/src/main/assets/emoji/0_222.png index 75c053ac1..7c3c2ac38 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_222.png and b/TMessagesProj/src/main/assets/emoji/0_222.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_223.png b/TMessagesProj/src/main/assets/emoji/0_223.png index 6f9670cf8..ff8909ec9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_223.png and b/TMessagesProj/src/main/assets/emoji/0_223.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_224.png b/TMessagesProj/src/main/assets/emoji/0_224.png index df00ae63c..c3544a85e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_224.png and b/TMessagesProj/src/main/assets/emoji/0_224.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_225.png b/TMessagesProj/src/main/assets/emoji/0_225.png index 78018f1bc..63337694e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_225.png and b/TMessagesProj/src/main/assets/emoji/0_225.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_226.png b/TMessagesProj/src/main/assets/emoji/0_226.png index 1f208a53f..d0950b67f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_226.png and b/TMessagesProj/src/main/assets/emoji/0_226.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_227.png b/TMessagesProj/src/main/assets/emoji/0_227.png index b3b3e9978..63b1ac7d9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_227.png and b/TMessagesProj/src/main/assets/emoji/0_227.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_228.png b/TMessagesProj/src/main/assets/emoji/0_228.png index 0bfade75a..5e43845df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_228.png and b/TMessagesProj/src/main/assets/emoji/0_228.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_229.png b/TMessagesProj/src/main/assets/emoji/0_229.png index 07afce04b..956a6a6f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_229.png and b/TMessagesProj/src/main/assets/emoji/0_229.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_23.png b/TMessagesProj/src/main/assets/emoji/0_23.png index f0e3abcc1..3df15a5a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_23.png and b/TMessagesProj/src/main/assets/emoji/0_23.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_230.png b/TMessagesProj/src/main/assets/emoji/0_230.png index dae027141..46329bef0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_230.png and b/TMessagesProj/src/main/assets/emoji/0_230.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_231.png b/TMessagesProj/src/main/assets/emoji/0_231.png index 311da664c..2bc14678e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_231.png and b/TMessagesProj/src/main/assets/emoji/0_231.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_232.png b/TMessagesProj/src/main/assets/emoji/0_232.png index 04370b535..3067a31ae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_232.png and b/TMessagesProj/src/main/assets/emoji/0_232.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_233.png b/TMessagesProj/src/main/assets/emoji/0_233.png index 16d15e935..e514781d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_233.png and b/TMessagesProj/src/main/assets/emoji/0_233.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_234.png b/TMessagesProj/src/main/assets/emoji/0_234.png index f08e3a663..8a0076302 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_234.png and b/TMessagesProj/src/main/assets/emoji/0_234.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_235.png b/TMessagesProj/src/main/assets/emoji/0_235.png index ea4f12f3b..cf68c8e60 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_235.png and b/TMessagesProj/src/main/assets/emoji/0_235.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_236.png b/TMessagesProj/src/main/assets/emoji/0_236.png index c744d0824..27c77987d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_236.png and b/TMessagesProj/src/main/assets/emoji/0_236.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_237.png b/TMessagesProj/src/main/assets/emoji/0_237.png index 3920dc868..22b2e3a7d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_237.png and b/TMessagesProj/src/main/assets/emoji/0_237.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_238.png b/TMessagesProj/src/main/assets/emoji/0_238.png index f148796c3..f9a8a936a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_238.png and b/TMessagesProj/src/main/assets/emoji/0_238.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_239.png b/TMessagesProj/src/main/assets/emoji/0_239.png index f7a1b8563..a8b45faaf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_239.png and b/TMessagesProj/src/main/assets/emoji/0_239.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_24.png b/TMessagesProj/src/main/assets/emoji/0_24.png index 2a2f7a9da..2a31464bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_24.png and b/TMessagesProj/src/main/assets/emoji/0_24.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_240.png b/TMessagesProj/src/main/assets/emoji/0_240.png index 9f4aadeba..3cd70061d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_240.png and b/TMessagesProj/src/main/assets/emoji/0_240.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_241.png b/TMessagesProj/src/main/assets/emoji/0_241.png index 350f2f3a1..512b2e675 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_241.png and b/TMessagesProj/src/main/assets/emoji/0_241.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_242.png b/TMessagesProj/src/main/assets/emoji/0_242.png index 584faa6cd..4d090a9c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_242.png and b/TMessagesProj/src/main/assets/emoji/0_242.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_243.png b/TMessagesProj/src/main/assets/emoji/0_243.png index 14a5a81c4..11f85a801 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_243.png and b/TMessagesProj/src/main/assets/emoji/0_243.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_244.png b/TMessagesProj/src/main/assets/emoji/0_244.png index 5d12e33fd..63c287f10 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_244.png and b/TMessagesProj/src/main/assets/emoji/0_244.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_245.png b/TMessagesProj/src/main/assets/emoji/0_245.png index 752123afb..c437f4231 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_245.png and b/TMessagesProj/src/main/assets/emoji/0_245.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_246.png b/TMessagesProj/src/main/assets/emoji/0_246.png index 2ac006df0..d73d6d019 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_246.png and b/TMessagesProj/src/main/assets/emoji/0_246.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_247.png b/TMessagesProj/src/main/assets/emoji/0_247.png index 5828ed9dc..44e33472b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_247.png and b/TMessagesProj/src/main/assets/emoji/0_247.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_248.png b/TMessagesProj/src/main/assets/emoji/0_248.png index 96d296007..1c5fc2f79 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_248.png and b/TMessagesProj/src/main/assets/emoji/0_248.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_249.png b/TMessagesProj/src/main/assets/emoji/0_249.png index 38ad77510..4b87666a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_249.png and b/TMessagesProj/src/main/assets/emoji/0_249.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_25.png b/TMessagesProj/src/main/assets/emoji/0_25.png index c3005a9c4..cb10fb0a7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_25.png and b/TMessagesProj/src/main/assets/emoji/0_25.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_250.png b/TMessagesProj/src/main/assets/emoji/0_250.png index 396ff7bff..f771c8969 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_250.png and b/TMessagesProj/src/main/assets/emoji/0_250.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_251.png b/TMessagesProj/src/main/assets/emoji/0_251.png index 85adaebce..a46b69a6d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_251.png and b/TMessagesProj/src/main/assets/emoji/0_251.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_252.png b/TMessagesProj/src/main/assets/emoji/0_252.png index ea08c0ee7..6f6ae682c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_252.png and b/TMessagesProj/src/main/assets/emoji/0_252.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_253.png b/TMessagesProj/src/main/assets/emoji/0_253.png index b44bd804d..4afa69b6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_253.png and b/TMessagesProj/src/main/assets/emoji/0_253.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_254.png b/TMessagesProj/src/main/assets/emoji/0_254.png index 3142f7e69..7d14b6002 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_254.png and b/TMessagesProj/src/main/assets/emoji/0_254.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_255.png b/TMessagesProj/src/main/assets/emoji/0_255.png index fa467e071..6fd0043a5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_255.png and b/TMessagesProj/src/main/assets/emoji/0_255.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_256.png b/TMessagesProj/src/main/assets/emoji/0_256.png index 2a756e963..6be15d900 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_256.png and b/TMessagesProj/src/main/assets/emoji/0_256.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_257.png b/TMessagesProj/src/main/assets/emoji/0_257.png index 6e2d5f28f..22c1a3f8f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_257.png and b/TMessagesProj/src/main/assets/emoji/0_257.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_258.png b/TMessagesProj/src/main/assets/emoji/0_258.png index 57a5d3dc4..122acd876 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_258.png and b/TMessagesProj/src/main/assets/emoji/0_258.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_259.png b/TMessagesProj/src/main/assets/emoji/0_259.png index 1dcdcf366..05411d338 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_259.png and b/TMessagesProj/src/main/assets/emoji/0_259.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_26.png b/TMessagesProj/src/main/assets/emoji/0_26.png index f0c4c47ab..677eb7ba8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_26.png and b/TMessagesProj/src/main/assets/emoji/0_26.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_260.png b/TMessagesProj/src/main/assets/emoji/0_260.png index cc5220c4d..bb0bc6ba9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_260.png and b/TMessagesProj/src/main/assets/emoji/0_260.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_261.png b/TMessagesProj/src/main/assets/emoji/0_261.png index ae4e9ba4d..2574f11a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_261.png and b/TMessagesProj/src/main/assets/emoji/0_261.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_262.png b/TMessagesProj/src/main/assets/emoji/0_262.png index 92681146f..0b7d9a37f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_262.png and b/TMessagesProj/src/main/assets/emoji/0_262.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_263.png b/TMessagesProj/src/main/assets/emoji/0_263.png index fc3a28368..e970debe4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_263.png and b/TMessagesProj/src/main/assets/emoji/0_263.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_264.png b/TMessagesProj/src/main/assets/emoji/0_264.png index 58aa43ec9..26a34fd54 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_264.png and b/TMessagesProj/src/main/assets/emoji/0_264.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_265.png b/TMessagesProj/src/main/assets/emoji/0_265.png index 5a3389204..b74e93e92 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_265.png and b/TMessagesProj/src/main/assets/emoji/0_265.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_266.png b/TMessagesProj/src/main/assets/emoji/0_266.png index a6dded035..4ae7c5035 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_266.png and b/TMessagesProj/src/main/assets/emoji/0_266.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_267.png b/TMessagesProj/src/main/assets/emoji/0_267.png index 937a86e71..7115c354e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_267.png and b/TMessagesProj/src/main/assets/emoji/0_267.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_268.png b/TMessagesProj/src/main/assets/emoji/0_268.png index fd86eed8c..8add3daae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_268.png and b/TMessagesProj/src/main/assets/emoji/0_268.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_269.png b/TMessagesProj/src/main/assets/emoji/0_269.png index a61b98630..fd10ad239 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_269.png and b/TMessagesProj/src/main/assets/emoji/0_269.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_27.png b/TMessagesProj/src/main/assets/emoji/0_27.png index 6ab709ba8..02d713968 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_27.png and b/TMessagesProj/src/main/assets/emoji/0_27.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_270.png b/TMessagesProj/src/main/assets/emoji/0_270.png index c1fc7d9d0..960d8591e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_270.png and b/TMessagesProj/src/main/assets/emoji/0_270.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_271.png b/TMessagesProj/src/main/assets/emoji/0_271.png index 90169a521..8da415cf6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_271.png and b/TMessagesProj/src/main/assets/emoji/0_271.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_272.png b/TMessagesProj/src/main/assets/emoji/0_272.png index dca3bb8e0..fec0f7b7f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_272.png and b/TMessagesProj/src/main/assets/emoji/0_272.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_273.png b/TMessagesProj/src/main/assets/emoji/0_273.png index 3c71f883e..a515a3eb7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_273.png and b/TMessagesProj/src/main/assets/emoji/0_273.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_274.png b/TMessagesProj/src/main/assets/emoji/0_274.png index 6d0435c09..03c932ebe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_274.png and b/TMessagesProj/src/main/assets/emoji/0_274.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_275.png b/TMessagesProj/src/main/assets/emoji/0_275.png index 3374c81b0..4f7d20126 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_275.png and b/TMessagesProj/src/main/assets/emoji/0_275.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_276.png b/TMessagesProj/src/main/assets/emoji/0_276.png index c07ab92fc..8561fa6d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_276.png and b/TMessagesProj/src/main/assets/emoji/0_276.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_277.png b/TMessagesProj/src/main/assets/emoji/0_277.png index c280580d8..194b4a9b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_277.png and b/TMessagesProj/src/main/assets/emoji/0_277.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_278.png b/TMessagesProj/src/main/assets/emoji/0_278.png index 78ef3677b..b8218c7f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_278.png and b/TMessagesProj/src/main/assets/emoji/0_278.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_279.png b/TMessagesProj/src/main/assets/emoji/0_279.png index 956cbfe67..030b1b30c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_279.png and b/TMessagesProj/src/main/assets/emoji/0_279.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_28.png b/TMessagesProj/src/main/assets/emoji/0_28.png index 6293fc148..04f0190f5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_28.png and b/TMessagesProj/src/main/assets/emoji/0_28.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_280.png b/TMessagesProj/src/main/assets/emoji/0_280.png index 6103a8860..9f50cd923 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_280.png and b/TMessagesProj/src/main/assets/emoji/0_280.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_281.png b/TMessagesProj/src/main/assets/emoji/0_281.png index 964c66e17..742daf4c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_281.png and b/TMessagesProj/src/main/assets/emoji/0_281.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_282.png b/TMessagesProj/src/main/assets/emoji/0_282.png index 6faa9406a..a6f2ef2e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_282.png and b/TMessagesProj/src/main/assets/emoji/0_282.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_283.png b/TMessagesProj/src/main/assets/emoji/0_283.png index 8f28816ba..f7b7683ea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_283.png and b/TMessagesProj/src/main/assets/emoji/0_283.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_284.png b/TMessagesProj/src/main/assets/emoji/0_284.png index 7c23766f6..faf770e33 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_284.png and b/TMessagesProj/src/main/assets/emoji/0_284.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_285.png b/TMessagesProj/src/main/assets/emoji/0_285.png index 32a3bd7cb..49d3ad491 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_285.png and b/TMessagesProj/src/main/assets/emoji/0_285.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_286.png b/TMessagesProj/src/main/assets/emoji/0_286.png index 5f09a3102..4dd6ac14a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_286.png and b/TMessagesProj/src/main/assets/emoji/0_286.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_287.png b/TMessagesProj/src/main/assets/emoji/0_287.png index b64f5b28a..6d7d30184 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_287.png and b/TMessagesProj/src/main/assets/emoji/0_287.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_288.png b/TMessagesProj/src/main/assets/emoji/0_288.png index 46c0f7453..6e16fc532 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_288.png and b/TMessagesProj/src/main/assets/emoji/0_288.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_289.png b/TMessagesProj/src/main/assets/emoji/0_289.png index 3b0490afa..3920cb98b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_289.png and b/TMessagesProj/src/main/assets/emoji/0_289.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_29.png b/TMessagesProj/src/main/assets/emoji/0_29.png index 668789ec5..133365481 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_29.png and b/TMessagesProj/src/main/assets/emoji/0_29.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_290.png b/TMessagesProj/src/main/assets/emoji/0_290.png index 7cb6088c1..3910ee0ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_290.png and b/TMessagesProj/src/main/assets/emoji/0_290.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_291.png b/TMessagesProj/src/main/assets/emoji/0_291.png index 31b4e0af0..b7bb9390b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_291.png and b/TMessagesProj/src/main/assets/emoji/0_291.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_292.png b/TMessagesProj/src/main/assets/emoji/0_292.png index f9ed4afb8..a9d737e7f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_292.png and b/TMessagesProj/src/main/assets/emoji/0_292.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_293.png b/TMessagesProj/src/main/assets/emoji/0_293.png index f699b2a05..87aa72d0d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_293.png and b/TMessagesProj/src/main/assets/emoji/0_293.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_294.png b/TMessagesProj/src/main/assets/emoji/0_294.png index 94cc0aa8a..eb02cbf4a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_294.png and b/TMessagesProj/src/main/assets/emoji/0_294.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_295.png b/TMessagesProj/src/main/assets/emoji/0_295.png index 2acd36be8..f71a9835c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_295.png and b/TMessagesProj/src/main/assets/emoji/0_295.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_296.png b/TMessagesProj/src/main/assets/emoji/0_296.png index c81144bd1..4d6e1fd4f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_296.png and b/TMessagesProj/src/main/assets/emoji/0_296.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_297.png b/TMessagesProj/src/main/assets/emoji/0_297.png index 6141b8ccd..0636d1b8e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_297.png and b/TMessagesProj/src/main/assets/emoji/0_297.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_298.png b/TMessagesProj/src/main/assets/emoji/0_298.png index d09814007..7b81910a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_298.png and b/TMessagesProj/src/main/assets/emoji/0_298.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_299.png b/TMessagesProj/src/main/assets/emoji/0_299.png index 191bf5776..0a026bb9b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_299.png and b/TMessagesProj/src/main/assets/emoji/0_299.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_3.png b/TMessagesProj/src/main/assets/emoji/0_3.png index 198e087c0..99280b5a8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_3.png and b/TMessagesProj/src/main/assets/emoji/0_3.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_30.png b/TMessagesProj/src/main/assets/emoji/0_30.png index 58ce88798..d7ee00435 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_30.png and b/TMessagesProj/src/main/assets/emoji/0_30.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_300.png b/TMessagesProj/src/main/assets/emoji/0_300.png index f260a8743..6c20ac367 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_300.png and b/TMessagesProj/src/main/assets/emoji/0_300.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_301.png b/TMessagesProj/src/main/assets/emoji/0_301.png index 6cea54ee6..60f3f57cd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_301.png and b/TMessagesProj/src/main/assets/emoji/0_301.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_302.png b/TMessagesProj/src/main/assets/emoji/0_302.png index 50ad8f138..95506f174 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_302.png and b/TMessagesProj/src/main/assets/emoji/0_302.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_303.png b/TMessagesProj/src/main/assets/emoji/0_303.png index a80bd7fe2..848c586d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_303.png and b/TMessagesProj/src/main/assets/emoji/0_303.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_304.png b/TMessagesProj/src/main/assets/emoji/0_304.png index b05a46d30..33e41d42d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_304.png and b/TMessagesProj/src/main/assets/emoji/0_304.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_305.png b/TMessagesProj/src/main/assets/emoji/0_305.png index 12d64c516..56f6198ce 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_305.png and b/TMessagesProj/src/main/assets/emoji/0_305.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_306.png b/TMessagesProj/src/main/assets/emoji/0_306.png index d087c5a00..c09466b3f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_306.png and b/TMessagesProj/src/main/assets/emoji/0_306.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_307.png b/TMessagesProj/src/main/assets/emoji/0_307.png index cdc876abf..56e69d8dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_307.png and b/TMessagesProj/src/main/assets/emoji/0_307.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_308.png b/TMessagesProj/src/main/assets/emoji/0_308.png index f06f6dfbe..10801a606 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_308.png and b/TMessagesProj/src/main/assets/emoji/0_308.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_309.png b/TMessagesProj/src/main/assets/emoji/0_309.png index 7e2c21914..bb6d52353 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_309.png and b/TMessagesProj/src/main/assets/emoji/0_309.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_31.png b/TMessagesProj/src/main/assets/emoji/0_31.png index 3eb7749f8..86052de6a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_31.png and b/TMessagesProj/src/main/assets/emoji/0_31.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_310.png b/TMessagesProj/src/main/assets/emoji/0_310.png index bc21f8ce1..85a421c80 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_310.png and b/TMessagesProj/src/main/assets/emoji/0_310.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_311.png b/TMessagesProj/src/main/assets/emoji/0_311.png index e95c41a3e..fe5d5ae58 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_311.png and b/TMessagesProj/src/main/assets/emoji/0_311.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_312.png b/TMessagesProj/src/main/assets/emoji/0_312.png index d50a21033..248ed1e81 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_312.png and b/TMessagesProj/src/main/assets/emoji/0_312.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_313.png b/TMessagesProj/src/main/assets/emoji/0_313.png index cfb129399..a5e627641 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_313.png and b/TMessagesProj/src/main/assets/emoji/0_313.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_314.png b/TMessagesProj/src/main/assets/emoji/0_314.png index de5b4420a..ebfe45733 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_314.png and b/TMessagesProj/src/main/assets/emoji/0_314.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_315.png b/TMessagesProj/src/main/assets/emoji/0_315.png index 59f44d7f0..b64ceb42a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_315.png and b/TMessagesProj/src/main/assets/emoji/0_315.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_316.png b/TMessagesProj/src/main/assets/emoji/0_316.png index 936a66947..9b4d1958c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_316.png and b/TMessagesProj/src/main/assets/emoji/0_316.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_317.png b/TMessagesProj/src/main/assets/emoji/0_317.png index e19208a4b..fc34ee29e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_317.png and b/TMessagesProj/src/main/assets/emoji/0_317.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_318.png b/TMessagesProj/src/main/assets/emoji/0_318.png index debb78ec3..61b35dedd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_318.png and b/TMessagesProj/src/main/assets/emoji/0_318.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_319.png b/TMessagesProj/src/main/assets/emoji/0_319.png index 01762ba21..e140f03c5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_319.png and b/TMessagesProj/src/main/assets/emoji/0_319.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_32.png b/TMessagesProj/src/main/assets/emoji/0_32.png index 49082569b..328edb3b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_32.png and b/TMessagesProj/src/main/assets/emoji/0_32.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_320.png b/TMessagesProj/src/main/assets/emoji/0_320.png index fdb4e47fa..acc549cf7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_320.png and b/TMessagesProj/src/main/assets/emoji/0_320.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_321.png b/TMessagesProj/src/main/assets/emoji/0_321.png index 0c6e9b734..eb70ba36c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_321.png and b/TMessagesProj/src/main/assets/emoji/0_321.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_322.png b/TMessagesProj/src/main/assets/emoji/0_322.png index a15db317a..44f18f448 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_322.png and b/TMessagesProj/src/main/assets/emoji/0_322.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_323.png b/TMessagesProj/src/main/assets/emoji/0_323.png index e29e95ec2..3c06bb48b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_323.png and b/TMessagesProj/src/main/assets/emoji/0_323.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_324.png b/TMessagesProj/src/main/assets/emoji/0_324.png index 6cb2c2a87..5d5ac0fa8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_324.png and b/TMessagesProj/src/main/assets/emoji/0_324.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_325.png b/TMessagesProj/src/main/assets/emoji/0_325.png index ee0312b10..98f425357 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_325.png and b/TMessagesProj/src/main/assets/emoji/0_325.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_326.png b/TMessagesProj/src/main/assets/emoji/0_326.png index dadf8881b..c907f6d51 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_326.png and b/TMessagesProj/src/main/assets/emoji/0_326.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_327.png b/TMessagesProj/src/main/assets/emoji/0_327.png index ec985d045..43b423bfb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_327.png and b/TMessagesProj/src/main/assets/emoji/0_327.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_328.png b/TMessagesProj/src/main/assets/emoji/0_328.png index 9949a510b..6df7749b3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_328.png and b/TMessagesProj/src/main/assets/emoji/0_328.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_329.png b/TMessagesProj/src/main/assets/emoji/0_329.png index 676f516ff..1de0623ea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_329.png and b/TMessagesProj/src/main/assets/emoji/0_329.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_33.png b/TMessagesProj/src/main/assets/emoji/0_33.png index 317669268..b7aa432b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_33.png and b/TMessagesProj/src/main/assets/emoji/0_33.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_330.png b/TMessagesProj/src/main/assets/emoji/0_330.png index 4ff8baf14..3b9fb705c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_330.png and b/TMessagesProj/src/main/assets/emoji/0_330.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_331.png b/TMessagesProj/src/main/assets/emoji/0_331.png index 598c2dcf5..8b27fe8d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_331.png and b/TMessagesProj/src/main/assets/emoji/0_331.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_332.png b/TMessagesProj/src/main/assets/emoji/0_332.png index b6ba44a6b..d923c66c8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_332.png and b/TMessagesProj/src/main/assets/emoji/0_332.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_333.png b/TMessagesProj/src/main/assets/emoji/0_333.png index 49c5f9ed6..9ff7c7a30 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_333.png and b/TMessagesProj/src/main/assets/emoji/0_333.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_334.png b/TMessagesProj/src/main/assets/emoji/0_334.png index 1a55ddcdd..2cb890931 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_334.png and b/TMessagesProj/src/main/assets/emoji/0_334.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_335.png b/TMessagesProj/src/main/assets/emoji/0_335.png index 81b7363d2..ec1f3bfb3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_335.png and b/TMessagesProj/src/main/assets/emoji/0_335.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_336.png b/TMessagesProj/src/main/assets/emoji/0_336.png index 554644175..829039b42 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_336.png and b/TMessagesProj/src/main/assets/emoji/0_336.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_337.png b/TMessagesProj/src/main/assets/emoji/0_337.png index 7462e38b6..06250dbe6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_337.png and b/TMessagesProj/src/main/assets/emoji/0_337.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_338.png b/TMessagesProj/src/main/assets/emoji/0_338.png index e781a26e2..8e0560f6b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_338.png and b/TMessagesProj/src/main/assets/emoji/0_338.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_339.png b/TMessagesProj/src/main/assets/emoji/0_339.png index c9f3e17ac..a3cf75288 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_339.png and b/TMessagesProj/src/main/assets/emoji/0_339.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_34.png b/TMessagesProj/src/main/assets/emoji/0_34.png index 7e7040660..84043c2eb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_34.png and b/TMessagesProj/src/main/assets/emoji/0_34.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_340.png b/TMessagesProj/src/main/assets/emoji/0_340.png index 6a877a187..e07be80c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_340.png and b/TMessagesProj/src/main/assets/emoji/0_340.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_341.png b/TMessagesProj/src/main/assets/emoji/0_341.png index 350e741ef..cd7f86798 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_341.png and b/TMessagesProj/src/main/assets/emoji/0_341.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_342.png b/TMessagesProj/src/main/assets/emoji/0_342.png index c55510280..411d62210 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_342.png and b/TMessagesProj/src/main/assets/emoji/0_342.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_343.png b/TMessagesProj/src/main/assets/emoji/0_343.png index e1dcd5957..5084c7c7a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_343.png and b/TMessagesProj/src/main/assets/emoji/0_343.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_344.png b/TMessagesProj/src/main/assets/emoji/0_344.png index ca365ebd9..3ed0ed03b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_344.png and b/TMessagesProj/src/main/assets/emoji/0_344.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_345.png b/TMessagesProj/src/main/assets/emoji/0_345.png index 5cce87fa5..071dbc4ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_345.png and b/TMessagesProj/src/main/assets/emoji/0_345.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_346.png b/TMessagesProj/src/main/assets/emoji/0_346.png index fd89a3b0e..499dc91cf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_346.png and b/TMessagesProj/src/main/assets/emoji/0_346.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_347.png b/TMessagesProj/src/main/assets/emoji/0_347.png index 5e68f866a..2b273adc3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_347.png and b/TMessagesProj/src/main/assets/emoji/0_347.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_348.png b/TMessagesProj/src/main/assets/emoji/0_348.png index ad261bf48..30aaf82fa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_348.png and b/TMessagesProj/src/main/assets/emoji/0_348.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_349.png b/TMessagesProj/src/main/assets/emoji/0_349.png index 5077baf34..710d8b4f5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_349.png and b/TMessagesProj/src/main/assets/emoji/0_349.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_35.png b/TMessagesProj/src/main/assets/emoji/0_35.png index 6891d13e3..6395fb6e7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_35.png and b/TMessagesProj/src/main/assets/emoji/0_35.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_350.png b/TMessagesProj/src/main/assets/emoji/0_350.png index d9958cada..7a9803013 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_350.png and b/TMessagesProj/src/main/assets/emoji/0_350.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_351.png b/TMessagesProj/src/main/assets/emoji/0_351.png index 7e717f4b5..c2641d5e5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_351.png and b/TMessagesProj/src/main/assets/emoji/0_351.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_352.png b/TMessagesProj/src/main/assets/emoji/0_352.png index bafb8aec7..4a1b19704 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_352.png and b/TMessagesProj/src/main/assets/emoji/0_352.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_353.png b/TMessagesProj/src/main/assets/emoji/0_353.png index 156bffc6a..d7d617c18 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_353.png and b/TMessagesProj/src/main/assets/emoji/0_353.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_354.png b/TMessagesProj/src/main/assets/emoji/0_354.png index 907be0cfb..18f756ee2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_354.png and b/TMessagesProj/src/main/assets/emoji/0_354.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_355.png b/TMessagesProj/src/main/assets/emoji/0_355.png index d03c72f80..6e14a75b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_355.png and b/TMessagesProj/src/main/assets/emoji/0_355.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_356.png b/TMessagesProj/src/main/assets/emoji/0_356.png index bd54554fc..0fd14a80f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_356.png and b/TMessagesProj/src/main/assets/emoji/0_356.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_357.png b/TMessagesProj/src/main/assets/emoji/0_357.png index 8dae314e4..358badf33 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_357.png and b/TMessagesProj/src/main/assets/emoji/0_357.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_358.png b/TMessagesProj/src/main/assets/emoji/0_358.png index 57effe421..918ff20ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_358.png and b/TMessagesProj/src/main/assets/emoji/0_358.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_359.png b/TMessagesProj/src/main/assets/emoji/0_359.png index c74a80055..da064e92c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_359.png and b/TMessagesProj/src/main/assets/emoji/0_359.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_36.png b/TMessagesProj/src/main/assets/emoji/0_36.png index 93af66f26..b2e320f8b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_36.png and b/TMessagesProj/src/main/assets/emoji/0_36.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_360.png b/TMessagesProj/src/main/assets/emoji/0_360.png index 499b733c1..5a504b495 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_360.png and b/TMessagesProj/src/main/assets/emoji/0_360.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_361.png b/TMessagesProj/src/main/assets/emoji/0_361.png index 5bc37c9c2..ecac495ad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_361.png and b/TMessagesProj/src/main/assets/emoji/0_361.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_362.png b/TMessagesProj/src/main/assets/emoji/0_362.png index 294ead394..e62881514 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_362.png and b/TMessagesProj/src/main/assets/emoji/0_362.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_363.png b/TMessagesProj/src/main/assets/emoji/0_363.png index 02679b537..506aa36e9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_363.png and b/TMessagesProj/src/main/assets/emoji/0_363.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_364.png b/TMessagesProj/src/main/assets/emoji/0_364.png index b82551ffd..e6d79890b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_364.png and b/TMessagesProj/src/main/assets/emoji/0_364.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_365.png b/TMessagesProj/src/main/assets/emoji/0_365.png index f86180012..817fb0cd1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_365.png and b/TMessagesProj/src/main/assets/emoji/0_365.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_366.png b/TMessagesProj/src/main/assets/emoji/0_366.png index 74af3651d..f6f075b8f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_366.png and b/TMessagesProj/src/main/assets/emoji/0_366.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_367.png b/TMessagesProj/src/main/assets/emoji/0_367.png index 5832dece8..0e0f595e9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_367.png and b/TMessagesProj/src/main/assets/emoji/0_367.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_368.png b/TMessagesProj/src/main/assets/emoji/0_368.png index 4512d8d7b..7f8ef5edf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_368.png and b/TMessagesProj/src/main/assets/emoji/0_368.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_369.png b/TMessagesProj/src/main/assets/emoji/0_369.png index 9582f1f57..77d687ce2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_369.png and b/TMessagesProj/src/main/assets/emoji/0_369.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_37.png b/TMessagesProj/src/main/assets/emoji/0_37.png index 3512a9a5f..a17083391 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_37.png and b/TMessagesProj/src/main/assets/emoji/0_37.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_370.png b/TMessagesProj/src/main/assets/emoji/0_370.png index c084e3da8..106866c4b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_370.png and b/TMessagesProj/src/main/assets/emoji/0_370.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_371.png b/TMessagesProj/src/main/assets/emoji/0_371.png index fe6fcdfb7..9d6c1d21d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_371.png and b/TMessagesProj/src/main/assets/emoji/0_371.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_372.png b/TMessagesProj/src/main/assets/emoji/0_372.png index 51a8e350a..ebcfe17b7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_372.png and b/TMessagesProj/src/main/assets/emoji/0_372.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_373.png b/TMessagesProj/src/main/assets/emoji/0_373.png index 1b5b5e809..253d45ae2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_373.png and b/TMessagesProj/src/main/assets/emoji/0_373.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_374.png b/TMessagesProj/src/main/assets/emoji/0_374.png index 1dcc60dfb..1c1d253c7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_374.png and b/TMessagesProj/src/main/assets/emoji/0_374.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_375.png b/TMessagesProj/src/main/assets/emoji/0_375.png index 89af23570..61bbdbe6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_375.png and b/TMessagesProj/src/main/assets/emoji/0_375.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_376.png b/TMessagesProj/src/main/assets/emoji/0_376.png index 4192cf2e7..2eb82c8df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_376.png and b/TMessagesProj/src/main/assets/emoji/0_376.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_377.png b/TMessagesProj/src/main/assets/emoji/0_377.png index 2aecfda18..ef87bd5b8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_377.png and b/TMessagesProj/src/main/assets/emoji/0_377.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_378.png b/TMessagesProj/src/main/assets/emoji/0_378.png index fff541983..4f3249891 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_378.png and b/TMessagesProj/src/main/assets/emoji/0_378.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_379.png b/TMessagesProj/src/main/assets/emoji/0_379.png index a95c0f216..e08f39980 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_379.png and b/TMessagesProj/src/main/assets/emoji/0_379.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_38.png b/TMessagesProj/src/main/assets/emoji/0_38.png index 5194e232c..a620b46f7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_38.png and b/TMessagesProj/src/main/assets/emoji/0_38.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_380.png b/TMessagesProj/src/main/assets/emoji/0_380.png index 0df9e502e..4637b8eb5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_380.png and b/TMessagesProj/src/main/assets/emoji/0_380.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_381.png b/TMessagesProj/src/main/assets/emoji/0_381.png index 4dd1519d8..e17f01c47 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_381.png and b/TMessagesProj/src/main/assets/emoji/0_381.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_382.png b/TMessagesProj/src/main/assets/emoji/0_382.png index d747d7d57..19ef62a4f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_382.png and b/TMessagesProj/src/main/assets/emoji/0_382.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_383.png b/TMessagesProj/src/main/assets/emoji/0_383.png index 26361e9ea..bfbc7b433 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_383.png and b/TMessagesProj/src/main/assets/emoji/0_383.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_384.png b/TMessagesProj/src/main/assets/emoji/0_384.png index 4e686108a..c8da66646 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_384.png and b/TMessagesProj/src/main/assets/emoji/0_384.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_385.png b/TMessagesProj/src/main/assets/emoji/0_385.png index f470bdf29..655186f1d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_385.png and b/TMessagesProj/src/main/assets/emoji/0_385.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_386.png b/TMessagesProj/src/main/assets/emoji/0_386.png index 1473964f6..f5fffe279 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_386.png and b/TMessagesProj/src/main/assets/emoji/0_386.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_387.png b/TMessagesProj/src/main/assets/emoji/0_387.png index 919088f03..e5deb442a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_387.png and b/TMessagesProj/src/main/assets/emoji/0_387.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_388.png b/TMessagesProj/src/main/assets/emoji/0_388.png index f7b5b7fc1..a9a4a86ce 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_388.png and b/TMessagesProj/src/main/assets/emoji/0_388.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_389.png b/TMessagesProj/src/main/assets/emoji/0_389.png index b7b55726e..91f3e5c0d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_389.png and b/TMessagesProj/src/main/assets/emoji/0_389.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_39.png b/TMessagesProj/src/main/assets/emoji/0_39.png index 1ae53e2ad..dafcea3b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_39.png and b/TMessagesProj/src/main/assets/emoji/0_39.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_390.png b/TMessagesProj/src/main/assets/emoji/0_390.png index 72c794880..44e2be7de 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_390.png and b/TMessagesProj/src/main/assets/emoji/0_390.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_391.png b/TMessagesProj/src/main/assets/emoji/0_391.png index 05bdde3d7..b7f6ecf07 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_391.png and b/TMessagesProj/src/main/assets/emoji/0_391.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_392.png b/TMessagesProj/src/main/assets/emoji/0_392.png index 9d68f23df..22a05103f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_392.png and b/TMessagesProj/src/main/assets/emoji/0_392.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_393.png b/TMessagesProj/src/main/assets/emoji/0_393.png index e4571ee88..b4b0cf3f9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_393.png and b/TMessagesProj/src/main/assets/emoji/0_393.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_394.png b/TMessagesProj/src/main/assets/emoji/0_394.png index 7827387fe..04621dfa6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_394.png and b/TMessagesProj/src/main/assets/emoji/0_394.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_395.png b/TMessagesProj/src/main/assets/emoji/0_395.png index 76725ab82..46a716103 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_395.png and b/TMessagesProj/src/main/assets/emoji/0_395.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_396.png b/TMessagesProj/src/main/assets/emoji/0_396.png index 5b66a130f..e9e61cf5e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_396.png and b/TMessagesProj/src/main/assets/emoji/0_396.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_397.png b/TMessagesProj/src/main/assets/emoji/0_397.png index afcb84d8d..65669711b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_397.png and b/TMessagesProj/src/main/assets/emoji/0_397.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_398.png b/TMessagesProj/src/main/assets/emoji/0_398.png index a2dcf47ae..91bcd29c8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_398.png and b/TMessagesProj/src/main/assets/emoji/0_398.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_399.png b/TMessagesProj/src/main/assets/emoji/0_399.png index 3d285b99d..dfdfdbce5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_399.png and b/TMessagesProj/src/main/assets/emoji/0_399.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_4.png b/TMessagesProj/src/main/assets/emoji/0_4.png index 995b06ecf..caaeff3a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_4.png and b/TMessagesProj/src/main/assets/emoji/0_4.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_40.png b/TMessagesProj/src/main/assets/emoji/0_40.png index 96e077f5c..9c14d5272 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_40.png and b/TMessagesProj/src/main/assets/emoji/0_40.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_400.png b/TMessagesProj/src/main/assets/emoji/0_400.png index 0eae6f7da..f4cafc237 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_400.png and b/TMessagesProj/src/main/assets/emoji/0_400.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_401.png b/TMessagesProj/src/main/assets/emoji/0_401.png index b27f1001c..09681deb6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_401.png and b/TMessagesProj/src/main/assets/emoji/0_401.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_402.png b/TMessagesProj/src/main/assets/emoji/0_402.png index 44d039e10..dbca9f336 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_402.png and b/TMessagesProj/src/main/assets/emoji/0_402.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_403.png b/TMessagesProj/src/main/assets/emoji/0_403.png index 9a56e86fe..2678c8cee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_403.png and b/TMessagesProj/src/main/assets/emoji/0_403.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_404.png b/TMessagesProj/src/main/assets/emoji/0_404.png index c672d17c8..15d822073 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_404.png and b/TMessagesProj/src/main/assets/emoji/0_404.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_405.png b/TMessagesProj/src/main/assets/emoji/0_405.png index a2d25d856..69269b7ef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_405.png and b/TMessagesProj/src/main/assets/emoji/0_405.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_406.png b/TMessagesProj/src/main/assets/emoji/0_406.png index d91377486..65db09f9d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_406.png and b/TMessagesProj/src/main/assets/emoji/0_406.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_407.png b/TMessagesProj/src/main/assets/emoji/0_407.png index 66de001c2..8169c30b1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_407.png and b/TMessagesProj/src/main/assets/emoji/0_407.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_408.png b/TMessagesProj/src/main/assets/emoji/0_408.png index 758319646..6e20eff79 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_408.png and b/TMessagesProj/src/main/assets/emoji/0_408.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_409.png b/TMessagesProj/src/main/assets/emoji/0_409.png index 643926bbc..df153fcd2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_409.png and b/TMessagesProj/src/main/assets/emoji/0_409.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_41.png b/TMessagesProj/src/main/assets/emoji/0_41.png index ec3735fe1..7a32e83e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_41.png and b/TMessagesProj/src/main/assets/emoji/0_41.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_410.png b/TMessagesProj/src/main/assets/emoji/0_410.png index 43f2f0447..f36680a09 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_410.png and b/TMessagesProj/src/main/assets/emoji/0_410.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_411.png b/TMessagesProj/src/main/assets/emoji/0_411.png index fdca965cb..c9c0ec4f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_411.png and b/TMessagesProj/src/main/assets/emoji/0_411.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_412.png b/TMessagesProj/src/main/assets/emoji/0_412.png index f30384b07..1d99c3609 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_412.png and b/TMessagesProj/src/main/assets/emoji/0_412.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_413.png b/TMessagesProj/src/main/assets/emoji/0_413.png index cfa1247f2..41cb12384 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_413.png and b/TMessagesProj/src/main/assets/emoji/0_413.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_414.png b/TMessagesProj/src/main/assets/emoji/0_414.png index 364c2bfaf..8226b297b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_414.png and b/TMessagesProj/src/main/assets/emoji/0_414.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_415.png b/TMessagesProj/src/main/assets/emoji/0_415.png index 68dbff3ef..8524593d3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_415.png and b/TMessagesProj/src/main/assets/emoji/0_415.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_416.png b/TMessagesProj/src/main/assets/emoji/0_416.png index 61b8247ff..9be6d92f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_416.png and b/TMessagesProj/src/main/assets/emoji/0_416.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_417.png b/TMessagesProj/src/main/assets/emoji/0_417.png index d094eb1c5..fc0d1e227 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_417.png and b/TMessagesProj/src/main/assets/emoji/0_417.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_418.png b/TMessagesProj/src/main/assets/emoji/0_418.png index 5779c1abf..4b4ecab38 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_418.png and b/TMessagesProj/src/main/assets/emoji/0_418.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_419.png b/TMessagesProj/src/main/assets/emoji/0_419.png index 96424cfc3..d03b16a1e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_419.png and b/TMessagesProj/src/main/assets/emoji/0_419.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_42.png b/TMessagesProj/src/main/assets/emoji/0_42.png index fc107db77..471f40e0a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_42.png and b/TMessagesProj/src/main/assets/emoji/0_42.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_420.png b/TMessagesProj/src/main/assets/emoji/0_420.png index d3f741745..8e57698a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_420.png and b/TMessagesProj/src/main/assets/emoji/0_420.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_421.png b/TMessagesProj/src/main/assets/emoji/0_421.png index b9f35ad1b..198bb74c0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_421.png and b/TMessagesProj/src/main/assets/emoji/0_421.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_422.png b/TMessagesProj/src/main/assets/emoji/0_422.png index 307d46204..b579cc2e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_422.png and b/TMessagesProj/src/main/assets/emoji/0_422.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_423.png b/TMessagesProj/src/main/assets/emoji/0_423.png index 859f23195..deb65aca0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_423.png and b/TMessagesProj/src/main/assets/emoji/0_423.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_424.png b/TMessagesProj/src/main/assets/emoji/0_424.png index 5c30df831..79e5a7688 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_424.png and b/TMessagesProj/src/main/assets/emoji/0_424.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_425.png b/TMessagesProj/src/main/assets/emoji/0_425.png index eab2d25d7..7c2030aa0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_425.png and b/TMessagesProj/src/main/assets/emoji/0_425.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_426.png b/TMessagesProj/src/main/assets/emoji/0_426.png index 414441ab1..bd50f0ea8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_426.png and b/TMessagesProj/src/main/assets/emoji/0_426.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_427.png b/TMessagesProj/src/main/assets/emoji/0_427.png index 9b5ffec1b..72c5ac79b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_427.png and b/TMessagesProj/src/main/assets/emoji/0_427.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_428.png b/TMessagesProj/src/main/assets/emoji/0_428.png index 5c05a81e4..d28de5344 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_428.png and b/TMessagesProj/src/main/assets/emoji/0_428.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_429.png b/TMessagesProj/src/main/assets/emoji/0_429.png index 1e412ca88..7eab5409d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_429.png and b/TMessagesProj/src/main/assets/emoji/0_429.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_43.png b/TMessagesProj/src/main/assets/emoji/0_43.png index aa618bd38..13239702f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_43.png and b/TMessagesProj/src/main/assets/emoji/0_43.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_430.png b/TMessagesProj/src/main/assets/emoji/0_430.png index 006555286..de64a0ed2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_430.png and b/TMessagesProj/src/main/assets/emoji/0_430.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_431.png b/TMessagesProj/src/main/assets/emoji/0_431.png index 1bd0147cf..099e316d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_431.png and b/TMessagesProj/src/main/assets/emoji/0_431.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_432.png b/TMessagesProj/src/main/assets/emoji/0_432.png index 5eea31566..48c84469f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_432.png and b/TMessagesProj/src/main/assets/emoji/0_432.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_433.png b/TMessagesProj/src/main/assets/emoji/0_433.png index bf8287cf3..e57cb8f8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_433.png and b/TMessagesProj/src/main/assets/emoji/0_433.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_434.png b/TMessagesProj/src/main/assets/emoji/0_434.png index 3cfbd1a09..4a6970eda 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_434.png and b/TMessagesProj/src/main/assets/emoji/0_434.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_435.png b/TMessagesProj/src/main/assets/emoji/0_435.png index ad4d9cbb1..796920831 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_435.png and b/TMessagesProj/src/main/assets/emoji/0_435.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_436.png b/TMessagesProj/src/main/assets/emoji/0_436.png index 1fcef74ae..db23515dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_436.png and b/TMessagesProj/src/main/assets/emoji/0_436.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_437.png b/TMessagesProj/src/main/assets/emoji/0_437.png index be3229088..65dc2cccd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_437.png and b/TMessagesProj/src/main/assets/emoji/0_437.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_438.png b/TMessagesProj/src/main/assets/emoji/0_438.png index a4c2875eb..1271821b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_438.png and b/TMessagesProj/src/main/assets/emoji/0_438.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_439.png b/TMessagesProj/src/main/assets/emoji/0_439.png index fa2ad532a..8236db0fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_439.png and b/TMessagesProj/src/main/assets/emoji/0_439.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_44.png b/TMessagesProj/src/main/assets/emoji/0_44.png index 84b8eac12..89c04addf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_44.png and b/TMessagesProj/src/main/assets/emoji/0_44.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_440.png b/TMessagesProj/src/main/assets/emoji/0_440.png index dd3da75e0..9ae921a9e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_440.png and b/TMessagesProj/src/main/assets/emoji/0_440.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_441.png b/TMessagesProj/src/main/assets/emoji/0_441.png index a7000f82c..ffebc0e1d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_441.png and b/TMessagesProj/src/main/assets/emoji/0_441.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_442.png b/TMessagesProj/src/main/assets/emoji/0_442.png index 93bb2384a..80ca6316f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_442.png and b/TMessagesProj/src/main/assets/emoji/0_442.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_443.png b/TMessagesProj/src/main/assets/emoji/0_443.png index df5e7d078..e6c374860 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_443.png and b/TMessagesProj/src/main/assets/emoji/0_443.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_444.png b/TMessagesProj/src/main/assets/emoji/0_444.png index 96faf4687..45c14ca37 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_444.png and b/TMessagesProj/src/main/assets/emoji/0_444.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_445.png b/TMessagesProj/src/main/assets/emoji/0_445.png index e816ff2f0..58bbe2a84 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_445.png and b/TMessagesProj/src/main/assets/emoji/0_445.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_446.png b/TMessagesProj/src/main/assets/emoji/0_446.png index 4a6d75b78..d3e205b5a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_446.png and b/TMessagesProj/src/main/assets/emoji/0_446.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_447.png b/TMessagesProj/src/main/assets/emoji/0_447.png index 13ee65565..2007179d4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_447.png and b/TMessagesProj/src/main/assets/emoji/0_447.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_448.png b/TMessagesProj/src/main/assets/emoji/0_448.png index c40ab75f2..49e805f63 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_448.png and b/TMessagesProj/src/main/assets/emoji/0_448.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_449.png b/TMessagesProj/src/main/assets/emoji/0_449.png index c56d2735b..5a22a168a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_449.png and b/TMessagesProj/src/main/assets/emoji/0_449.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_45.png b/TMessagesProj/src/main/assets/emoji/0_45.png index c833101be..557a32b0b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_45.png and b/TMessagesProj/src/main/assets/emoji/0_45.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_450.png b/TMessagesProj/src/main/assets/emoji/0_450.png index decc46280..a7d674fa7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_450.png and b/TMessagesProj/src/main/assets/emoji/0_450.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_451.png b/TMessagesProj/src/main/assets/emoji/0_451.png index 376817df7..a3be36b1c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_451.png and b/TMessagesProj/src/main/assets/emoji/0_451.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_452.png b/TMessagesProj/src/main/assets/emoji/0_452.png index 2c02d9215..609a521be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_452.png and b/TMessagesProj/src/main/assets/emoji/0_452.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_453.png b/TMessagesProj/src/main/assets/emoji/0_453.png index 07dc1d879..a95a1394e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_453.png and b/TMessagesProj/src/main/assets/emoji/0_453.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_454.png b/TMessagesProj/src/main/assets/emoji/0_454.png index 75ffd54b3..48caccebd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_454.png and b/TMessagesProj/src/main/assets/emoji/0_454.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_455.png b/TMessagesProj/src/main/assets/emoji/0_455.png index e1216e8aa..faba53249 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_455.png and b/TMessagesProj/src/main/assets/emoji/0_455.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_456.png b/TMessagesProj/src/main/assets/emoji/0_456.png index d24f2804a..dceef6dbd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_456.png and b/TMessagesProj/src/main/assets/emoji/0_456.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_457.png b/TMessagesProj/src/main/assets/emoji/0_457.png index 2705869bf..799516b7f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_457.png and b/TMessagesProj/src/main/assets/emoji/0_457.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_458.png b/TMessagesProj/src/main/assets/emoji/0_458.png index a9e24505c..9a07c525d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_458.png and b/TMessagesProj/src/main/assets/emoji/0_458.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_459.png b/TMessagesProj/src/main/assets/emoji/0_459.png index fd5f65243..8fa385f55 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_459.png and b/TMessagesProj/src/main/assets/emoji/0_459.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_46.png b/TMessagesProj/src/main/assets/emoji/0_46.png index 2bf1c95df..85dac86f3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_46.png and b/TMessagesProj/src/main/assets/emoji/0_46.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_460.png b/TMessagesProj/src/main/assets/emoji/0_460.png index 7c989dac9..68196a838 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_460.png and b/TMessagesProj/src/main/assets/emoji/0_460.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_461.png b/TMessagesProj/src/main/assets/emoji/0_461.png index ddbac822a..da9c7893b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_461.png and b/TMessagesProj/src/main/assets/emoji/0_461.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_462.png b/TMessagesProj/src/main/assets/emoji/0_462.png index 952d54a9a..b25d2315e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_462.png and b/TMessagesProj/src/main/assets/emoji/0_462.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_463.png b/TMessagesProj/src/main/assets/emoji/0_463.png index 9edfbb7fc..43854e839 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_463.png and b/TMessagesProj/src/main/assets/emoji/0_463.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_464.png b/TMessagesProj/src/main/assets/emoji/0_464.png index ac91c23fd..bb73f6bd2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_464.png and b/TMessagesProj/src/main/assets/emoji/0_464.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_465.png b/TMessagesProj/src/main/assets/emoji/0_465.png index aa4e3ec20..1fc002806 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_465.png and b/TMessagesProj/src/main/assets/emoji/0_465.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_466.png b/TMessagesProj/src/main/assets/emoji/0_466.png index a193ff0d7..8480afc3c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_466.png and b/TMessagesProj/src/main/assets/emoji/0_466.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_467.png b/TMessagesProj/src/main/assets/emoji/0_467.png index faf746782..801e5a712 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_467.png and b/TMessagesProj/src/main/assets/emoji/0_467.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_468.png b/TMessagesProj/src/main/assets/emoji/0_468.png index 27a588385..b0fedaed5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_468.png and b/TMessagesProj/src/main/assets/emoji/0_468.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_469.png b/TMessagesProj/src/main/assets/emoji/0_469.png index d512be9c3..c443ed36a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_469.png and b/TMessagesProj/src/main/assets/emoji/0_469.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_47.png b/TMessagesProj/src/main/assets/emoji/0_47.png index b9aff6a76..43414a8af 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_47.png and b/TMessagesProj/src/main/assets/emoji/0_47.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_470.png b/TMessagesProj/src/main/assets/emoji/0_470.png index d90a9ea17..24f691b7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_470.png and b/TMessagesProj/src/main/assets/emoji/0_470.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_471.png b/TMessagesProj/src/main/assets/emoji/0_471.png index 206ca1e34..968894e95 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_471.png and b/TMessagesProj/src/main/assets/emoji/0_471.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_472.png b/TMessagesProj/src/main/assets/emoji/0_472.png index 972e4c477..2f64fa4a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_472.png and b/TMessagesProj/src/main/assets/emoji/0_472.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_473.png b/TMessagesProj/src/main/assets/emoji/0_473.png index b5f571c9a..30cc03217 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_473.png and b/TMessagesProj/src/main/assets/emoji/0_473.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_474.png b/TMessagesProj/src/main/assets/emoji/0_474.png index 1d458525c..e0a8880f3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_474.png and b/TMessagesProj/src/main/assets/emoji/0_474.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_475.png b/TMessagesProj/src/main/assets/emoji/0_475.png index 6b343ff68..274739ea5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_475.png and b/TMessagesProj/src/main/assets/emoji/0_475.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_476.png b/TMessagesProj/src/main/assets/emoji/0_476.png index d23b49396..51f3bccae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_476.png and b/TMessagesProj/src/main/assets/emoji/0_476.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_477.png b/TMessagesProj/src/main/assets/emoji/0_477.png index cb1fe3fe6..9827ee943 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_477.png and b/TMessagesProj/src/main/assets/emoji/0_477.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_478.png b/TMessagesProj/src/main/assets/emoji/0_478.png index c5fbfcf2f..03105a282 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_478.png and b/TMessagesProj/src/main/assets/emoji/0_478.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_479.png b/TMessagesProj/src/main/assets/emoji/0_479.png index 501d98a40..cffcbd73c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_479.png and b/TMessagesProj/src/main/assets/emoji/0_479.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_48.png b/TMessagesProj/src/main/assets/emoji/0_48.png index fa12cc36a..fbb23cc72 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_48.png and b/TMessagesProj/src/main/assets/emoji/0_48.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_480.png b/TMessagesProj/src/main/assets/emoji/0_480.png index a2e41af4b..5065d361c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_480.png and b/TMessagesProj/src/main/assets/emoji/0_480.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_481.png b/TMessagesProj/src/main/assets/emoji/0_481.png index 99f5a51b2..d85f9ae51 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_481.png and b/TMessagesProj/src/main/assets/emoji/0_481.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_482.png b/TMessagesProj/src/main/assets/emoji/0_482.png index c06507973..c3e5f4d83 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_482.png and b/TMessagesProj/src/main/assets/emoji/0_482.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_483.png b/TMessagesProj/src/main/assets/emoji/0_483.png index 88237f12a..81760e9cb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_483.png and b/TMessagesProj/src/main/assets/emoji/0_483.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_484.png b/TMessagesProj/src/main/assets/emoji/0_484.png index ca2ac660d..80af933cc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_484.png and b/TMessagesProj/src/main/assets/emoji/0_484.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_485.png b/TMessagesProj/src/main/assets/emoji/0_485.png index ac3d6dc78..703071838 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_485.png and b/TMessagesProj/src/main/assets/emoji/0_485.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_486.png b/TMessagesProj/src/main/assets/emoji/0_486.png index 2fe025ec9..d588581de 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_486.png and b/TMessagesProj/src/main/assets/emoji/0_486.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_487.png b/TMessagesProj/src/main/assets/emoji/0_487.png index 2d709f193..2ce10643c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_487.png and b/TMessagesProj/src/main/assets/emoji/0_487.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_488.png b/TMessagesProj/src/main/assets/emoji/0_488.png index 5ca666c4c..f548a602d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_488.png and b/TMessagesProj/src/main/assets/emoji/0_488.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_489.png b/TMessagesProj/src/main/assets/emoji/0_489.png index 0a15c59f4..988abb02b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_489.png and b/TMessagesProj/src/main/assets/emoji/0_489.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_49.png b/TMessagesProj/src/main/assets/emoji/0_49.png index 46d272423..98f441e73 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_49.png and b/TMessagesProj/src/main/assets/emoji/0_49.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_490.png b/TMessagesProj/src/main/assets/emoji/0_490.png index b21dce041..8d4a36ac4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_490.png and b/TMessagesProj/src/main/assets/emoji/0_490.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_491.png b/TMessagesProj/src/main/assets/emoji/0_491.png index 5d8ad4964..60dae87fd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_491.png and b/TMessagesProj/src/main/assets/emoji/0_491.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_492.png b/TMessagesProj/src/main/assets/emoji/0_492.png index e121e11c2..227b59c07 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_492.png and b/TMessagesProj/src/main/assets/emoji/0_492.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_493.png b/TMessagesProj/src/main/assets/emoji/0_493.png index c69c80ded..4bb06be8f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_493.png and b/TMessagesProj/src/main/assets/emoji/0_493.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_494.png b/TMessagesProj/src/main/assets/emoji/0_494.png index 33621d323..14cb2fb5f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_494.png and b/TMessagesProj/src/main/assets/emoji/0_494.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_495.png b/TMessagesProj/src/main/assets/emoji/0_495.png index 264f4fcd1..7010b4ee9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_495.png and b/TMessagesProj/src/main/assets/emoji/0_495.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_496.png b/TMessagesProj/src/main/assets/emoji/0_496.png index 7030b3904..33d1e15ca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_496.png and b/TMessagesProj/src/main/assets/emoji/0_496.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_497.png b/TMessagesProj/src/main/assets/emoji/0_497.png index ac9372034..1f64f09be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_497.png and b/TMessagesProj/src/main/assets/emoji/0_497.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_498.png b/TMessagesProj/src/main/assets/emoji/0_498.png index 6b3fda0dc..412bcccd3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_498.png and b/TMessagesProj/src/main/assets/emoji/0_498.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_499.png b/TMessagesProj/src/main/assets/emoji/0_499.png index 412cf9988..b287810ef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_499.png and b/TMessagesProj/src/main/assets/emoji/0_499.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_5.png b/TMessagesProj/src/main/assets/emoji/0_5.png index 84b75e67a..b1248757b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_5.png and b/TMessagesProj/src/main/assets/emoji/0_5.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_50.png b/TMessagesProj/src/main/assets/emoji/0_50.png index 339729f96..93f53ab05 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_50.png and b/TMessagesProj/src/main/assets/emoji/0_50.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_500.png b/TMessagesProj/src/main/assets/emoji/0_500.png index 0e2661241..b1d535e25 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_500.png and b/TMessagesProj/src/main/assets/emoji/0_500.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_501.png b/TMessagesProj/src/main/assets/emoji/0_501.png index 8580c4b29..c511cba53 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_501.png and b/TMessagesProj/src/main/assets/emoji/0_501.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_502.png b/TMessagesProj/src/main/assets/emoji/0_502.png index 7e5872d60..78abfe5b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_502.png and b/TMessagesProj/src/main/assets/emoji/0_502.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_503.png b/TMessagesProj/src/main/assets/emoji/0_503.png index fd3f95478..ad27e641d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_503.png and b/TMessagesProj/src/main/assets/emoji/0_503.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_504.png b/TMessagesProj/src/main/assets/emoji/0_504.png index a67a593de..71c3bcae0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_504.png and b/TMessagesProj/src/main/assets/emoji/0_504.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_505.png b/TMessagesProj/src/main/assets/emoji/0_505.png index c9f093c1e..53c1183fa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_505.png and b/TMessagesProj/src/main/assets/emoji/0_505.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_506.png b/TMessagesProj/src/main/assets/emoji/0_506.png index 0db7d5a48..418b27630 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_506.png and b/TMessagesProj/src/main/assets/emoji/0_506.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_507.png b/TMessagesProj/src/main/assets/emoji/0_507.png index 30824c15c..ce1909838 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_507.png and b/TMessagesProj/src/main/assets/emoji/0_507.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_508.png b/TMessagesProj/src/main/assets/emoji/0_508.png index caca8c5ef..8e6d6fcbb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_508.png and b/TMessagesProj/src/main/assets/emoji/0_508.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_509.png b/TMessagesProj/src/main/assets/emoji/0_509.png index ecc88bfb3..dec0dc4dd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_509.png and b/TMessagesProj/src/main/assets/emoji/0_509.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_51.png b/TMessagesProj/src/main/assets/emoji/0_51.png index 9eeeb6d81..cb2c38188 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_51.png and b/TMessagesProj/src/main/assets/emoji/0_51.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_510.png b/TMessagesProj/src/main/assets/emoji/0_510.png index fc437fbd4..9ad05d18d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_510.png and b/TMessagesProj/src/main/assets/emoji/0_510.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_511.png b/TMessagesProj/src/main/assets/emoji/0_511.png index 62b173ddf..99f536757 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_511.png and b/TMessagesProj/src/main/assets/emoji/0_511.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_512.png b/TMessagesProj/src/main/assets/emoji/0_512.png index 749c358be..3f28e7e18 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_512.png and b/TMessagesProj/src/main/assets/emoji/0_512.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_513.png b/TMessagesProj/src/main/assets/emoji/0_513.png index 4bd533665..355f0c62c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_513.png and b/TMessagesProj/src/main/assets/emoji/0_513.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_514.png b/TMessagesProj/src/main/assets/emoji/0_514.png index 1db025c9c..0e7d48fcf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_514.png and b/TMessagesProj/src/main/assets/emoji/0_514.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_515.png b/TMessagesProj/src/main/assets/emoji/0_515.png index 6d8071dd0..d8389e30b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_515.png and b/TMessagesProj/src/main/assets/emoji/0_515.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_516.png b/TMessagesProj/src/main/assets/emoji/0_516.png index 29f346e19..55b0ab6cf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_516.png and b/TMessagesProj/src/main/assets/emoji/0_516.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_517.png b/TMessagesProj/src/main/assets/emoji/0_517.png index b64285c4a..e11277954 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_517.png and b/TMessagesProj/src/main/assets/emoji/0_517.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_518.png b/TMessagesProj/src/main/assets/emoji/0_518.png index f34834ee1..e125f1b1d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_518.png and b/TMessagesProj/src/main/assets/emoji/0_518.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_519.png b/TMessagesProj/src/main/assets/emoji/0_519.png index 7d8ef95b3..5f598925d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_519.png and b/TMessagesProj/src/main/assets/emoji/0_519.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_52.png b/TMessagesProj/src/main/assets/emoji/0_52.png index 35ef31112..2e14467e5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_52.png and b/TMessagesProj/src/main/assets/emoji/0_52.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_520.png b/TMessagesProj/src/main/assets/emoji/0_520.png index 660f865cd..4532c22c5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_520.png and b/TMessagesProj/src/main/assets/emoji/0_520.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_521.png b/TMessagesProj/src/main/assets/emoji/0_521.png index 5991d737d..4ff121e22 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_521.png and b/TMessagesProj/src/main/assets/emoji/0_521.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_522.png b/TMessagesProj/src/main/assets/emoji/0_522.png index 11661a644..e3d63cdaa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_522.png and b/TMessagesProj/src/main/assets/emoji/0_522.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_523.png b/TMessagesProj/src/main/assets/emoji/0_523.png index b82d00c47..218c113e1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_523.png and b/TMessagesProj/src/main/assets/emoji/0_523.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_524.png b/TMessagesProj/src/main/assets/emoji/0_524.png index 2b080d2f2..7849a03a7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_524.png and b/TMessagesProj/src/main/assets/emoji/0_524.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_525.png b/TMessagesProj/src/main/assets/emoji/0_525.png index 531b4a5d3..0d970b317 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_525.png and b/TMessagesProj/src/main/assets/emoji/0_525.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_526.png b/TMessagesProj/src/main/assets/emoji/0_526.png index 3d28a361c..06500320c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_526.png and b/TMessagesProj/src/main/assets/emoji/0_526.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_527.png b/TMessagesProj/src/main/assets/emoji/0_527.png index 0c2ed3059..5512aee6f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_527.png and b/TMessagesProj/src/main/assets/emoji/0_527.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_528.png b/TMessagesProj/src/main/assets/emoji/0_528.png index b4bc1b604..7d8825de0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_528.png and b/TMessagesProj/src/main/assets/emoji/0_528.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_529.png b/TMessagesProj/src/main/assets/emoji/0_529.png index 4e99b59a4..d0a7647dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_529.png and b/TMessagesProj/src/main/assets/emoji/0_529.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_53.png b/TMessagesProj/src/main/assets/emoji/0_53.png index 0a2557fc4..2a16714a6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_53.png and b/TMessagesProj/src/main/assets/emoji/0_53.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_530.png b/TMessagesProj/src/main/assets/emoji/0_530.png index 486dc162e..833cac01a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_530.png and b/TMessagesProj/src/main/assets/emoji/0_530.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_531.png b/TMessagesProj/src/main/assets/emoji/0_531.png index 0ebb42131..84e80c411 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_531.png and b/TMessagesProj/src/main/assets/emoji/0_531.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_532.png b/TMessagesProj/src/main/assets/emoji/0_532.png index f66023779..5ca788bba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_532.png and b/TMessagesProj/src/main/assets/emoji/0_532.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_533.png b/TMessagesProj/src/main/assets/emoji/0_533.png index 5fe26b08e..84d6bbccf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_533.png and b/TMessagesProj/src/main/assets/emoji/0_533.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_534.png b/TMessagesProj/src/main/assets/emoji/0_534.png index 364d7c2de..9c008f650 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_534.png and b/TMessagesProj/src/main/assets/emoji/0_534.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_535.png b/TMessagesProj/src/main/assets/emoji/0_535.png index dac50b9f5..16a237f47 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_535.png and b/TMessagesProj/src/main/assets/emoji/0_535.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_536.png b/TMessagesProj/src/main/assets/emoji/0_536.png index d35806f04..2d8abd34d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_536.png and b/TMessagesProj/src/main/assets/emoji/0_536.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_537.png b/TMessagesProj/src/main/assets/emoji/0_537.png index 7ddf04f2a..6809ba5fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_537.png and b/TMessagesProj/src/main/assets/emoji/0_537.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_538.png b/TMessagesProj/src/main/assets/emoji/0_538.png index 72e1f10cc..f19aa14f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_538.png and b/TMessagesProj/src/main/assets/emoji/0_538.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_539.png b/TMessagesProj/src/main/assets/emoji/0_539.png index 7906ffd76..9b500128d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_539.png and b/TMessagesProj/src/main/assets/emoji/0_539.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_54.png b/TMessagesProj/src/main/assets/emoji/0_54.png index f126b1eeb..2358b1caf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_54.png and b/TMessagesProj/src/main/assets/emoji/0_54.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_540.png b/TMessagesProj/src/main/assets/emoji/0_540.png index e8720d962..242ae0d6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_540.png and b/TMessagesProj/src/main/assets/emoji/0_540.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_541.png b/TMessagesProj/src/main/assets/emoji/0_541.png index 5b855ea48..f003dca7f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_541.png and b/TMessagesProj/src/main/assets/emoji/0_541.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_542.png b/TMessagesProj/src/main/assets/emoji/0_542.png index e45249828..c6ea265dd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_542.png and b/TMessagesProj/src/main/assets/emoji/0_542.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_543.png b/TMessagesProj/src/main/assets/emoji/0_543.png index 59712a3b0..fff61f467 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_543.png and b/TMessagesProj/src/main/assets/emoji/0_543.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_544.png b/TMessagesProj/src/main/assets/emoji/0_544.png index 5198fa5fc..4107ab30b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_544.png and b/TMessagesProj/src/main/assets/emoji/0_544.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_545.png b/TMessagesProj/src/main/assets/emoji/0_545.png index 5c8aefa37..164b99665 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_545.png and b/TMessagesProj/src/main/assets/emoji/0_545.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_546.png b/TMessagesProj/src/main/assets/emoji/0_546.png index 3910264c6..f9431e0f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_546.png and b/TMessagesProj/src/main/assets/emoji/0_546.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_547.png b/TMessagesProj/src/main/assets/emoji/0_547.png index 4e735be5f..46ee48aa7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_547.png and b/TMessagesProj/src/main/assets/emoji/0_547.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_548.png b/TMessagesProj/src/main/assets/emoji/0_548.png index f2a0e3178..8da71ce56 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_548.png and b/TMessagesProj/src/main/assets/emoji/0_548.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_549.png b/TMessagesProj/src/main/assets/emoji/0_549.png index a1a318ed3..344e531d4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_549.png and b/TMessagesProj/src/main/assets/emoji/0_549.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_55.png b/TMessagesProj/src/main/assets/emoji/0_55.png index 6cc1924d0..92da0ee77 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_55.png and b/TMessagesProj/src/main/assets/emoji/0_55.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_550.png b/TMessagesProj/src/main/assets/emoji/0_550.png index f07daef7c..aae884ebe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_550.png and b/TMessagesProj/src/main/assets/emoji/0_550.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_551.png b/TMessagesProj/src/main/assets/emoji/0_551.png index f0b9037db..d63718014 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_551.png and b/TMessagesProj/src/main/assets/emoji/0_551.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_552.png b/TMessagesProj/src/main/assets/emoji/0_552.png index c583ab469..7456802f1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_552.png and b/TMessagesProj/src/main/assets/emoji/0_552.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_553.png b/TMessagesProj/src/main/assets/emoji/0_553.png index 5a22a2e41..acbb3e2b8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_553.png and b/TMessagesProj/src/main/assets/emoji/0_553.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_554.png b/TMessagesProj/src/main/assets/emoji/0_554.png index f718ac9ef..59e7acea8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_554.png and b/TMessagesProj/src/main/assets/emoji/0_554.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_555.png b/TMessagesProj/src/main/assets/emoji/0_555.png index 64235f0f4..d059acdf5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_555.png and b/TMessagesProj/src/main/assets/emoji/0_555.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_556.png b/TMessagesProj/src/main/assets/emoji/0_556.png index 3ff656c37..9d5682277 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_556.png and b/TMessagesProj/src/main/assets/emoji/0_556.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_557.png b/TMessagesProj/src/main/assets/emoji/0_557.png index d9c8fbf75..2008fc73d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_557.png and b/TMessagesProj/src/main/assets/emoji/0_557.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_558.png b/TMessagesProj/src/main/assets/emoji/0_558.png index e5ab3db1d..ba85b21ea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_558.png and b/TMessagesProj/src/main/assets/emoji/0_558.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_559.png b/TMessagesProj/src/main/assets/emoji/0_559.png index 1d3645819..8f076ead5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_559.png and b/TMessagesProj/src/main/assets/emoji/0_559.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_56.png b/TMessagesProj/src/main/assets/emoji/0_56.png index 231f11c8e..ca0ae863e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_56.png and b/TMessagesProj/src/main/assets/emoji/0_56.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_560.png b/TMessagesProj/src/main/assets/emoji/0_560.png index 3188e807f..2ffd22180 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_560.png and b/TMessagesProj/src/main/assets/emoji/0_560.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_561.png b/TMessagesProj/src/main/assets/emoji/0_561.png index aa91918fe..b1bd3e7eb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_561.png and b/TMessagesProj/src/main/assets/emoji/0_561.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_562.png b/TMessagesProj/src/main/assets/emoji/0_562.png index 434cd1115..d573a00d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_562.png and b/TMessagesProj/src/main/assets/emoji/0_562.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_563.png b/TMessagesProj/src/main/assets/emoji/0_563.png index c93aadbaf..c7d73b116 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_563.png and b/TMessagesProj/src/main/assets/emoji/0_563.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_564.png b/TMessagesProj/src/main/assets/emoji/0_564.png index 8763b3905..ce493c87f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_564.png and b/TMessagesProj/src/main/assets/emoji/0_564.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_565.png b/TMessagesProj/src/main/assets/emoji/0_565.png index 38574d97d..d6ca7b653 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_565.png and b/TMessagesProj/src/main/assets/emoji/0_565.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_566.png b/TMessagesProj/src/main/assets/emoji/0_566.png index 55206621e..c7bb8150a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_566.png and b/TMessagesProj/src/main/assets/emoji/0_566.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_567.png b/TMessagesProj/src/main/assets/emoji/0_567.png index 8a4ae2f23..c1b268cc8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_567.png and b/TMessagesProj/src/main/assets/emoji/0_567.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_568.png b/TMessagesProj/src/main/assets/emoji/0_568.png index 472794cb3..e77c48d45 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_568.png and b/TMessagesProj/src/main/assets/emoji/0_568.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_569.png b/TMessagesProj/src/main/assets/emoji/0_569.png index 4c975d0fb..7717f6768 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_569.png and b/TMessagesProj/src/main/assets/emoji/0_569.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_57.png b/TMessagesProj/src/main/assets/emoji/0_57.png index fec4bddce..4252f03d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_57.png and b/TMessagesProj/src/main/assets/emoji/0_57.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_570.png b/TMessagesProj/src/main/assets/emoji/0_570.png index 1261244d3..9c0cf840c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_570.png and b/TMessagesProj/src/main/assets/emoji/0_570.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_571.png b/TMessagesProj/src/main/assets/emoji/0_571.png index 14283dc9b..63a4ff9f7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_571.png and b/TMessagesProj/src/main/assets/emoji/0_571.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_572.png b/TMessagesProj/src/main/assets/emoji/0_572.png index c95fc9359..da382a838 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_572.png and b/TMessagesProj/src/main/assets/emoji/0_572.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_573.png b/TMessagesProj/src/main/assets/emoji/0_573.png index ee533d5b9..487558dfd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_573.png and b/TMessagesProj/src/main/assets/emoji/0_573.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_574.png b/TMessagesProj/src/main/assets/emoji/0_574.png index fdb63860a..8a1cec830 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_574.png and b/TMessagesProj/src/main/assets/emoji/0_574.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_575.png b/TMessagesProj/src/main/assets/emoji/0_575.png index 874a2048f..c11b4cffb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_575.png and b/TMessagesProj/src/main/assets/emoji/0_575.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_576.png b/TMessagesProj/src/main/assets/emoji/0_576.png index 4cefa3180..6d231231c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_576.png and b/TMessagesProj/src/main/assets/emoji/0_576.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_577.png b/TMessagesProj/src/main/assets/emoji/0_577.png index 208e82d82..52b2b5b46 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_577.png and b/TMessagesProj/src/main/assets/emoji/0_577.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_578.png b/TMessagesProj/src/main/assets/emoji/0_578.png index d230e4270..f46df028a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_578.png and b/TMessagesProj/src/main/assets/emoji/0_578.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_579.png b/TMessagesProj/src/main/assets/emoji/0_579.png index 3518beeaf..12754eb13 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_579.png and b/TMessagesProj/src/main/assets/emoji/0_579.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_58.png b/TMessagesProj/src/main/assets/emoji/0_58.png index 051bace59..4c0d777aa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_58.png and b/TMessagesProj/src/main/assets/emoji/0_58.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_580.png b/TMessagesProj/src/main/assets/emoji/0_580.png index e4c26135b..9ec069b39 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_580.png and b/TMessagesProj/src/main/assets/emoji/0_580.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_581.png b/TMessagesProj/src/main/assets/emoji/0_581.png index fc708464b..3149ae01f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_581.png and b/TMessagesProj/src/main/assets/emoji/0_581.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_582.png b/TMessagesProj/src/main/assets/emoji/0_582.png index a7b6726d5..20d0e0c59 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_582.png and b/TMessagesProj/src/main/assets/emoji/0_582.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_583.png b/TMessagesProj/src/main/assets/emoji/0_583.png index 462b4d6f5..08759cf4b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_583.png and b/TMessagesProj/src/main/assets/emoji/0_583.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_584.png b/TMessagesProj/src/main/assets/emoji/0_584.png index 8b156939f..8e3b54dba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_584.png and b/TMessagesProj/src/main/assets/emoji/0_584.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_585.png b/TMessagesProj/src/main/assets/emoji/0_585.png index 4dc0c66db..0b1f32c8d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_585.png and b/TMessagesProj/src/main/assets/emoji/0_585.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_586.png b/TMessagesProj/src/main/assets/emoji/0_586.png index 5316e571b..86bbfe72f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_586.png and b/TMessagesProj/src/main/assets/emoji/0_586.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_587.png b/TMessagesProj/src/main/assets/emoji/0_587.png index 25e16452a..8f09d4d36 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_587.png and b/TMessagesProj/src/main/assets/emoji/0_587.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_588.png b/TMessagesProj/src/main/assets/emoji/0_588.png index 809000b2c..405d0fd0b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_588.png and b/TMessagesProj/src/main/assets/emoji/0_588.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_589.png b/TMessagesProj/src/main/assets/emoji/0_589.png index 5985f7d6c..cc9139a3d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_589.png and b/TMessagesProj/src/main/assets/emoji/0_589.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_59.png b/TMessagesProj/src/main/assets/emoji/0_59.png index 5af551ebb..632f495dd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_59.png and b/TMessagesProj/src/main/assets/emoji/0_59.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_590.png b/TMessagesProj/src/main/assets/emoji/0_590.png index dfe7cd6fd..53c22e184 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_590.png and b/TMessagesProj/src/main/assets/emoji/0_590.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_591.png b/TMessagesProj/src/main/assets/emoji/0_591.png index 786164981..190d1a3ea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_591.png and b/TMessagesProj/src/main/assets/emoji/0_591.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_592.png b/TMessagesProj/src/main/assets/emoji/0_592.png index c144e58bb..d24597462 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_592.png and b/TMessagesProj/src/main/assets/emoji/0_592.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_593.png b/TMessagesProj/src/main/assets/emoji/0_593.png index 6d5870aaa..b3359b6a5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_593.png and b/TMessagesProj/src/main/assets/emoji/0_593.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_594.png b/TMessagesProj/src/main/assets/emoji/0_594.png index 1b455637a..95e83dbec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_594.png and b/TMessagesProj/src/main/assets/emoji/0_594.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_595.png b/TMessagesProj/src/main/assets/emoji/0_595.png index 7730a84c8..ed99a1d20 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_595.png and b/TMessagesProj/src/main/assets/emoji/0_595.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_596.png b/TMessagesProj/src/main/assets/emoji/0_596.png index 979f526bb..f82e4fa89 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_596.png and b/TMessagesProj/src/main/assets/emoji/0_596.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_597.png b/TMessagesProj/src/main/assets/emoji/0_597.png index de6b58668..e72be6955 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_597.png and b/TMessagesProj/src/main/assets/emoji/0_597.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_598.png b/TMessagesProj/src/main/assets/emoji/0_598.png index 607d6c2ec..486d4eb28 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_598.png and b/TMessagesProj/src/main/assets/emoji/0_598.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_599.png b/TMessagesProj/src/main/assets/emoji/0_599.png index 9ea998ee2..ccfab32bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_599.png and b/TMessagesProj/src/main/assets/emoji/0_599.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_6.png b/TMessagesProj/src/main/assets/emoji/0_6.png index 04ed80c9e..033bdca65 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_6.png and b/TMessagesProj/src/main/assets/emoji/0_6.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_60.png b/TMessagesProj/src/main/assets/emoji/0_60.png index 88b007779..c766ef2f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_60.png and b/TMessagesProj/src/main/assets/emoji/0_60.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_600.png b/TMessagesProj/src/main/assets/emoji/0_600.png index 682fef47b..625c2d1d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_600.png and b/TMessagesProj/src/main/assets/emoji/0_600.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_601.png b/TMessagesProj/src/main/assets/emoji/0_601.png index cea2db8b7..50a78d342 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_601.png and b/TMessagesProj/src/main/assets/emoji/0_601.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_602.png b/TMessagesProj/src/main/assets/emoji/0_602.png index 7fba1c73b..ad00c6a3a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_602.png and b/TMessagesProj/src/main/assets/emoji/0_602.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_603.png b/TMessagesProj/src/main/assets/emoji/0_603.png index d1903ea68..ca6a2e486 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_603.png and b/TMessagesProj/src/main/assets/emoji/0_603.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_604.png b/TMessagesProj/src/main/assets/emoji/0_604.png index 3732b1089..9058cfaa1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_604.png and b/TMessagesProj/src/main/assets/emoji/0_604.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_605.png b/TMessagesProj/src/main/assets/emoji/0_605.png index 03cf50936..4c9c3c6be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_605.png and b/TMessagesProj/src/main/assets/emoji/0_605.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_606.png b/TMessagesProj/src/main/assets/emoji/0_606.png index 3aacbfee5..139795592 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_606.png and b/TMessagesProj/src/main/assets/emoji/0_606.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_607.png b/TMessagesProj/src/main/assets/emoji/0_607.png index 3cf91758b..643b3b3fe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_607.png and b/TMessagesProj/src/main/assets/emoji/0_607.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_608.png b/TMessagesProj/src/main/assets/emoji/0_608.png index 4dce60b83..c32b17212 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_608.png and b/TMessagesProj/src/main/assets/emoji/0_608.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_609.png b/TMessagesProj/src/main/assets/emoji/0_609.png index 7d7a96498..ab231e950 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_609.png and b/TMessagesProj/src/main/assets/emoji/0_609.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_61.png b/TMessagesProj/src/main/assets/emoji/0_61.png index 1312c5204..083e45edf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_61.png and b/TMessagesProj/src/main/assets/emoji/0_61.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_610.png b/TMessagesProj/src/main/assets/emoji/0_610.png index b3f487d5c..13d8de721 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_610.png and b/TMessagesProj/src/main/assets/emoji/0_610.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_611.png b/TMessagesProj/src/main/assets/emoji/0_611.png index 84c09317a..68ecde4e8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_611.png and b/TMessagesProj/src/main/assets/emoji/0_611.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_612.png b/TMessagesProj/src/main/assets/emoji/0_612.png index 40c2285f5..fd3d13ff3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_612.png and b/TMessagesProj/src/main/assets/emoji/0_612.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_613.png b/TMessagesProj/src/main/assets/emoji/0_613.png index 059010fa8..bf66e2ae8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_613.png and b/TMessagesProj/src/main/assets/emoji/0_613.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_614.png b/TMessagesProj/src/main/assets/emoji/0_614.png index f16bcd5fe..952da4926 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_614.png and b/TMessagesProj/src/main/assets/emoji/0_614.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_615.png b/TMessagesProj/src/main/assets/emoji/0_615.png index aeda4519d..ada619380 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_615.png and b/TMessagesProj/src/main/assets/emoji/0_615.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_616.png b/TMessagesProj/src/main/assets/emoji/0_616.png index 10087c260..1e2bd876c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_616.png and b/TMessagesProj/src/main/assets/emoji/0_616.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_617.png b/TMessagesProj/src/main/assets/emoji/0_617.png index ea4d4dd92..b78877f6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_617.png and b/TMessagesProj/src/main/assets/emoji/0_617.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_618.png b/TMessagesProj/src/main/assets/emoji/0_618.png index d9947c898..39dfc8c2e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_618.png and b/TMessagesProj/src/main/assets/emoji/0_618.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_619.png b/TMessagesProj/src/main/assets/emoji/0_619.png index 43426de5c..c20e57542 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_619.png and b/TMessagesProj/src/main/assets/emoji/0_619.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_62.png b/TMessagesProj/src/main/assets/emoji/0_62.png index a59eb7d73..145be655e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_62.png and b/TMessagesProj/src/main/assets/emoji/0_62.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_620.png b/TMessagesProj/src/main/assets/emoji/0_620.png index 168e9589f..8c40a4879 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_620.png and b/TMessagesProj/src/main/assets/emoji/0_620.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_621.png b/TMessagesProj/src/main/assets/emoji/0_621.png index 478b3b514..b67d0f64d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_621.png and b/TMessagesProj/src/main/assets/emoji/0_621.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_622.png b/TMessagesProj/src/main/assets/emoji/0_622.png index acb57beb9..21288f10d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_622.png and b/TMessagesProj/src/main/assets/emoji/0_622.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_623.png b/TMessagesProj/src/main/assets/emoji/0_623.png index 501c2ddd8..6136490b1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_623.png and b/TMessagesProj/src/main/assets/emoji/0_623.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_624.png b/TMessagesProj/src/main/assets/emoji/0_624.png index c1cbae7d8..22b1b7735 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_624.png and b/TMessagesProj/src/main/assets/emoji/0_624.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_625.png b/TMessagesProj/src/main/assets/emoji/0_625.png index 4e430ced1..40595daf3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_625.png and b/TMessagesProj/src/main/assets/emoji/0_625.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_626.png b/TMessagesProj/src/main/assets/emoji/0_626.png index 7b2c9c3f2..9cc1b8d68 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_626.png and b/TMessagesProj/src/main/assets/emoji/0_626.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_627.png b/TMessagesProj/src/main/assets/emoji/0_627.png index e74ac6a95..3886a408c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_627.png and b/TMessagesProj/src/main/assets/emoji/0_627.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_628.png b/TMessagesProj/src/main/assets/emoji/0_628.png index 2956d277a..d09ea74c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_628.png and b/TMessagesProj/src/main/assets/emoji/0_628.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_629.png b/TMessagesProj/src/main/assets/emoji/0_629.png index a8cd0c225..07f419f27 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_629.png and b/TMessagesProj/src/main/assets/emoji/0_629.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_63.png b/TMessagesProj/src/main/assets/emoji/0_63.png index c96a39eb9..e89b7063d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_63.png and b/TMessagesProj/src/main/assets/emoji/0_63.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_630.png b/TMessagesProj/src/main/assets/emoji/0_630.png index 28dee271d..9d8ceaed5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_630.png and b/TMessagesProj/src/main/assets/emoji/0_630.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_631.png b/TMessagesProj/src/main/assets/emoji/0_631.png index d9c9842df..51f712f58 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_631.png and b/TMessagesProj/src/main/assets/emoji/0_631.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_632.png b/TMessagesProj/src/main/assets/emoji/0_632.png index 5d0a74d3e..148b6387a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_632.png and b/TMessagesProj/src/main/assets/emoji/0_632.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_633.png b/TMessagesProj/src/main/assets/emoji/0_633.png index c92a065f2..d7ebf4d5a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_633.png and b/TMessagesProj/src/main/assets/emoji/0_633.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_634.png b/TMessagesProj/src/main/assets/emoji/0_634.png index 50420329c..355da089d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_634.png and b/TMessagesProj/src/main/assets/emoji/0_634.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_635.png b/TMessagesProj/src/main/assets/emoji/0_635.png index 05c5f7f9b..d6e98446e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_635.png and b/TMessagesProj/src/main/assets/emoji/0_635.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_636.png b/TMessagesProj/src/main/assets/emoji/0_636.png index d0f5efe95..c85d15ed2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_636.png and b/TMessagesProj/src/main/assets/emoji/0_636.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_637.png b/TMessagesProj/src/main/assets/emoji/0_637.png index 156cb2678..fd8733b86 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_637.png and b/TMessagesProj/src/main/assets/emoji/0_637.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_638.png b/TMessagesProj/src/main/assets/emoji/0_638.png index 00bd959fa..90690b4e6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_638.png and b/TMessagesProj/src/main/assets/emoji/0_638.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_639.png b/TMessagesProj/src/main/assets/emoji/0_639.png index 46bd0f76a..c37f3c64c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_639.png and b/TMessagesProj/src/main/assets/emoji/0_639.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_64.png b/TMessagesProj/src/main/assets/emoji/0_64.png index c30a9053c..36f29ab7a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_64.png and b/TMessagesProj/src/main/assets/emoji/0_64.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_640.png b/TMessagesProj/src/main/assets/emoji/0_640.png index 49a683d91..30510d71e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_640.png and b/TMessagesProj/src/main/assets/emoji/0_640.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_641.png b/TMessagesProj/src/main/assets/emoji/0_641.png index 661fd4542..6d8585054 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_641.png and b/TMessagesProj/src/main/assets/emoji/0_641.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_642.png b/TMessagesProj/src/main/assets/emoji/0_642.png index b88244845..c7b5a4b17 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_642.png and b/TMessagesProj/src/main/assets/emoji/0_642.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_643.png b/TMessagesProj/src/main/assets/emoji/0_643.png index fcea72f41..561c2b06e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_643.png and b/TMessagesProj/src/main/assets/emoji/0_643.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_644.png b/TMessagesProj/src/main/assets/emoji/0_644.png index 70e719532..fd477aba7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_644.png and b/TMessagesProj/src/main/assets/emoji/0_644.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_645.png b/TMessagesProj/src/main/assets/emoji/0_645.png index bb1f98971..61197989f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_645.png and b/TMessagesProj/src/main/assets/emoji/0_645.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_646.png b/TMessagesProj/src/main/assets/emoji/0_646.png index 403e6d9bb..59500fb27 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_646.png and b/TMessagesProj/src/main/assets/emoji/0_646.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_647.png b/TMessagesProj/src/main/assets/emoji/0_647.png index e42940d04..4fbc236e8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_647.png and b/TMessagesProj/src/main/assets/emoji/0_647.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_648.png b/TMessagesProj/src/main/assets/emoji/0_648.png index e5bdff17d..9a476c25e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_648.png and b/TMessagesProj/src/main/assets/emoji/0_648.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_649.png b/TMessagesProj/src/main/assets/emoji/0_649.png index 9660ffde8..a5579a35c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_649.png and b/TMessagesProj/src/main/assets/emoji/0_649.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_65.png b/TMessagesProj/src/main/assets/emoji/0_65.png index 2b3112e3e..08478bd42 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_65.png and b/TMessagesProj/src/main/assets/emoji/0_65.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_650.png b/TMessagesProj/src/main/assets/emoji/0_650.png index 15d4a7a90..052382b12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_650.png and b/TMessagesProj/src/main/assets/emoji/0_650.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_651.png b/TMessagesProj/src/main/assets/emoji/0_651.png index 6cd082291..67c94bf81 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_651.png and b/TMessagesProj/src/main/assets/emoji/0_651.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_652.png b/TMessagesProj/src/main/assets/emoji/0_652.png index b2967cbbf..1db49985c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_652.png and b/TMessagesProj/src/main/assets/emoji/0_652.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_653.png b/TMessagesProj/src/main/assets/emoji/0_653.png index 2149b987c..bb700427b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_653.png and b/TMessagesProj/src/main/assets/emoji/0_653.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_654.png b/TMessagesProj/src/main/assets/emoji/0_654.png index a639599cc..264001005 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_654.png and b/TMessagesProj/src/main/assets/emoji/0_654.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_655.png b/TMessagesProj/src/main/assets/emoji/0_655.png index fb85f9972..64f4b6a9e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_655.png and b/TMessagesProj/src/main/assets/emoji/0_655.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_656.png b/TMessagesProj/src/main/assets/emoji/0_656.png index b51f841c8..5ac595188 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_656.png and b/TMessagesProj/src/main/assets/emoji/0_656.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_657.png b/TMessagesProj/src/main/assets/emoji/0_657.png index d54ddb683..329624fcf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_657.png and b/TMessagesProj/src/main/assets/emoji/0_657.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_658.png b/TMessagesProj/src/main/assets/emoji/0_658.png index e6aabdfcd..86bc87aa2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_658.png and b/TMessagesProj/src/main/assets/emoji/0_658.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_659.png b/TMessagesProj/src/main/assets/emoji/0_659.png index 69897d683..cbcd8f294 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_659.png and b/TMessagesProj/src/main/assets/emoji/0_659.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_66.png b/TMessagesProj/src/main/assets/emoji/0_66.png index b5640ab2c..f9dca63cb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_66.png and b/TMessagesProj/src/main/assets/emoji/0_66.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_660.png b/TMessagesProj/src/main/assets/emoji/0_660.png index afcc1fe7e..5091df314 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_660.png and b/TMessagesProj/src/main/assets/emoji/0_660.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_661.png b/TMessagesProj/src/main/assets/emoji/0_661.png index 01304f095..70f0f6bb5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_661.png and b/TMessagesProj/src/main/assets/emoji/0_661.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_662.png b/TMessagesProj/src/main/assets/emoji/0_662.png index d77caba6f..857b846f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_662.png and b/TMessagesProj/src/main/assets/emoji/0_662.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_663.png b/TMessagesProj/src/main/assets/emoji/0_663.png index c37333be8..4df11b107 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_663.png and b/TMessagesProj/src/main/assets/emoji/0_663.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_664.png b/TMessagesProj/src/main/assets/emoji/0_664.png index c7175548b..65d8ec7d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_664.png and b/TMessagesProj/src/main/assets/emoji/0_664.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_665.png b/TMessagesProj/src/main/assets/emoji/0_665.png index 488ec5d6c..09030e029 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_665.png and b/TMessagesProj/src/main/assets/emoji/0_665.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_666.png b/TMessagesProj/src/main/assets/emoji/0_666.png index 713a2774a..dd53dbebc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_666.png and b/TMessagesProj/src/main/assets/emoji/0_666.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_667.png b/TMessagesProj/src/main/assets/emoji/0_667.png index 2d1af0404..28bcb90c7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_667.png and b/TMessagesProj/src/main/assets/emoji/0_667.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_668.png b/TMessagesProj/src/main/assets/emoji/0_668.png index 198597be5..092cf8c3e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_668.png and b/TMessagesProj/src/main/assets/emoji/0_668.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_669.png b/TMessagesProj/src/main/assets/emoji/0_669.png index 4994d4f24..a45112f18 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_669.png and b/TMessagesProj/src/main/assets/emoji/0_669.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_67.png b/TMessagesProj/src/main/assets/emoji/0_67.png index da9bee198..780115436 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_67.png and b/TMessagesProj/src/main/assets/emoji/0_67.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_670.png b/TMessagesProj/src/main/assets/emoji/0_670.png index 2a4328564..d00047262 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_670.png and b/TMessagesProj/src/main/assets/emoji/0_670.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_671.png b/TMessagesProj/src/main/assets/emoji/0_671.png index 03b1cceba..d1657bc95 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_671.png and b/TMessagesProj/src/main/assets/emoji/0_671.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_672.png b/TMessagesProj/src/main/assets/emoji/0_672.png index 5d810de5d..ccf914323 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_672.png and b/TMessagesProj/src/main/assets/emoji/0_672.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_673.png b/TMessagesProj/src/main/assets/emoji/0_673.png index 4e70e4a5d..9f62e9306 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_673.png and b/TMessagesProj/src/main/assets/emoji/0_673.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_674.png b/TMessagesProj/src/main/assets/emoji/0_674.png index 24ca6f7bc..2e749e798 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_674.png and b/TMessagesProj/src/main/assets/emoji/0_674.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_675.png b/TMessagesProj/src/main/assets/emoji/0_675.png index 2c8259de4..843514c77 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_675.png and b/TMessagesProj/src/main/assets/emoji/0_675.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_676.png b/TMessagesProj/src/main/assets/emoji/0_676.png index 932d68ad0..eabc6fda1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_676.png and b/TMessagesProj/src/main/assets/emoji/0_676.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_677.png b/TMessagesProj/src/main/assets/emoji/0_677.png index 5ebf4663a..6f482c553 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_677.png and b/TMessagesProj/src/main/assets/emoji/0_677.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_678.png b/TMessagesProj/src/main/assets/emoji/0_678.png index cb0008336..59b3ecf30 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_678.png and b/TMessagesProj/src/main/assets/emoji/0_678.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_679.png b/TMessagesProj/src/main/assets/emoji/0_679.png index 19d66f7e4..4ecc681c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_679.png and b/TMessagesProj/src/main/assets/emoji/0_679.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_68.png b/TMessagesProj/src/main/assets/emoji/0_68.png index cfcc4d88c..6b4794398 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_68.png and b/TMessagesProj/src/main/assets/emoji/0_68.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_680.png b/TMessagesProj/src/main/assets/emoji/0_680.png index 5471146a1..3bece2cd2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_680.png and b/TMessagesProj/src/main/assets/emoji/0_680.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_681.png b/TMessagesProj/src/main/assets/emoji/0_681.png index c7f4c430b..f53654b20 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_681.png and b/TMessagesProj/src/main/assets/emoji/0_681.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_682.png b/TMessagesProj/src/main/assets/emoji/0_682.png index a6bb5e24f..38f33d606 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_682.png and b/TMessagesProj/src/main/assets/emoji/0_682.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_683.png b/TMessagesProj/src/main/assets/emoji/0_683.png index d552c37a0..504c17004 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_683.png and b/TMessagesProj/src/main/assets/emoji/0_683.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_684.png b/TMessagesProj/src/main/assets/emoji/0_684.png index 1e1a22043..c64a95012 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_684.png and b/TMessagesProj/src/main/assets/emoji/0_684.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_685.png b/TMessagesProj/src/main/assets/emoji/0_685.png index 576a70b13..d153f5546 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_685.png and b/TMessagesProj/src/main/assets/emoji/0_685.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_686.png b/TMessagesProj/src/main/assets/emoji/0_686.png index 12c050728..651e064a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_686.png and b/TMessagesProj/src/main/assets/emoji/0_686.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_687.png b/TMessagesProj/src/main/assets/emoji/0_687.png index f3b90ff4b..9feeabae4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_687.png and b/TMessagesProj/src/main/assets/emoji/0_687.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_688.png b/TMessagesProj/src/main/assets/emoji/0_688.png index 94fff3c60..af47b78b3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_688.png and b/TMessagesProj/src/main/assets/emoji/0_688.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_689.png b/TMessagesProj/src/main/assets/emoji/0_689.png index ebcac4827..d9229e103 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_689.png and b/TMessagesProj/src/main/assets/emoji/0_689.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_69.png b/TMessagesProj/src/main/assets/emoji/0_69.png index 6532702d4..9378937fb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_69.png and b/TMessagesProj/src/main/assets/emoji/0_69.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_690.png b/TMessagesProj/src/main/assets/emoji/0_690.png index d07a78623..868d8198f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_690.png and b/TMessagesProj/src/main/assets/emoji/0_690.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_691.png b/TMessagesProj/src/main/assets/emoji/0_691.png index 09f2b6888..7caf3d4de 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_691.png and b/TMessagesProj/src/main/assets/emoji/0_691.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_692.png b/TMessagesProj/src/main/assets/emoji/0_692.png index a644c6ebd..590355bb3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_692.png and b/TMessagesProj/src/main/assets/emoji/0_692.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_693.png b/TMessagesProj/src/main/assets/emoji/0_693.png index 4b59d8d78..29ea2fc4d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_693.png and b/TMessagesProj/src/main/assets/emoji/0_693.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_694.png b/TMessagesProj/src/main/assets/emoji/0_694.png index 5734d8cb7..7de29b6bb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_694.png and b/TMessagesProj/src/main/assets/emoji/0_694.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_695.png b/TMessagesProj/src/main/assets/emoji/0_695.png index 43f1c01b3..e25215c29 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_695.png and b/TMessagesProj/src/main/assets/emoji/0_695.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_696.png b/TMessagesProj/src/main/assets/emoji/0_696.png index de6c9d331..b7be6b733 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_696.png and b/TMessagesProj/src/main/assets/emoji/0_696.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_697.png b/TMessagesProj/src/main/assets/emoji/0_697.png index bfa78926d..ba88f04c0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_697.png and b/TMessagesProj/src/main/assets/emoji/0_697.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_698.png b/TMessagesProj/src/main/assets/emoji/0_698.png index 542db0434..cd8e81497 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_698.png and b/TMessagesProj/src/main/assets/emoji/0_698.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_699.png b/TMessagesProj/src/main/assets/emoji/0_699.png index ae1d9adbc..55da0140c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_699.png and b/TMessagesProj/src/main/assets/emoji/0_699.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_7.png b/TMessagesProj/src/main/assets/emoji/0_7.png index 3538b9617..04a7e33b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_7.png and b/TMessagesProj/src/main/assets/emoji/0_7.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_70.png b/TMessagesProj/src/main/assets/emoji/0_70.png index 376facf76..f2953f9bb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_70.png and b/TMessagesProj/src/main/assets/emoji/0_70.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_700.png b/TMessagesProj/src/main/assets/emoji/0_700.png index 3e9ca6b67..fcc3fa97a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_700.png and b/TMessagesProj/src/main/assets/emoji/0_700.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_701.png b/TMessagesProj/src/main/assets/emoji/0_701.png index aa55c1ba1..ee0611e6a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_701.png and b/TMessagesProj/src/main/assets/emoji/0_701.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_702.png b/TMessagesProj/src/main/assets/emoji/0_702.png index a169933e4..e460598b0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_702.png and b/TMessagesProj/src/main/assets/emoji/0_702.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_703.png b/TMessagesProj/src/main/assets/emoji/0_703.png index a95408d8f..d874d88a6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_703.png and b/TMessagesProj/src/main/assets/emoji/0_703.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_704.png b/TMessagesProj/src/main/assets/emoji/0_704.png index 8438b584e..98cbc0e9d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_704.png and b/TMessagesProj/src/main/assets/emoji/0_704.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_705.png b/TMessagesProj/src/main/assets/emoji/0_705.png index 869bbb4df..aa7ea06f8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_705.png and b/TMessagesProj/src/main/assets/emoji/0_705.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_706.png b/TMessagesProj/src/main/assets/emoji/0_706.png index 1bf3bcf71..7f82c5634 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_706.png and b/TMessagesProj/src/main/assets/emoji/0_706.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_707.png b/TMessagesProj/src/main/assets/emoji/0_707.png index 8816cbddc..ed622141b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_707.png and b/TMessagesProj/src/main/assets/emoji/0_707.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_708.png b/TMessagesProj/src/main/assets/emoji/0_708.png index 44d819642..87d54b8f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_708.png and b/TMessagesProj/src/main/assets/emoji/0_708.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_709.png b/TMessagesProj/src/main/assets/emoji/0_709.png index 0be7777cb..ff959b313 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_709.png and b/TMessagesProj/src/main/assets/emoji/0_709.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_71.png b/TMessagesProj/src/main/assets/emoji/0_71.png index 47a9abcd0..0a051f825 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_71.png and b/TMessagesProj/src/main/assets/emoji/0_71.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_710.png b/TMessagesProj/src/main/assets/emoji/0_710.png index 1dd007131..8112d2eff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_710.png and b/TMessagesProj/src/main/assets/emoji/0_710.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_711.png b/TMessagesProj/src/main/assets/emoji/0_711.png index a800bb29d..54ebf981f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_711.png and b/TMessagesProj/src/main/assets/emoji/0_711.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_712.png b/TMessagesProj/src/main/assets/emoji/0_712.png index feb63accf..46bbe09b7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_712.png and b/TMessagesProj/src/main/assets/emoji/0_712.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_713.png b/TMessagesProj/src/main/assets/emoji/0_713.png index 23db9aa39..368792289 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_713.png and b/TMessagesProj/src/main/assets/emoji/0_713.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_714.png b/TMessagesProj/src/main/assets/emoji/0_714.png index ec5805957..78c431ee5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_714.png and b/TMessagesProj/src/main/assets/emoji/0_714.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_715.png b/TMessagesProj/src/main/assets/emoji/0_715.png index 3174c191a..80b55d654 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_715.png and b/TMessagesProj/src/main/assets/emoji/0_715.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_716.png b/TMessagesProj/src/main/assets/emoji/0_716.png index 27f22ebd6..088cff119 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_716.png and b/TMessagesProj/src/main/assets/emoji/0_716.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_717.png b/TMessagesProj/src/main/assets/emoji/0_717.png index 6793e0eef..1c52e08d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_717.png and b/TMessagesProj/src/main/assets/emoji/0_717.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_718.png b/TMessagesProj/src/main/assets/emoji/0_718.png index e7f003f65..4ea7a663d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_718.png and b/TMessagesProj/src/main/assets/emoji/0_718.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_719.png b/TMessagesProj/src/main/assets/emoji/0_719.png index cf9c1fc91..cd36932f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_719.png and b/TMessagesProj/src/main/assets/emoji/0_719.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_72.png b/TMessagesProj/src/main/assets/emoji/0_72.png index 85da91519..e4c6a1add 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_72.png and b/TMessagesProj/src/main/assets/emoji/0_72.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_720.png b/TMessagesProj/src/main/assets/emoji/0_720.png index ce0fee3a4..261689916 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_720.png and b/TMessagesProj/src/main/assets/emoji/0_720.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_721.png b/TMessagesProj/src/main/assets/emoji/0_721.png index e66f42691..25e78a188 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_721.png and b/TMessagesProj/src/main/assets/emoji/0_721.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_722.png b/TMessagesProj/src/main/assets/emoji/0_722.png index 36d5d46a1..556ca710a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_722.png and b/TMessagesProj/src/main/assets/emoji/0_722.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_723.png b/TMessagesProj/src/main/assets/emoji/0_723.png index e669032e4..11cd82764 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_723.png and b/TMessagesProj/src/main/assets/emoji/0_723.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_724.png b/TMessagesProj/src/main/assets/emoji/0_724.png index 904cac265..1a12f7569 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_724.png and b/TMessagesProj/src/main/assets/emoji/0_724.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_725.png b/TMessagesProj/src/main/assets/emoji/0_725.png index 75d8a64cd..906ad52ca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_725.png and b/TMessagesProj/src/main/assets/emoji/0_725.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_726.png b/TMessagesProj/src/main/assets/emoji/0_726.png index 5e14e32b4..c3b2cb060 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_726.png and b/TMessagesProj/src/main/assets/emoji/0_726.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_727.png b/TMessagesProj/src/main/assets/emoji/0_727.png index abce8cac2..7442ee2a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_727.png and b/TMessagesProj/src/main/assets/emoji/0_727.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_728.png b/TMessagesProj/src/main/assets/emoji/0_728.png index 0b623f793..dacedf8c0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_728.png and b/TMessagesProj/src/main/assets/emoji/0_728.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_729.png b/TMessagesProj/src/main/assets/emoji/0_729.png index 191148141..274eb317c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_729.png and b/TMessagesProj/src/main/assets/emoji/0_729.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_73.png b/TMessagesProj/src/main/assets/emoji/0_73.png index 38b01d07a..2ef045ae6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_73.png and b/TMessagesProj/src/main/assets/emoji/0_73.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_730.png b/TMessagesProj/src/main/assets/emoji/0_730.png index cde6ecdd8..8e2c31b07 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_730.png and b/TMessagesProj/src/main/assets/emoji/0_730.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_731.png b/TMessagesProj/src/main/assets/emoji/0_731.png index afad29c04..67cee31b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_731.png and b/TMessagesProj/src/main/assets/emoji/0_731.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_732.png b/TMessagesProj/src/main/assets/emoji/0_732.png index 3d8afa85f..4c5f48e0c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_732.png and b/TMessagesProj/src/main/assets/emoji/0_732.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_733.png b/TMessagesProj/src/main/assets/emoji/0_733.png index 40e0b9c11..5a1456f39 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_733.png and b/TMessagesProj/src/main/assets/emoji/0_733.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_734.png b/TMessagesProj/src/main/assets/emoji/0_734.png index 26396f725..4acdc77dd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_734.png and b/TMessagesProj/src/main/assets/emoji/0_734.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_735.png b/TMessagesProj/src/main/assets/emoji/0_735.png index edf787510..c7b8dc339 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_735.png and b/TMessagesProj/src/main/assets/emoji/0_735.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_736.png b/TMessagesProj/src/main/assets/emoji/0_736.png index f16d789e5..4c828edba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_736.png and b/TMessagesProj/src/main/assets/emoji/0_736.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_737.png b/TMessagesProj/src/main/assets/emoji/0_737.png index efc5f1076..549d2f95b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_737.png and b/TMessagesProj/src/main/assets/emoji/0_737.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_738.png b/TMessagesProj/src/main/assets/emoji/0_738.png index 3f30675e6..f0e0be767 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_738.png and b/TMessagesProj/src/main/assets/emoji/0_738.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_739.png b/TMessagesProj/src/main/assets/emoji/0_739.png index 3abae7fd5..4e746f209 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_739.png and b/TMessagesProj/src/main/assets/emoji/0_739.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_74.png b/TMessagesProj/src/main/assets/emoji/0_74.png index 99b075b10..bae09b7f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_74.png and b/TMessagesProj/src/main/assets/emoji/0_74.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_740.png b/TMessagesProj/src/main/assets/emoji/0_740.png index 6a106def2..7862c93ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_740.png and b/TMessagesProj/src/main/assets/emoji/0_740.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_741.png b/TMessagesProj/src/main/assets/emoji/0_741.png index c79532ec0..1a1a830b4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_741.png and b/TMessagesProj/src/main/assets/emoji/0_741.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_742.png b/TMessagesProj/src/main/assets/emoji/0_742.png index f2777500a..d4087a5c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_742.png and b/TMessagesProj/src/main/assets/emoji/0_742.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_743.png b/TMessagesProj/src/main/assets/emoji/0_743.png index 8a54f70ff..a0277c1da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_743.png and b/TMessagesProj/src/main/assets/emoji/0_743.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_744.png b/TMessagesProj/src/main/assets/emoji/0_744.png index 5df6ef602..c1511f19f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_744.png and b/TMessagesProj/src/main/assets/emoji/0_744.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_745.png b/TMessagesProj/src/main/assets/emoji/0_745.png index 76c9bd5ac..9aa74e009 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_745.png and b/TMessagesProj/src/main/assets/emoji/0_745.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_746.png b/TMessagesProj/src/main/assets/emoji/0_746.png index 70d4d0223..e12b44e16 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_746.png and b/TMessagesProj/src/main/assets/emoji/0_746.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_747.png b/TMessagesProj/src/main/assets/emoji/0_747.png index dee6c42e9..4384244cb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_747.png and b/TMessagesProj/src/main/assets/emoji/0_747.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_748.png b/TMessagesProj/src/main/assets/emoji/0_748.png index 4e5afd33b..486c30ef9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_748.png and b/TMessagesProj/src/main/assets/emoji/0_748.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_749.png b/TMessagesProj/src/main/assets/emoji/0_749.png index 88c9f5326..ce4337fa1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_749.png and b/TMessagesProj/src/main/assets/emoji/0_749.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_75.png b/TMessagesProj/src/main/assets/emoji/0_75.png index 96cf5b361..41c5c9e74 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_75.png and b/TMessagesProj/src/main/assets/emoji/0_75.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_750.png b/TMessagesProj/src/main/assets/emoji/0_750.png index 33ce2888d..cf4b8c2f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_750.png and b/TMessagesProj/src/main/assets/emoji/0_750.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_751.png b/TMessagesProj/src/main/assets/emoji/0_751.png index 8cdd3d804..d14265040 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_751.png and b/TMessagesProj/src/main/assets/emoji/0_751.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_752.png b/TMessagesProj/src/main/assets/emoji/0_752.png index 017cfdae0..c22336a11 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_752.png and b/TMessagesProj/src/main/assets/emoji/0_752.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_753.png b/TMessagesProj/src/main/assets/emoji/0_753.png index b95d42b5d..d2cc2e774 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_753.png and b/TMessagesProj/src/main/assets/emoji/0_753.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_754.png b/TMessagesProj/src/main/assets/emoji/0_754.png index 7cdecd876..ea68ed45a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_754.png and b/TMessagesProj/src/main/assets/emoji/0_754.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_755.png b/TMessagesProj/src/main/assets/emoji/0_755.png index 987db4a2c..7fb13ebd8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_755.png and b/TMessagesProj/src/main/assets/emoji/0_755.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_756.png b/TMessagesProj/src/main/assets/emoji/0_756.png index 551bb0abd..16649d9e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_756.png and b/TMessagesProj/src/main/assets/emoji/0_756.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_757.png b/TMessagesProj/src/main/assets/emoji/0_757.png index f1cdb5448..ccb0f32ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_757.png and b/TMessagesProj/src/main/assets/emoji/0_757.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_758.png b/TMessagesProj/src/main/assets/emoji/0_758.png index 928ce6fbc..bee8757c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_758.png and b/TMessagesProj/src/main/assets/emoji/0_758.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_759.png b/TMessagesProj/src/main/assets/emoji/0_759.png index 225e860d1..32bb21b81 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_759.png and b/TMessagesProj/src/main/assets/emoji/0_759.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_76.png b/TMessagesProj/src/main/assets/emoji/0_76.png index a65a7860f..dcb96e5a5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_76.png and b/TMessagesProj/src/main/assets/emoji/0_76.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_760.png b/TMessagesProj/src/main/assets/emoji/0_760.png index 1c201d3e3..c7006fa82 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_760.png and b/TMessagesProj/src/main/assets/emoji/0_760.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_761.png b/TMessagesProj/src/main/assets/emoji/0_761.png index e0b5b654a..1bb90ed17 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_761.png and b/TMessagesProj/src/main/assets/emoji/0_761.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_762.png b/TMessagesProj/src/main/assets/emoji/0_762.png index 3c8d8a20b..d9fed370f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_762.png and b/TMessagesProj/src/main/assets/emoji/0_762.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_763.png b/TMessagesProj/src/main/assets/emoji/0_763.png index 6339cfa54..3811e115c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_763.png and b/TMessagesProj/src/main/assets/emoji/0_763.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_764.png b/TMessagesProj/src/main/assets/emoji/0_764.png index 93aaae908..08b0cee8f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_764.png and b/TMessagesProj/src/main/assets/emoji/0_764.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_765.png b/TMessagesProj/src/main/assets/emoji/0_765.png index 3a4f5fc04..1c5363a0b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_765.png and b/TMessagesProj/src/main/assets/emoji/0_765.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_766.png b/TMessagesProj/src/main/assets/emoji/0_766.png index aaa57343a..097619056 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_766.png and b/TMessagesProj/src/main/assets/emoji/0_766.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_767.png b/TMessagesProj/src/main/assets/emoji/0_767.png index 1a415a882..5e24ab45a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_767.png and b/TMessagesProj/src/main/assets/emoji/0_767.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_768.png b/TMessagesProj/src/main/assets/emoji/0_768.png index 6f2577051..0cf8b4b82 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_768.png and b/TMessagesProj/src/main/assets/emoji/0_768.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_769.png b/TMessagesProj/src/main/assets/emoji/0_769.png index 3bc3ec80c..223f73e7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_769.png and b/TMessagesProj/src/main/assets/emoji/0_769.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_77.png b/TMessagesProj/src/main/assets/emoji/0_77.png index 8cbaedff9..3cd4d16ab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_77.png and b/TMessagesProj/src/main/assets/emoji/0_77.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_770.png b/TMessagesProj/src/main/assets/emoji/0_770.png index 4b9643879..b5ed48342 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_770.png and b/TMessagesProj/src/main/assets/emoji/0_770.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_771.png b/TMessagesProj/src/main/assets/emoji/0_771.png index 65fe61d12..f17fb69a8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_771.png and b/TMessagesProj/src/main/assets/emoji/0_771.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_772.png b/TMessagesProj/src/main/assets/emoji/0_772.png index 4edf9bea9..a49459aac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_772.png and b/TMessagesProj/src/main/assets/emoji/0_772.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_773.png b/TMessagesProj/src/main/assets/emoji/0_773.png index 79185009d..a76f9d755 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_773.png and b/TMessagesProj/src/main/assets/emoji/0_773.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_774.png b/TMessagesProj/src/main/assets/emoji/0_774.png index da6af8940..2abe3b98d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_774.png and b/TMessagesProj/src/main/assets/emoji/0_774.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_775.png b/TMessagesProj/src/main/assets/emoji/0_775.png index 53459b52f..18aaacea4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_775.png and b/TMessagesProj/src/main/assets/emoji/0_775.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_776.png b/TMessagesProj/src/main/assets/emoji/0_776.png index 3ae39e7bf..20f8bb204 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_776.png and b/TMessagesProj/src/main/assets/emoji/0_776.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_777.png b/TMessagesProj/src/main/assets/emoji/0_777.png index c088df06a..a2c2cf117 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_777.png and b/TMessagesProj/src/main/assets/emoji/0_777.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_778.png b/TMessagesProj/src/main/assets/emoji/0_778.png index 7bfb17b31..6f5682c78 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_778.png and b/TMessagesProj/src/main/assets/emoji/0_778.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_779.png b/TMessagesProj/src/main/assets/emoji/0_779.png index 0b3f70eda..7abfdae1e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_779.png and b/TMessagesProj/src/main/assets/emoji/0_779.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_78.png b/TMessagesProj/src/main/assets/emoji/0_78.png index 13cedac88..5f7dd3cf5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_78.png and b/TMessagesProj/src/main/assets/emoji/0_78.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_780.png b/TMessagesProj/src/main/assets/emoji/0_780.png index 053e8292c..a89b853ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_780.png and b/TMessagesProj/src/main/assets/emoji/0_780.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_781.png b/TMessagesProj/src/main/assets/emoji/0_781.png index a77d43b43..6bd841754 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_781.png and b/TMessagesProj/src/main/assets/emoji/0_781.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_782.png b/TMessagesProj/src/main/assets/emoji/0_782.png index f8f106d1f..a5fa3dd2e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_782.png and b/TMessagesProj/src/main/assets/emoji/0_782.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_783.png b/TMessagesProj/src/main/assets/emoji/0_783.png index c516f327d..7f53f00d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_783.png and b/TMessagesProj/src/main/assets/emoji/0_783.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_784.png b/TMessagesProj/src/main/assets/emoji/0_784.png index 3a3f105cf..9f60eb58c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_784.png and b/TMessagesProj/src/main/assets/emoji/0_784.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_785.png b/TMessagesProj/src/main/assets/emoji/0_785.png index 2b6d1173f..b068ced6d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_785.png and b/TMessagesProj/src/main/assets/emoji/0_785.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_786.png b/TMessagesProj/src/main/assets/emoji/0_786.png index b3d5ef6dc..076961b66 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_786.png and b/TMessagesProj/src/main/assets/emoji/0_786.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_787.png b/TMessagesProj/src/main/assets/emoji/0_787.png index b6b3e66dd..c67e6791d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_787.png and b/TMessagesProj/src/main/assets/emoji/0_787.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_788.png b/TMessagesProj/src/main/assets/emoji/0_788.png index fbcbf3cfb..ef72b0da2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_788.png and b/TMessagesProj/src/main/assets/emoji/0_788.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_789.png b/TMessagesProj/src/main/assets/emoji/0_789.png index 61804fbda..d9fa0d7bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_789.png and b/TMessagesProj/src/main/assets/emoji/0_789.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_79.png b/TMessagesProj/src/main/assets/emoji/0_79.png index ed359b989..02f1b9359 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_79.png and b/TMessagesProj/src/main/assets/emoji/0_79.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_790.png b/TMessagesProj/src/main/assets/emoji/0_790.png index 67b068df2..afa09ca32 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_790.png and b/TMessagesProj/src/main/assets/emoji/0_790.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_791.png b/TMessagesProj/src/main/assets/emoji/0_791.png index ad1121cfd..dadaac31b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_791.png and b/TMessagesProj/src/main/assets/emoji/0_791.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_792.png b/TMessagesProj/src/main/assets/emoji/0_792.png index 4a3a604b2..c08f1201e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_792.png and b/TMessagesProj/src/main/assets/emoji/0_792.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_793.png b/TMessagesProj/src/main/assets/emoji/0_793.png index b11a9afc1..b00f3af1d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_793.png and b/TMessagesProj/src/main/assets/emoji/0_793.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_794.png b/TMessagesProj/src/main/assets/emoji/0_794.png index d92d029c1..d76d06595 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_794.png and b/TMessagesProj/src/main/assets/emoji/0_794.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_795.png b/TMessagesProj/src/main/assets/emoji/0_795.png index b3343ca22..a284ff83c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_795.png and b/TMessagesProj/src/main/assets/emoji/0_795.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_796.png b/TMessagesProj/src/main/assets/emoji/0_796.png index 7f3231aaa..d581b9463 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_796.png and b/TMessagesProj/src/main/assets/emoji/0_796.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_797.png b/TMessagesProj/src/main/assets/emoji/0_797.png index 66a389e0f..f5e24b499 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_797.png and b/TMessagesProj/src/main/assets/emoji/0_797.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_798.png b/TMessagesProj/src/main/assets/emoji/0_798.png index a26cf616e..240eb2989 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_798.png and b/TMessagesProj/src/main/assets/emoji/0_798.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_799.png b/TMessagesProj/src/main/assets/emoji/0_799.png index 031605faa..ecee680a5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_799.png and b/TMessagesProj/src/main/assets/emoji/0_799.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_8.png b/TMessagesProj/src/main/assets/emoji/0_8.png index 7ef040212..2b5dc2c9b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_8.png and b/TMessagesProj/src/main/assets/emoji/0_8.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_80.png b/TMessagesProj/src/main/assets/emoji/0_80.png index d8e3ec5b4..4382ba987 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_80.png and b/TMessagesProj/src/main/assets/emoji/0_80.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_800.png b/TMessagesProj/src/main/assets/emoji/0_800.png index 85bafaf20..b01819e9d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_800.png and b/TMessagesProj/src/main/assets/emoji/0_800.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_801.png b/TMessagesProj/src/main/assets/emoji/0_801.png index 67d9b32cc..b8676d1f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_801.png and b/TMessagesProj/src/main/assets/emoji/0_801.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_802.png b/TMessagesProj/src/main/assets/emoji/0_802.png index 17cbcde8c..fbe169ef9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_802.png and b/TMessagesProj/src/main/assets/emoji/0_802.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_803.png b/TMessagesProj/src/main/assets/emoji/0_803.png index d7efdaa4f..8b301f5fd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_803.png and b/TMessagesProj/src/main/assets/emoji/0_803.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_804.png b/TMessagesProj/src/main/assets/emoji/0_804.png index 98ea2a335..5a4fc51fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_804.png and b/TMessagesProj/src/main/assets/emoji/0_804.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_805.png b/TMessagesProj/src/main/assets/emoji/0_805.png index ef7d844b5..87c703d72 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_805.png and b/TMessagesProj/src/main/assets/emoji/0_805.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_806.png b/TMessagesProj/src/main/assets/emoji/0_806.png index a15d44e08..336d862f8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_806.png and b/TMessagesProj/src/main/assets/emoji/0_806.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_807.png b/TMessagesProj/src/main/assets/emoji/0_807.png index 8fdaeab0a..d01e2a07e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_807.png and b/TMessagesProj/src/main/assets/emoji/0_807.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_808.png b/TMessagesProj/src/main/assets/emoji/0_808.png index 30d939fb2..764715050 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_808.png and b/TMessagesProj/src/main/assets/emoji/0_808.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_809.png b/TMessagesProj/src/main/assets/emoji/0_809.png index 7b12748a3..2c5574638 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_809.png and b/TMessagesProj/src/main/assets/emoji/0_809.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_81.png b/TMessagesProj/src/main/assets/emoji/0_81.png index de1b70b59..d0aa0d9db 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_81.png and b/TMessagesProj/src/main/assets/emoji/0_81.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_810.png b/TMessagesProj/src/main/assets/emoji/0_810.png index 5a2ece30c..55c22e34e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_810.png and b/TMessagesProj/src/main/assets/emoji/0_810.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_811.png b/TMessagesProj/src/main/assets/emoji/0_811.png index b569adb2f..173813a12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_811.png and b/TMessagesProj/src/main/assets/emoji/0_811.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_812.png b/TMessagesProj/src/main/assets/emoji/0_812.png index 23e0daece..a4d85a7f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_812.png and b/TMessagesProj/src/main/assets/emoji/0_812.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_813.png b/TMessagesProj/src/main/assets/emoji/0_813.png index 20bc5084f..1528bee46 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_813.png and b/TMessagesProj/src/main/assets/emoji/0_813.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_814.png b/TMessagesProj/src/main/assets/emoji/0_814.png index 3a0dcf3ba..260ed8cca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_814.png and b/TMessagesProj/src/main/assets/emoji/0_814.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_815.png b/TMessagesProj/src/main/assets/emoji/0_815.png index 5d46066e1..47e689ac7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_815.png and b/TMessagesProj/src/main/assets/emoji/0_815.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_816.png b/TMessagesProj/src/main/assets/emoji/0_816.png index 69b89b956..d9ef358df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_816.png and b/TMessagesProj/src/main/assets/emoji/0_816.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_817.png b/TMessagesProj/src/main/assets/emoji/0_817.png index 65b5acda1..5ca4b65fe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_817.png and b/TMessagesProj/src/main/assets/emoji/0_817.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_818.png b/TMessagesProj/src/main/assets/emoji/0_818.png index 7b4f5b6e4..b2bce64bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_818.png and b/TMessagesProj/src/main/assets/emoji/0_818.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_819.png b/TMessagesProj/src/main/assets/emoji/0_819.png index 7ed489277..c365d1fa0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_819.png and b/TMessagesProj/src/main/assets/emoji/0_819.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_82.png b/TMessagesProj/src/main/assets/emoji/0_82.png index 72cde4f98..825987c2b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_82.png and b/TMessagesProj/src/main/assets/emoji/0_82.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_820.png b/TMessagesProj/src/main/assets/emoji/0_820.png index 77de7291c..b4ce2fe17 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_820.png and b/TMessagesProj/src/main/assets/emoji/0_820.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_821.png b/TMessagesProj/src/main/assets/emoji/0_821.png index cffa27600..2c41e61b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_821.png and b/TMessagesProj/src/main/assets/emoji/0_821.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_822.png b/TMessagesProj/src/main/assets/emoji/0_822.png index 539d3c56f..6ff8c4915 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_822.png and b/TMessagesProj/src/main/assets/emoji/0_822.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_823.png b/TMessagesProj/src/main/assets/emoji/0_823.png index 04c9d22b2..cca07b460 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_823.png and b/TMessagesProj/src/main/assets/emoji/0_823.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_824.png b/TMessagesProj/src/main/assets/emoji/0_824.png index e664ddf6a..396ee576c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_824.png and b/TMessagesProj/src/main/assets/emoji/0_824.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_825.png b/TMessagesProj/src/main/assets/emoji/0_825.png index 11fcb6cdd..68be65184 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_825.png and b/TMessagesProj/src/main/assets/emoji/0_825.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_826.png b/TMessagesProj/src/main/assets/emoji/0_826.png index 1d0e04be2..3968f456d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_826.png and b/TMessagesProj/src/main/assets/emoji/0_826.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_827.png b/TMessagesProj/src/main/assets/emoji/0_827.png index acca4c997..60e4ddc41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_827.png and b/TMessagesProj/src/main/assets/emoji/0_827.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_828.png b/TMessagesProj/src/main/assets/emoji/0_828.png index 3a8b52c6f..47db129c8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_828.png and b/TMessagesProj/src/main/assets/emoji/0_828.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_829.png b/TMessagesProj/src/main/assets/emoji/0_829.png index b4d9389bb..8f26acf2a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_829.png and b/TMessagesProj/src/main/assets/emoji/0_829.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_83.png b/TMessagesProj/src/main/assets/emoji/0_83.png index ea52d5156..d4eef2db5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_83.png and b/TMessagesProj/src/main/assets/emoji/0_83.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_830.png b/TMessagesProj/src/main/assets/emoji/0_830.png index e90f9ac7c..c5da98fe7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_830.png and b/TMessagesProj/src/main/assets/emoji/0_830.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_831.png b/TMessagesProj/src/main/assets/emoji/0_831.png index c4f30a112..8c759f0ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_831.png and b/TMessagesProj/src/main/assets/emoji/0_831.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_832.png b/TMessagesProj/src/main/assets/emoji/0_832.png index 2e187a356..b9977d42f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_832.png and b/TMessagesProj/src/main/assets/emoji/0_832.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_833.png b/TMessagesProj/src/main/assets/emoji/0_833.png index 1cab85bb7..f75713cbb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_833.png and b/TMessagesProj/src/main/assets/emoji/0_833.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_834.png b/TMessagesProj/src/main/assets/emoji/0_834.png index 3f2b6c187..583d4ff2f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_834.png and b/TMessagesProj/src/main/assets/emoji/0_834.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_835.png b/TMessagesProj/src/main/assets/emoji/0_835.png index 94aebf38f..a9c0627cc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_835.png and b/TMessagesProj/src/main/assets/emoji/0_835.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_836.png b/TMessagesProj/src/main/assets/emoji/0_836.png index 238a73ed9..42806170a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_836.png and b/TMessagesProj/src/main/assets/emoji/0_836.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_837.png b/TMessagesProj/src/main/assets/emoji/0_837.png index b41da590a..1d65aedd7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_837.png and b/TMessagesProj/src/main/assets/emoji/0_837.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_838.png b/TMessagesProj/src/main/assets/emoji/0_838.png index 29042b51e..18b0e4dbe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_838.png and b/TMessagesProj/src/main/assets/emoji/0_838.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_839.png b/TMessagesProj/src/main/assets/emoji/0_839.png index 5936daf00..f4ebe495d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_839.png and b/TMessagesProj/src/main/assets/emoji/0_839.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_84.png b/TMessagesProj/src/main/assets/emoji/0_84.png index eaa290cd7..248e2e40f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_84.png and b/TMessagesProj/src/main/assets/emoji/0_84.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_840.png b/TMessagesProj/src/main/assets/emoji/0_840.png index 26d687de0..55e28819a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_840.png and b/TMessagesProj/src/main/assets/emoji/0_840.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_841.png b/TMessagesProj/src/main/assets/emoji/0_841.png index 547e4dea3..03ea4ff37 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_841.png and b/TMessagesProj/src/main/assets/emoji/0_841.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_842.png b/TMessagesProj/src/main/assets/emoji/0_842.png index 18bf7c28c..46b3501b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_842.png and b/TMessagesProj/src/main/assets/emoji/0_842.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_843.png b/TMessagesProj/src/main/assets/emoji/0_843.png index 83277044f..935099e1a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_843.png and b/TMessagesProj/src/main/assets/emoji/0_843.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_844.png b/TMessagesProj/src/main/assets/emoji/0_844.png index 6d1241dfe..fec60ea97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_844.png and b/TMessagesProj/src/main/assets/emoji/0_844.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_845.png b/TMessagesProj/src/main/assets/emoji/0_845.png index 4c4335247..c317647b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_845.png and b/TMessagesProj/src/main/assets/emoji/0_845.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_846.png b/TMessagesProj/src/main/assets/emoji/0_846.png index b4d835459..4d60eb569 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_846.png and b/TMessagesProj/src/main/assets/emoji/0_846.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_847.png b/TMessagesProj/src/main/assets/emoji/0_847.png index 8af8fdb2d..c0ef9eaed 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_847.png and b/TMessagesProj/src/main/assets/emoji/0_847.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_848.png b/TMessagesProj/src/main/assets/emoji/0_848.png index 8e0359df9..bcb085431 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_848.png and b/TMessagesProj/src/main/assets/emoji/0_848.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_849.png b/TMessagesProj/src/main/assets/emoji/0_849.png index 704e2476d..9c464e775 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_849.png and b/TMessagesProj/src/main/assets/emoji/0_849.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_85.png b/TMessagesProj/src/main/assets/emoji/0_85.png index 571364026..e8970ec47 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_85.png and b/TMessagesProj/src/main/assets/emoji/0_85.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_850.png b/TMessagesProj/src/main/assets/emoji/0_850.png index 4ad822d6f..facd7d65c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_850.png and b/TMessagesProj/src/main/assets/emoji/0_850.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_851.png b/TMessagesProj/src/main/assets/emoji/0_851.png index 8b2085180..758bd9410 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_851.png and b/TMessagesProj/src/main/assets/emoji/0_851.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_852.png b/TMessagesProj/src/main/assets/emoji/0_852.png index ed4893af3..5b8367a37 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_852.png and b/TMessagesProj/src/main/assets/emoji/0_852.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_853.png b/TMessagesProj/src/main/assets/emoji/0_853.png index 036e1284c..d420e23ed 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_853.png and b/TMessagesProj/src/main/assets/emoji/0_853.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_854.png b/TMessagesProj/src/main/assets/emoji/0_854.png index de8332fd6..eb0aaa9d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_854.png and b/TMessagesProj/src/main/assets/emoji/0_854.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_855.png b/TMessagesProj/src/main/assets/emoji/0_855.png index 6bc3ee5e9..950323581 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_855.png and b/TMessagesProj/src/main/assets/emoji/0_855.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_856.png b/TMessagesProj/src/main/assets/emoji/0_856.png index 4f1d7ead9..cd9979b89 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_856.png and b/TMessagesProj/src/main/assets/emoji/0_856.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_857.png b/TMessagesProj/src/main/assets/emoji/0_857.png index 9843dd326..699921c5a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_857.png and b/TMessagesProj/src/main/assets/emoji/0_857.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_858.png b/TMessagesProj/src/main/assets/emoji/0_858.png index 63173561c..9592dbf32 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_858.png and b/TMessagesProj/src/main/assets/emoji/0_858.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_859.png b/TMessagesProj/src/main/assets/emoji/0_859.png index d5c20aa0d..68fa80d92 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_859.png and b/TMessagesProj/src/main/assets/emoji/0_859.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_86.png b/TMessagesProj/src/main/assets/emoji/0_86.png index 5ca02ffd1..0bef327d7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_86.png and b/TMessagesProj/src/main/assets/emoji/0_86.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_860.png b/TMessagesProj/src/main/assets/emoji/0_860.png index c038c5122..3e41b541c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_860.png and b/TMessagesProj/src/main/assets/emoji/0_860.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_861.png b/TMessagesProj/src/main/assets/emoji/0_861.png index 92e135e34..0811e658c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_861.png and b/TMessagesProj/src/main/assets/emoji/0_861.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_862.png b/TMessagesProj/src/main/assets/emoji/0_862.png index 8f9fa73d1..fdd45cac4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_862.png and b/TMessagesProj/src/main/assets/emoji/0_862.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_863.png b/TMessagesProj/src/main/assets/emoji/0_863.png index 60e7e78ce..3b73fa210 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_863.png and b/TMessagesProj/src/main/assets/emoji/0_863.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_864.png b/TMessagesProj/src/main/assets/emoji/0_864.png index 29e1dae04..572ed9af7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_864.png and b/TMessagesProj/src/main/assets/emoji/0_864.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_865.png b/TMessagesProj/src/main/assets/emoji/0_865.png index a186174c5..56e51d49c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_865.png and b/TMessagesProj/src/main/assets/emoji/0_865.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_866.png b/TMessagesProj/src/main/assets/emoji/0_866.png index 0183b292c..29fbb1b85 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_866.png and b/TMessagesProj/src/main/assets/emoji/0_866.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_867.png b/TMessagesProj/src/main/assets/emoji/0_867.png index 2ab42a75a..eb3281892 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_867.png and b/TMessagesProj/src/main/assets/emoji/0_867.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_868.png b/TMessagesProj/src/main/assets/emoji/0_868.png index 8d67add65..9ddfa3192 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_868.png and b/TMessagesProj/src/main/assets/emoji/0_868.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_869.png b/TMessagesProj/src/main/assets/emoji/0_869.png index e68dc2feb..a45e22b83 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_869.png and b/TMessagesProj/src/main/assets/emoji/0_869.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_87.png b/TMessagesProj/src/main/assets/emoji/0_87.png index adab8bd21..ced3b492b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_87.png and b/TMessagesProj/src/main/assets/emoji/0_87.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_870.png b/TMessagesProj/src/main/assets/emoji/0_870.png index 5d2ca2322..d20edd6ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_870.png and b/TMessagesProj/src/main/assets/emoji/0_870.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_871.png b/TMessagesProj/src/main/assets/emoji/0_871.png index 62aed36f7..5c7efaea7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_871.png and b/TMessagesProj/src/main/assets/emoji/0_871.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_872.png b/TMessagesProj/src/main/assets/emoji/0_872.png index f3ca118b8..4606b20f5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_872.png and b/TMessagesProj/src/main/assets/emoji/0_872.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_873.png b/TMessagesProj/src/main/assets/emoji/0_873.png index f95977634..a25e640d9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_873.png and b/TMessagesProj/src/main/assets/emoji/0_873.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_874.png b/TMessagesProj/src/main/assets/emoji/0_874.png index b0cd68e9e..8a0fda05d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_874.png and b/TMessagesProj/src/main/assets/emoji/0_874.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_875.png b/TMessagesProj/src/main/assets/emoji/0_875.png index 97e68ad2e..58b198dd3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_875.png and b/TMessagesProj/src/main/assets/emoji/0_875.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_876.png b/TMessagesProj/src/main/assets/emoji/0_876.png index 46a825e13..2e8c07737 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_876.png and b/TMessagesProj/src/main/assets/emoji/0_876.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_877.png b/TMessagesProj/src/main/assets/emoji/0_877.png index e6e902f62..15c2eda95 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_877.png and b/TMessagesProj/src/main/assets/emoji/0_877.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_878.png b/TMessagesProj/src/main/assets/emoji/0_878.png index 0dbb78982..5f2ec4760 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_878.png and b/TMessagesProj/src/main/assets/emoji/0_878.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_879.png b/TMessagesProj/src/main/assets/emoji/0_879.png index 0ba50ba0b..303fa8cee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_879.png and b/TMessagesProj/src/main/assets/emoji/0_879.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_88.png b/TMessagesProj/src/main/assets/emoji/0_88.png index dfaeb1040..82f13d517 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_88.png and b/TMessagesProj/src/main/assets/emoji/0_88.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_880.png b/TMessagesProj/src/main/assets/emoji/0_880.png index 175e349cf..1e4461731 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_880.png and b/TMessagesProj/src/main/assets/emoji/0_880.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_881.png b/TMessagesProj/src/main/assets/emoji/0_881.png index c8aeca811..a6bdf4e48 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_881.png and b/TMessagesProj/src/main/assets/emoji/0_881.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_882.png b/TMessagesProj/src/main/assets/emoji/0_882.png index 5f2ee4794..54dc2cf74 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_882.png and b/TMessagesProj/src/main/assets/emoji/0_882.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_883.png b/TMessagesProj/src/main/assets/emoji/0_883.png index 1b0fa6ee9..6012fcda8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_883.png and b/TMessagesProj/src/main/assets/emoji/0_883.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_884.png b/TMessagesProj/src/main/assets/emoji/0_884.png index 0f6e82016..ea9bab177 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_884.png and b/TMessagesProj/src/main/assets/emoji/0_884.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_885.png b/TMessagesProj/src/main/assets/emoji/0_885.png index 3b744838e..6ff236f6b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_885.png and b/TMessagesProj/src/main/assets/emoji/0_885.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_886.png b/TMessagesProj/src/main/assets/emoji/0_886.png index b96c76666..b56df9cc7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_886.png and b/TMessagesProj/src/main/assets/emoji/0_886.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_887.png b/TMessagesProj/src/main/assets/emoji/0_887.png index d573ac323..e7d2236fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_887.png and b/TMessagesProj/src/main/assets/emoji/0_887.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_888.png b/TMessagesProj/src/main/assets/emoji/0_888.png index 03e3c8962..b0ec7d60a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_888.png and b/TMessagesProj/src/main/assets/emoji/0_888.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_889.png b/TMessagesProj/src/main/assets/emoji/0_889.png index cbf6afb7f..1aaf72206 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_889.png and b/TMessagesProj/src/main/assets/emoji/0_889.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_89.png b/TMessagesProj/src/main/assets/emoji/0_89.png index 2dfcea616..8308c7ba0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_89.png and b/TMessagesProj/src/main/assets/emoji/0_89.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_890.png b/TMessagesProj/src/main/assets/emoji/0_890.png index 57cb67070..2a1a90a9b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_890.png and b/TMessagesProj/src/main/assets/emoji/0_890.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_891.png b/TMessagesProj/src/main/assets/emoji/0_891.png index ad06e2df0..c18050ae7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_891.png and b/TMessagesProj/src/main/assets/emoji/0_891.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_892.png b/TMessagesProj/src/main/assets/emoji/0_892.png index c6f1e8f04..cd3911ebc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_892.png and b/TMessagesProj/src/main/assets/emoji/0_892.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_893.png b/TMessagesProj/src/main/assets/emoji/0_893.png index 3218e6741..ad437ce75 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_893.png and b/TMessagesProj/src/main/assets/emoji/0_893.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_894.png b/TMessagesProj/src/main/assets/emoji/0_894.png index 6f3d024e4..e9affdb45 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_894.png and b/TMessagesProj/src/main/assets/emoji/0_894.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_895.png b/TMessagesProj/src/main/assets/emoji/0_895.png index 92cff2e7f..c81dfe15d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_895.png and b/TMessagesProj/src/main/assets/emoji/0_895.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_896.png b/TMessagesProj/src/main/assets/emoji/0_896.png index 3f0b89b0c..fde448be3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_896.png and b/TMessagesProj/src/main/assets/emoji/0_896.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_897.png b/TMessagesProj/src/main/assets/emoji/0_897.png index c5c71fa6e..56f2c96e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_897.png and b/TMessagesProj/src/main/assets/emoji/0_897.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_898.png b/TMessagesProj/src/main/assets/emoji/0_898.png index a5492ac7e..0cec1e1c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_898.png and b/TMessagesProj/src/main/assets/emoji/0_898.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_899.png b/TMessagesProj/src/main/assets/emoji/0_899.png index 06b94e57c..0aaf7af06 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_899.png and b/TMessagesProj/src/main/assets/emoji/0_899.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_9.png b/TMessagesProj/src/main/assets/emoji/0_9.png index aaa18d47f..a599ec073 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_9.png and b/TMessagesProj/src/main/assets/emoji/0_9.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_90.png b/TMessagesProj/src/main/assets/emoji/0_90.png index aa5f62703..e6a8aebe5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_90.png and b/TMessagesProj/src/main/assets/emoji/0_90.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_900.png b/TMessagesProj/src/main/assets/emoji/0_900.png index a6ea34c67..ecb185a12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_900.png and b/TMessagesProj/src/main/assets/emoji/0_900.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_901.png b/TMessagesProj/src/main/assets/emoji/0_901.png index 627afed6a..a77eb1a3d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_901.png and b/TMessagesProj/src/main/assets/emoji/0_901.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_902.png b/TMessagesProj/src/main/assets/emoji/0_902.png index c91a22e07..9183f9a28 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_902.png and b/TMessagesProj/src/main/assets/emoji/0_902.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_903.png b/TMessagesProj/src/main/assets/emoji/0_903.png index 6c5c54507..4e0508010 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_903.png and b/TMessagesProj/src/main/assets/emoji/0_903.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_904.png b/TMessagesProj/src/main/assets/emoji/0_904.png index 56a649e00..fcc41520a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_904.png and b/TMessagesProj/src/main/assets/emoji/0_904.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_905.png b/TMessagesProj/src/main/assets/emoji/0_905.png index c4af08f04..3c09fa052 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_905.png and b/TMessagesProj/src/main/assets/emoji/0_905.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_906.png b/TMessagesProj/src/main/assets/emoji/0_906.png index ff5c51363..d60833b4a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_906.png and b/TMessagesProj/src/main/assets/emoji/0_906.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_907.png b/TMessagesProj/src/main/assets/emoji/0_907.png index 57fcd7bc3..e8d0ea409 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_907.png and b/TMessagesProj/src/main/assets/emoji/0_907.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_908.png b/TMessagesProj/src/main/assets/emoji/0_908.png index 29105f22d..7e975a323 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_908.png and b/TMessagesProj/src/main/assets/emoji/0_908.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_909.png b/TMessagesProj/src/main/assets/emoji/0_909.png index aa7ab2d4a..52843e4ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_909.png and b/TMessagesProj/src/main/assets/emoji/0_909.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_91.png b/TMessagesProj/src/main/assets/emoji/0_91.png index f899ac924..868b90ca4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_91.png and b/TMessagesProj/src/main/assets/emoji/0_91.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_910.png b/TMessagesProj/src/main/assets/emoji/0_910.png index 82c6ac962..97c17162e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_910.png and b/TMessagesProj/src/main/assets/emoji/0_910.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_911.png b/TMessagesProj/src/main/assets/emoji/0_911.png index 217f8ce02..bef67e1d9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_911.png and b/TMessagesProj/src/main/assets/emoji/0_911.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_912.png b/TMessagesProj/src/main/assets/emoji/0_912.png index f703f3dd3..2f5e16897 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_912.png and b/TMessagesProj/src/main/assets/emoji/0_912.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_913.png b/TMessagesProj/src/main/assets/emoji/0_913.png index 1bce9710b..21f6a1956 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_913.png and b/TMessagesProj/src/main/assets/emoji/0_913.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_914.png b/TMessagesProj/src/main/assets/emoji/0_914.png index 9cc10de83..2da882d1d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_914.png and b/TMessagesProj/src/main/assets/emoji/0_914.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_915.png b/TMessagesProj/src/main/assets/emoji/0_915.png index 809cc611c..0008399a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_915.png and b/TMessagesProj/src/main/assets/emoji/0_915.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_916.png b/TMessagesProj/src/main/assets/emoji/0_916.png index ba28449e1..ec5cee146 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_916.png and b/TMessagesProj/src/main/assets/emoji/0_916.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_917.png b/TMessagesProj/src/main/assets/emoji/0_917.png index a6424c0c8..8bf9d1a61 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_917.png and b/TMessagesProj/src/main/assets/emoji/0_917.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_918.png b/TMessagesProj/src/main/assets/emoji/0_918.png index 480af9c2f..61b709e53 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_918.png and b/TMessagesProj/src/main/assets/emoji/0_918.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_919.png b/TMessagesProj/src/main/assets/emoji/0_919.png index d00a9878c..6d8fb59f1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_919.png and b/TMessagesProj/src/main/assets/emoji/0_919.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_92.png b/TMessagesProj/src/main/assets/emoji/0_92.png index 4f7836cc2..8822f4e54 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_92.png and b/TMessagesProj/src/main/assets/emoji/0_92.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_920.png b/TMessagesProj/src/main/assets/emoji/0_920.png index 7d6901afb..006dd8c46 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_920.png and b/TMessagesProj/src/main/assets/emoji/0_920.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_921.png b/TMessagesProj/src/main/assets/emoji/0_921.png index 119ac4231..7f0f3fb2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_921.png and b/TMessagesProj/src/main/assets/emoji/0_921.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_922.png b/TMessagesProj/src/main/assets/emoji/0_922.png index 301c283ff..a58ebecd8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_922.png and b/TMessagesProj/src/main/assets/emoji/0_922.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_923.png b/TMessagesProj/src/main/assets/emoji/0_923.png index fb940c716..398e76c66 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_923.png and b/TMessagesProj/src/main/assets/emoji/0_923.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_924.png b/TMessagesProj/src/main/assets/emoji/0_924.png index 1c1e37d13..b84cdfb53 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_924.png and b/TMessagesProj/src/main/assets/emoji/0_924.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_925.png b/TMessagesProj/src/main/assets/emoji/0_925.png index b8cd74e6f..3e4ff13b7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_925.png and b/TMessagesProj/src/main/assets/emoji/0_925.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_926.png b/TMessagesProj/src/main/assets/emoji/0_926.png index 71dddf64a..5bad9537d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_926.png and b/TMessagesProj/src/main/assets/emoji/0_926.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_927.png b/TMessagesProj/src/main/assets/emoji/0_927.png index 982ae4110..dfb4f35c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_927.png and b/TMessagesProj/src/main/assets/emoji/0_927.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_928.png b/TMessagesProj/src/main/assets/emoji/0_928.png index eff103d68..d8f07a3c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_928.png and b/TMessagesProj/src/main/assets/emoji/0_928.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_929.png b/TMessagesProj/src/main/assets/emoji/0_929.png index 687c5b742..17200be8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_929.png and b/TMessagesProj/src/main/assets/emoji/0_929.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_93.png b/TMessagesProj/src/main/assets/emoji/0_93.png index 15a241c48..d4c76178f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_93.png and b/TMessagesProj/src/main/assets/emoji/0_93.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_930.png b/TMessagesProj/src/main/assets/emoji/0_930.png index 3a1082732..a29ad8a15 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_930.png and b/TMessagesProj/src/main/assets/emoji/0_930.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_931.png b/TMessagesProj/src/main/assets/emoji/0_931.png index eb797d0f5..84fb677c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_931.png and b/TMessagesProj/src/main/assets/emoji/0_931.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_932.png b/TMessagesProj/src/main/assets/emoji/0_932.png index ba7d2ab8a..ad0e9b1d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_932.png and b/TMessagesProj/src/main/assets/emoji/0_932.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_933.png b/TMessagesProj/src/main/assets/emoji/0_933.png index 182743edd..a7a42d96e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_933.png and b/TMessagesProj/src/main/assets/emoji/0_933.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_934.png b/TMessagesProj/src/main/assets/emoji/0_934.png index e37002b9d..07cfd70da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_934.png and b/TMessagesProj/src/main/assets/emoji/0_934.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_935.png b/TMessagesProj/src/main/assets/emoji/0_935.png index 191a70209..75dc81b6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_935.png and b/TMessagesProj/src/main/assets/emoji/0_935.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_936.png b/TMessagesProj/src/main/assets/emoji/0_936.png index af00bb38b..b53408780 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_936.png and b/TMessagesProj/src/main/assets/emoji/0_936.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_937.png b/TMessagesProj/src/main/assets/emoji/0_937.png index 76b7595f7..ef8fba95b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_937.png and b/TMessagesProj/src/main/assets/emoji/0_937.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_938.png b/TMessagesProj/src/main/assets/emoji/0_938.png index 7f991d63e..2bcf809ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_938.png and b/TMessagesProj/src/main/assets/emoji/0_938.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_939.png b/TMessagesProj/src/main/assets/emoji/0_939.png index 7d7cdf99e..d1777f1c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_939.png and b/TMessagesProj/src/main/assets/emoji/0_939.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_94.png b/TMessagesProj/src/main/assets/emoji/0_94.png index 927369a9e..d5337fee4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_94.png and b/TMessagesProj/src/main/assets/emoji/0_94.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_940.png b/TMessagesProj/src/main/assets/emoji/0_940.png index 39d6a2c15..7def7684f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_940.png and b/TMessagesProj/src/main/assets/emoji/0_940.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_941.png b/TMessagesProj/src/main/assets/emoji/0_941.png index ddac83ce6..4c5c89e2a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_941.png and b/TMessagesProj/src/main/assets/emoji/0_941.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_942.png b/TMessagesProj/src/main/assets/emoji/0_942.png index 1d275daa5..79fdced1a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_942.png and b/TMessagesProj/src/main/assets/emoji/0_942.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_943.png b/TMessagesProj/src/main/assets/emoji/0_943.png index f240af2bb..2e3eae9d7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_943.png and b/TMessagesProj/src/main/assets/emoji/0_943.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_944.png b/TMessagesProj/src/main/assets/emoji/0_944.png index a61ebd30a..65028176e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_944.png and b/TMessagesProj/src/main/assets/emoji/0_944.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_945.png b/TMessagesProj/src/main/assets/emoji/0_945.png index 7aa6d5d0e..e6e8ff101 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_945.png and b/TMessagesProj/src/main/assets/emoji/0_945.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_946.png b/TMessagesProj/src/main/assets/emoji/0_946.png index 4c9683d91..06d87dc67 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_946.png and b/TMessagesProj/src/main/assets/emoji/0_946.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_947.png b/TMessagesProj/src/main/assets/emoji/0_947.png index c091df6ec..74edff61d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_947.png and b/TMessagesProj/src/main/assets/emoji/0_947.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_948.png b/TMessagesProj/src/main/assets/emoji/0_948.png index b369951f0..239ce7697 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_948.png and b/TMessagesProj/src/main/assets/emoji/0_948.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_949.png b/TMessagesProj/src/main/assets/emoji/0_949.png index a33699f8b..bd488be2a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_949.png and b/TMessagesProj/src/main/assets/emoji/0_949.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_95.png b/TMessagesProj/src/main/assets/emoji/0_95.png index feb9573eb..3ac9926fb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_95.png and b/TMessagesProj/src/main/assets/emoji/0_95.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_950.png b/TMessagesProj/src/main/assets/emoji/0_950.png index ec700c63b..edf2f7c9d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_950.png and b/TMessagesProj/src/main/assets/emoji/0_950.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_951.png b/TMessagesProj/src/main/assets/emoji/0_951.png index 6a1bc71d3..8e906aa97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_951.png and b/TMessagesProj/src/main/assets/emoji/0_951.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_952.png b/TMessagesProj/src/main/assets/emoji/0_952.png index 8041f0a3e..c5aff46e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_952.png and b/TMessagesProj/src/main/assets/emoji/0_952.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_953.png b/TMessagesProj/src/main/assets/emoji/0_953.png index 1e4bbe4b7..efa1d48ec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_953.png and b/TMessagesProj/src/main/assets/emoji/0_953.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_954.png b/TMessagesProj/src/main/assets/emoji/0_954.png index 155ccf14b..540088665 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_954.png and b/TMessagesProj/src/main/assets/emoji/0_954.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_955.png b/TMessagesProj/src/main/assets/emoji/0_955.png index 22c4b2543..b880daca7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_955.png and b/TMessagesProj/src/main/assets/emoji/0_955.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_956.png b/TMessagesProj/src/main/assets/emoji/0_956.png index 49c64af12..98bb02c99 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_956.png and b/TMessagesProj/src/main/assets/emoji/0_956.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_957.png b/TMessagesProj/src/main/assets/emoji/0_957.png index c9181120e..7dbe4010e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_957.png and b/TMessagesProj/src/main/assets/emoji/0_957.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_958.png b/TMessagesProj/src/main/assets/emoji/0_958.png index c7860dfd5..32df26862 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_958.png and b/TMessagesProj/src/main/assets/emoji/0_958.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_959.png b/TMessagesProj/src/main/assets/emoji/0_959.png index 68f68d83e..67d45eff3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_959.png and b/TMessagesProj/src/main/assets/emoji/0_959.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_96.png b/TMessagesProj/src/main/assets/emoji/0_96.png index 6165b2f6c..9b6bcbccf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_96.png and b/TMessagesProj/src/main/assets/emoji/0_96.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_960.png b/TMessagesProj/src/main/assets/emoji/0_960.png index 9274b9af8..89ab63d20 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_960.png and b/TMessagesProj/src/main/assets/emoji/0_960.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_961.png b/TMessagesProj/src/main/assets/emoji/0_961.png index c8c14fbc9..e4b241ac7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_961.png and b/TMessagesProj/src/main/assets/emoji/0_961.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_962.png b/TMessagesProj/src/main/assets/emoji/0_962.png index c7adba3d1..5a6e20352 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_962.png and b/TMessagesProj/src/main/assets/emoji/0_962.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_963.png b/TMessagesProj/src/main/assets/emoji/0_963.png index d37f62f73..052ff9dc1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_963.png and b/TMessagesProj/src/main/assets/emoji/0_963.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_964.png b/TMessagesProj/src/main/assets/emoji/0_964.png index 3a926a5b7..f9d506db0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_964.png and b/TMessagesProj/src/main/assets/emoji/0_964.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_965.png b/TMessagesProj/src/main/assets/emoji/0_965.png index ba2f27664..1e8b67130 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_965.png and b/TMessagesProj/src/main/assets/emoji/0_965.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_966.png b/TMessagesProj/src/main/assets/emoji/0_966.png index da309a91a..85e1681f9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_966.png and b/TMessagesProj/src/main/assets/emoji/0_966.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_967.png b/TMessagesProj/src/main/assets/emoji/0_967.png index 02ff5e467..8de7334ca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_967.png and b/TMessagesProj/src/main/assets/emoji/0_967.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_968.png b/TMessagesProj/src/main/assets/emoji/0_968.png index b7d34c25b..953b0d1a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_968.png and b/TMessagesProj/src/main/assets/emoji/0_968.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_969.png b/TMessagesProj/src/main/assets/emoji/0_969.png index d1dca0634..ab0ba5403 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_969.png and b/TMessagesProj/src/main/assets/emoji/0_969.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_97.png b/TMessagesProj/src/main/assets/emoji/0_97.png index 0216572b6..ba56b208e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_97.png and b/TMessagesProj/src/main/assets/emoji/0_97.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_970.png b/TMessagesProj/src/main/assets/emoji/0_970.png index c23647a44..70f131b7c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_970.png and b/TMessagesProj/src/main/assets/emoji/0_970.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_971.png b/TMessagesProj/src/main/assets/emoji/0_971.png index 794805d52..b2b18e163 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_971.png and b/TMessagesProj/src/main/assets/emoji/0_971.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_972.png b/TMessagesProj/src/main/assets/emoji/0_972.png index 09f6041f9..3201431b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_972.png and b/TMessagesProj/src/main/assets/emoji/0_972.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_973.png b/TMessagesProj/src/main/assets/emoji/0_973.png index 8bf1ec5f6..e0beb7814 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_973.png and b/TMessagesProj/src/main/assets/emoji/0_973.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_974.png b/TMessagesProj/src/main/assets/emoji/0_974.png index 732ffb1e7..b6ff90abe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_974.png and b/TMessagesProj/src/main/assets/emoji/0_974.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_975.png b/TMessagesProj/src/main/assets/emoji/0_975.png index 7dfce6e29..005290361 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_975.png and b/TMessagesProj/src/main/assets/emoji/0_975.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_976.png b/TMessagesProj/src/main/assets/emoji/0_976.png index 2fe0c4b99..526d67a72 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_976.png and b/TMessagesProj/src/main/assets/emoji/0_976.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_977.png b/TMessagesProj/src/main/assets/emoji/0_977.png index 5ba006e4c..1e4599416 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_977.png and b/TMessagesProj/src/main/assets/emoji/0_977.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_978.png b/TMessagesProj/src/main/assets/emoji/0_978.png index cc71aee13..232577d12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_978.png and b/TMessagesProj/src/main/assets/emoji/0_978.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_979.png b/TMessagesProj/src/main/assets/emoji/0_979.png index e40398a91..bfdb938c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_979.png and b/TMessagesProj/src/main/assets/emoji/0_979.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_98.png b/TMessagesProj/src/main/assets/emoji/0_98.png index 5c8a55d39..6949113af 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_98.png and b/TMessagesProj/src/main/assets/emoji/0_98.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_980.png b/TMessagesProj/src/main/assets/emoji/0_980.png index ddabb9b6a..2927f8895 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_980.png and b/TMessagesProj/src/main/assets/emoji/0_980.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_981.png b/TMessagesProj/src/main/assets/emoji/0_981.png index 5922a70ca..fe599a16c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_981.png and b/TMessagesProj/src/main/assets/emoji/0_981.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_982.png b/TMessagesProj/src/main/assets/emoji/0_982.png index f16740f49..d23164f02 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_982.png and b/TMessagesProj/src/main/assets/emoji/0_982.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_983.png b/TMessagesProj/src/main/assets/emoji/0_983.png index d14a7ae40..9e74e79a4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_983.png and b/TMessagesProj/src/main/assets/emoji/0_983.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_984.png b/TMessagesProj/src/main/assets/emoji/0_984.png index a9370560f..8585d5ecf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_984.png and b/TMessagesProj/src/main/assets/emoji/0_984.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_985.png b/TMessagesProj/src/main/assets/emoji/0_985.png index b8c235570..d89481c8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_985.png and b/TMessagesProj/src/main/assets/emoji/0_985.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_986.png b/TMessagesProj/src/main/assets/emoji/0_986.png index f1dc933f8..d83c5883e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_986.png and b/TMessagesProj/src/main/assets/emoji/0_986.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_987.png b/TMessagesProj/src/main/assets/emoji/0_987.png index a6ecea550..621e5fff6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_987.png and b/TMessagesProj/src/main/assets/emoji/0_987.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_988.png b/TMessagesProj/src/main/assets/emoji/0_988.png index 0fb6cb86b..0ceca9309 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_988.png and b/TMessagesProj/src/main/assets/emoji/0_988.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_989.png b/TMessagesProj/src/main/assets/emoji/0_989.png index cdf31e226..1fdda6eac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_989.png and b/TMessagesProj/src/main/assets/emoji/0_989.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_99.png b/TMessagesProj/src/main/assets/emoji/0_99.png index a33b3c320..1fe30d11f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_99.png and b/TMessagesProj/src/main/assets/emoji/0_99.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_990.png b/TMessagesProj/src/main/assets/emoji/0_990.png index f7da903cb..beab91361 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_990.png and b/TMessagesProj/src/main/assets/emoji/0_990.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_991.png b/TMessagesProj/src/main/assets/emoji/0_991.png index fbb0128a8..fc970f55b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_991.png and b/TMessagesProj/src/main/assets/emoji/0_991.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_992.png b/TMessagesProj/src/main/assets/emoji/0_992.png index 87a9490ba..82befd039 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_992.png and b/TMessagesProj/src/main/assets/emoji/0_992.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_993.png b/TMessagesProj/src/main/assets/emoji/0_993.png index e7d01bf95..6fe4e8d12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_993.png and b/TMessagesProj/src/main/assets/emoji/0_993.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_994.png b/TMessagesProj/src/main/assets/emoji/0_994.png index ae0f2786f..3839c21e4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_994.png and b/TMessagesProj/src/main/assets/emoji/0_994.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_995.png b/TMessagesProj/src/main/assets/emoji/0_995.png index 273754648..5cbfad1c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_995.png and b/TMessagesProj/src/main/assets/emoji/0_995.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_996.png b/TMessagesProj/src/main/assets/emoji/0_996.png index 3fd647cbf..4f02fe709 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_996.png and b/TMessagesProj/src/main/assets/emoji/0_996.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_997.png b/TMessagesProj/src/main/assets/emoji/0_997.png index bb58a495a..e5d71ae3e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_997.png and b/TMessagesProj/src/main/assets/emoji/0_997.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_998.png b/TMessagesProj/src/main/assets/emoji/0_998.png index e446b4698..0eb806281 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_998.png and b/TMessagesProj/src/main/assets/emoji/0_998.png differ diff --git a/TMessagesProj/src/main/assets/emoji/0_999.png b/TMessagesProj/src/main/assets/emoji/0_999.png index fe05b2abd..741ea257e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/0_999.png and b/TMessagesProj/src/main/assets/emoji/0_999.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_0.png b/TMessagesProj/src/main/assets/emoji/1_0.png index 5f7a1fdbb..c711c45d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_0.png and b/TMessagesProj/src/main/assets/emoji/1_0.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_1.png b/TMessagesProj/src/main/assets/emoji/1_1.png index 02d834974..688ecf206 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_1.png and b/TMessagesProj/src/main/assets/emoji/1_1.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_10.png b/TMessagesProj/src/main/assets/emoji/1_10.png index 342f75c17..e66592575 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_10.png and b/TMessagesProj/src/main/assets/emoji/1_10.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_100.png b/TMessagesProj/src/main/assets/emoji/1_100.png index b9e2ca4fa..840945315 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_100.png and b/TMessagesProj/src/main/assets/emoji/1_100.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_101.png b/TMessagesProj/src/main/assets/emoji/1_101.png index 74354f73b..4afdafaff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_101.png and b/TMessagesProj/src/main/assets/emoji/1_101.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_102.png b/TMessagesProj/src/main/assets/emoji/1_102.png index b034a16c0..f68dc6d87 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_102.png and b/TMessagesProj/src/main/assets/emoji/1_102.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_103.png b/TMessagesProj/src/main/assets/emoji/1_103.png index 9e21b07f6..75adb21a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_103.png and b/TMessagesProj/src/main/assets/emoji/1_103.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_104.png b/TMessagesProj/src/main/assets/emoji/1_104.png index 9cc268b18..03f9d73ab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_104.png and b/TMessagesProj/src/main/assets/emoji/1_104.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_105.png b/TMessagesProj/src/main/assets/emoji/1_105.png index 052efe3b5..c344a3a65 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_105.png and b/TMessagesProj/src/main/assets/emoji/1_105.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_106.png b/TMessagesProj/src/main/assets/emoji/1_106.png index b5fffcc90..6ac35d6a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_106.png and b/TMessagesProj/src/main/assets/emoji/1_106.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_107.png b/TMessagesProj/src/main/assets/emoji/1_107.png index 8bb358880..1b54476d6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_107.png and b/TMessagesProj/src/main/assets/emoji/1_107.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_108.png b/TMessagesProj/src/main/assets/emoji/1_108.png index 20c56068f..9f26a5416 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_108.png and b/TMessagesProj/src/main/assets/emoji/1_108.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_109.png b/TMessagesProj/src/main/assets/emoji/1_109.png index f60c4ce9a..c71029970 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_109.png and b/TMessagesProj/src/main/assets/emoji/1_109.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_11.png b/TMessagesProj/src/main/assets/emoji/1_11.png index 6b2106c7a..ef44c376e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_11.png and b/TMessagesProj/src/main/assets/emoji/1_11.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_110.png b/TMessagesProj/src/main/assets/emoji/1_110.png index 271bebdfe..27d6e872f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_110.png and b/TMessagesProj/src/main/assets/emoji/1_110.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_111.png b/TMessagesProj/src/main/assets/emoji/1_111.png index eaca0fe1e..c60834207 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_111.png and b/TMessagesProj/src/main/assets/emoji/1_111.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_112.png b/TMessagesProj/src/main/assets/emoji/1_112.png index a7a2fe4d5..a785d5b4e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_112.png and b/TMessagesProj/src/main/assets/emoji/1_112.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_113.png b/TMessagesProj/src/main/assets/emoji/1_113.png index 845212cf8..d5ce662cc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_113.png and b/TMessagesProj/src/main/assets/emoji/1_113.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_114.png b/TMessagesProj/src/main/assets/emoji/1_114.png index 268c3b1c1..ef1d04e31 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_114.png and b/TMessagesProj/src/main/assets/emoji/1_114.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_115.png b/TMessagesProj/src/main/assets/emoji/1_115.png index 7a3e1433b..f6a1c5a1f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_115.png and b/TMessagesProj/src/main/assets/emoji/1_115.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_116.png b/TMessagesProj/src/main/assets/emoji/1_116.png index b64a54fcb..c0de88fc6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_116.png and b/TMessagesProj/src/main/assets/emoji/1_116.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_117.png b/TMessagesProj/src/main/assets/emoji/1_117.png index 6ee27e5ca..78884b6fa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_117.png and b/TMessagesProj/src/main/assets/emoji/1_117.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_118.png b/TMessagesProj/src/main/assets/emoji/1_118.png index ed1037955..aa7e0c303 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_118.png and b/TMessagesProj/src/main/assets/emoji/1_118.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_119.png b/TMessagesProj/src/main/assets/emoji/1_119.png index 550ab82ee..0c88efcda 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_119.png and b/TMessagesProj/src/main/assets/emoji/1_119.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_12.png b/TMessagesProj/src/main/assets/emoji/1_12.png index d644afa0e..16f407897 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_12.png and b/TMessagesProj/src/main/assets/emoji/1_12.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_120.png b/TMessagesProj/src/main/assets/emoji/1_120.png index cf97bdd81..46fa4d12e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_120.png and b/TMessagesProj/src/main/assets/emoji/1_120.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_121.png b/TMessagesProj/src/main/assets/emoji/1_121.png index 01a246753..22c6eae26 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_121.png and b/TMessagesProj/src/main/assets/emoji/1_121.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_122.png b/TMessagesProj/src/main/assets/emoji/1_122.png index 4c8062d36..06cfd3224 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_122.png and b/TMessagesProj/src/main/assets/emoji/1_122.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_123.png b/TMessagesProj/src/main/assets/emoji/1_123.png index 3438fbcb6..c90e19fa3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_123.png and b/TMessagesProj/src/main/assets/emoji/1_123.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_124.png b/TMessagesProj/src/main/assets/emoji/1_124.png index 08bdecf3b..f27cd3b03 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_124.png and b/TMessagesProj/src/main/assets/emoji/1_124.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_125.png b/TMessagesProj/src/main/assets/emoji/1_125.png index b4edbb054..cab0dc78d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_125.png and b/TMessagesProj/src/main/assets/emoji/1_125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_126.png b/TMessagesProj/src/main/assets/emoji/1_126.png index bd67c3f1c..eb323e08e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_126.png and b/TMessagesProj/src/main/assets/emoji/1_126.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_127.png b/TMessagesProj/src/main/assets/emoji/1_127.png index d6827294c..a0a40b5a5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_127.png and b/TMessagesProj/src/main/assets/emoji/1_127.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_128.png b/TMessagesProj/src/main/assets/emoji/1_128.png index 6f611a2cb..f9507335c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_128.png and b/TMessagesProj/src/main/assets/emoji/1_128.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_129.png b/TMessagesProj/src/main/assets/emoji/1_129.png index 04789dccc..9ded55493 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_129.png and b/TMessagesProj/src/main/assets/emoji/1_129.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_13.png b/TMessagesProj/src/main/assets/emoji/1_13.png index 759c142fa..bf9b5761e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_13.png and b/TMessagesProj/src/main/assets/emoji/1_13.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_130.png b/TMessagesProj/src/main/assets/emoji/1_130.png index 54319f9fe..a0e957118 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_130.png and b/TMessagesProj/src/main/assets/emoji/1_130.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_131.png b/TMessagesProj/src/main/assets/emoji/1_131.png index 87107d0e4..b6469b19c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_131.png and b/TMessagesProj/src/main/assets/emoji/1_131.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_132.png b/TMessagesProj/src/main/assets/emoji/1_132.png index 5d9617a36..566065784 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_132.png and b/TMessagesProj/src/main/assets/emoji/1_132.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_133.png b/TMessagesProj/src/main/assets/emoji/1_133.png index bbf17758e..80efb6907 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_133.png and b/TMessagesProj/src/main/assets/emoji/1_133.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_134.png b/TMessagesProj/src/main/assets/emoji/1_134.png index 882e0c11e..4fc5d3c0b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_134.png and b/TMessagesProj/src/main/assets/emoji/1_134.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_135.png b/TMessagesProj/src/main/assets/emoji/1_135.png index 07c458239..09028b8a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_135.png and b/TMessagesProj/src/main/assets/emoji/1_135.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_136.png b/TMessagesProj/src/main/assets/emoji/1_136.png index d45d2e8be..731f6915a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_136.png and b/TMessagesProj/src/main/assets/emoji/1_136.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_137.png b/TMessagesProj/src/main/assets/emoji/1_137.png index aa5c49bcc..fca58e9ba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_137.png and b/TMessagesProj/src/main/assets/emoji/1_137.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_138.png b/TMessagesProj/src/main/assets/emoji/1_138.png index 9a6a344db..dd28c209d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_138.png and b/TMessagesProj/src/main/assets/emoji/1_138.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_139.png b/TMessagesProj/src/main/assets/emoji/1_139.png index 59701285c..e1ed9359a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_139.png and b/TMessagesProj/src/main/assets/emoji/1_139.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_14.png b/TMessagesProj/src/main/assets/emoji/1_14.png index 7dc6460f1..f8fffe762 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_14.png and b/TMessagesProj/src/main/assets/emoji/1_14.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_140.png b/TMessagesProj/src/main/assets/emoji/1_140.png index 1b7ea1afb..47748374b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_140.png and b/TMessagesProj/src/main/assets/emoji/1_140.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_141.png b/TMessagesProj/src/main/assets/emoji/1_141.png index 129e184da..9eb0de902 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_141.png and b/TMessagesProj/src/main/assets/emoji/1_141.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_142.png b/TMessagesProj/src/main/assets/emoji/1_142.png index e6647d9a3..60f2dede5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_142.png and b/TMessagesProj/src/main/assets/emoji/1_142.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_143.png b/TMessagesProj/src/main/assets/emoji/1_143.png index a572d22a9..aa6d75b8c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_143.png and b/TMessagesProj/src/main/assets/emoji/1_143.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_144.png b/TMessagesProj/src/main/assets/emoji/1_144.png index 6295b6d8e..712139595 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_144.png and b/TMessagesProj/src/main/assets/emoji/1_144.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_145.png b/TMessagesProj/src/main/assets/emoji/1_145.png index d8f540b9e..d3c824913 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_145.png and b/TMessagesProj/src/main/assets/emoji/1_145.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_146.png b/TMessagesProj/src/main/assets/emoji/1_146.png index 2af23c0d5..87d3ab1da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_146.png and b/TMessagesProj/src/main/assets/emoji/1_146.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_147.png b/TMessagesProj/src/main/assets/emoji/1_147.png index 342aabb1c..956162c12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_147.png and b/TMessagesProj/src/main/assets/emoji/1_147.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_148.png b/TMessagesProj/src/main/assets/emoji/1_148.png index 52f0abb2f..e44bfb2a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_148.png and b/TMessagesProj/src/main/assets/emoji/1_148.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_149.png b/TMessagesProj/src/main/assets/emoji/1_149.png index 4cda31af5..74293a844 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_149.png and b/TMessagesProj/src/main/assets/emoji/1_149.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_15.png b/TMessagesProj/src/main/assets/emoji/1_15.png index 0f42c5424..ec34a28bd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_15.png and b/TMessagesProj/src/main/assets/emoji/1_15.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_150.png b/TMessagesProj/src/main/assets/emoji/1_150.png index 6f06a3761..ad18f6b6b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_150.png and b/TMessagesProj/src/main/assets/emoji/1_150.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_151.png b/TMessagesProj/src/main/assets/emoji/1_151.png index ea25b61eb..0d875745d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_151.png and b/TMessagesProj/src/main/assets/emoji/1_151.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_152.png b/TMessagesProj/src/main/assets/emoji/1_152.png index ef8772e22..5bbf70939 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_152.png and b/TMessagesProj/src/main/assets/emoji/1_152.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_153.png b/TMessagesProj/src/main/assets/emoji/1_153.png index 06e509736..0db3d9bbf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_153.png and b/TMessagesProj/src/main/assets/emoji/1_153.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_154.png b/TMessagesProj/src/main/assets/emoji/1_154.png index c391815e4..8a1be1b42 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_154.png and b/TMessagesProj/src/main/assets/emoji/1_154.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_155.png b/TMessagesProj/src/main/assets/emoji/1_155.png index f4a981d8d..2fe30ec80 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_155.png and b/TMessagesProj/src/main/assets/emoji/1_155.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_156.png b/TMessagesProj/src/main/assets/emoji/1_156.png index af082213b..9b5dcb111 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_156.png and b/TMessagesProj/src/main/assets/emoji/1_156.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_157.png b/TMessagesProj/src/main/assets/emoji/1_157.png index b3bf10ed5..0e11841e9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_157.png and b/TMessagesProj/src/main/assets/emoji/1_157.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_158.png b/TMessagesProj/src/main/assets/emoji/1_158.png index b874a256f..16273bae8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_158.png and b/TMessagesProj/src/main/assets/emoji/1_158.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_159.png b/TMessagesProj/src/main/assets/emoji/1_159.png index f951cfe5e..c9f604bb1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_159.png and b/TMessagesProj/src/main/assets/emoji/1_159.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_16.png b/TMessagesProj/src/main/assets/emoji/1_16.png index 170c15cee..2a5673e4a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_16.png and b/TMessagesProj/src/main/assets/emoji/1_16.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_160.png b/TMessagesProj/src/main/assets/emoji/1_160.png index e4f26603b..83a7d05fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_160.png and b/TMessagesProj/src/main/assets/emoji/1_160.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_161.png b/TMessagesProj/src/main/assets/emoji/1_161.png index 06c58b3d9..0891e1b04 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_161.png and b/TMessagesProj/src/main/assets/emoji/1_161.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_162.png b/TMessagesProj/src/main/assets/emoji/1_162.png index 8f18e937a..fd13bf7e1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_162.png and b/TMessagesProj/src/main/assets/emoji/1_162.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_163.png b/TMessagesProj/src/main/assets/emoji/1_163.png index c5fa1930f..ec1750cc9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_163.png and b/TMessagesProj/src/main/assets/emoji/1_163.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_164.png b/TMessagesProj/src/main/assets/emoji/1_164.png index 375eaf2e2..f35509ece 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_164.png and b/TMessagesProj/src/main/assets/emoji/1_164.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_165.png b/TMessagesProj/src/main/assets/emoji/1_165.png index 5740612c0..6f485c989 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_165.png and b/TMessagesProj/src/main/assets/emoji/1_165.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_166.png b/TMessagesProj/src/main/assets/emoji/1_166.png index 4b9cdfdf8..6ed18a05c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_166.png and b/TMessagesProj/src/main/assets/emoji/1_166.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_167.png b/TMessagesProj/src/main/assets/emoji/1_167.png index 98b7ff73f..00e1002bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_167.png and b/TMessagesProj/src/main/assets/emoji/1_167.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_168.png b/TMessagesProj/src/main/assets/emoji/1_168.png index 8f1128e1d..fbf0feca1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_168.png and b/TMessagesProj/src/main/assets/emoji/1_168.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_169.png b/TMessagesProj/src/main/assets/emoji/1_169.png index 787540451..2148ef198 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_169.png and b/TMessagesProj/src/main/assets/emoji/1_169.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_17.png b/TMessagesProj/src/main/assets/emoji/1_17.png index d1f5446cd..2a3159abc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_17.png and b/TMessagesProj/src/main/assets/emoji/1_17.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_170.png b/TMessagesProj/src/main/assets/emoji/1_170.png index df8f1db38..6a8e53af8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_170.png and b/TMessagesProj/src/main/assets/emoji/1_170.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_171.png b/TMessagesProj/src/main/assets/emoji/1_171.png index c749094de..29ec5c484 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_171.png and b/TMessagesProj/src/main/assets/emoji/1_171.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_172.png b/TMessagesProj/src/main/assets/emoji/1_172.png index cd37e27cf..04bcf30ae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_172.png and b/TMessagesProj/src/main/assets/emoji/1_172.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_173.png b/TMessagesProj/src/main/assets/emoji/1_173.png index 55d296cf8..d0ac3ee29 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_173.png and b/TMessagesProj/src/main/assets/emoji/1_173.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_174.png b/TMessagesProj/src/main/assets/emoji/1_174.png index f786c2628..e52a39bed 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_174.png and b/TMessagesProj/src/main/assets/emoji/1_174.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_175.png b/TMessagesProj/src/main/assets/emoji/1_175.png index b1ab0cf74..59dedfc7a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_175.png and b/TMessagesProj/src/main/assets/emoji/1_175.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_176.png b/TMessagesProj/src/main/assets/emoji/1_176.png index 440dc9379..6ac0154ec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_176.png and b/TMessagesProj/src/main/assets/emoji/1_176.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_177.png b/TMessagesProj/src/main/assets/emoji/1_177.png index d8a7dca72..08c8a5af7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_177.png and b/TMessagesProj/src/main/assets/emoji/1_177.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_178.png b/TMessagesProj/src/main/assets/emoji/1_178.png index 5e63ccab2..29833e393 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_178.png and b/TMessagesProj/src/main/assets/emoji/1_178.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_179.png b/TMessagesProj/src/main/assets/emoji/1_179.png index f1725d451..63ccd9a0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_179.png and b/TMessagesProj/src/main/assets/emoji/1_179.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_18.png b/TMessagesProj/src/main/assets/emoji/1_18.png index 618aef35a..1260a9ef2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_18.png and b/TMessagesProj/src/main/assets/emoji/1_18.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_180.png b/TMessagesProj/src/main/assets/emoji/1_180.png index c86124dfd..0e9e86172 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_180.png and b/TMessagesProj/src/main/assets/emoji/1_180.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_181.png b/TMessagesProj/src/main/assets/emoji/1_181.png index a8ee3574c..94380e0f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_181.png and b/TMessagesProj/src/main/assets/emoji/1_181.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_182.png b/TMessagesProj/src/main/assets/emoji/1_182.png index df48e72b6..e2f082518 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_182.png and b/TMessagesProj/src/main/assets/emoji/1_182.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_183.png b/TMessagesProj/src/main/assets/emoji/1_183.png index cbf05eae1..30eaca683 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_183.png and b/TMessagesProj/src/main/assets/emoji/1_183.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_184.png b/TMessagesProj/src/main/assets/emoji/1_184.png index ff09d0b2d..55507eb73 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_184.png and b/TMessagesProj/src/main/assets/emoji/1_184.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_185.png b/TMessagesProj/src/main/assets/emoji/1_185.png index 617a3b77a..cd08f575a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_185.png and b/TMessagesProj/src/main/assets/emoji/1_185.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_186.png b/TMessagesProj/src/main/assets/emoji/1_186.png index 4bc74d155..ab06d1b3c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_186.png and b/TMessagesProj/src/main/assets/emoji/1_186.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_187.png b/TMessagesProj/src/main/assets/emoji/1_187.png index 9530d191d..5fe72aa17 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_187.png and b/TMessagesProj/src/main/assets/emoji/1_187.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_188.png b/TMessagesProj/src/main/assets/emoji/1_188.png index d5e10b4d5..a4017c2cc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_188.png and b/TMessagesProj/src/main/assets/emoji/1_188.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_189.png b/TMessagesProj/src/main/assets/emoji/1_189.png index 7c932eca4..fcc7713b4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_189.png and b/TMessagesProj/src/main/assets/emoji/1_189.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_19.png b/TMessagesProj/src/main/assets/emoji/1_19.png index faf945ab2..4d1d3ba55 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_19.png and b/TMessagesProj/src/main/assets/emoji/1_19.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_190.png b/TMessagesProj/src/main/assets/emoji/1_190.png index abe79ae7c..1d7912734 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_190.png and b/TMessagesProj/src/main/assets/emoji/1_190.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_191.png b/TMessagesProj/src/main/assets/emoji/1_191.png index be8802949..97aea5a25 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_191.png and b/TMessagesProj/src/main/assets/emoji/1_191.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_192.png b/TMessagesProj/src/main/assets/emoji/1_192.png index b9d05f836..25dca9d00 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_192.png and b/TMessagesProj/src/main/assets/emoji/1_192.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_193.png b/TMessagesProj/src/main/assets/emoji/1_193.png index ecec20fad..d2de806d9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_193.png and b/TMessagesProj/src/main/assets/emoji/1_193.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_194.png b/TMessagesProj/src/main/assets/emoji/1_194.png index 7ea8d4eb5..b6fc163f5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_194.png and b/TMessagesProj/src/main/assets/emoji/1_194.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_195.png b/TMessagesProj/src/main/assets/emoji/1_195.png index affae43c4..701d28a1c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_195.png and b/TMessagesProj/src/main/assets/emoji/1_195.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_196.png b/TMessagesProj/src/main/assets/emoji/1_196.png index d0845b6ef..53f901342 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_196.png and b/TMessagesProj/src/main/assets/emoji/1_196.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_197.png b/TMessagesProj/src/main/assets/emoji/1_197.png index 244e94705..12e0eac41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_197.png and b/TMessagesProj/src/main/assets/emoji/1_197.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_198.png b/TMessagesProj/src/main/assets/emoji/1_198.png index ff0968a0a..e27add41a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_198.png and b/TMessagesProj/src/main/assets/emoji/1_198.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_199.png b/TMessagesProj/src/main/assets/emoji/1_199.png index 58d93c258..4f7bf02a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_199.png and b/TMessagesProj/src/main/assets/emoji/1_199.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_2.png b/TMessagesProj/src/main/assets/emoji/1_2.png index df96d00b1..96f46f87b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_2.png and b/TMessagesProj/src/main/assets/emoji/1_2.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_20.png b/TMessagesProj/src/main/assets/emoji/1_20.png index 427766899..4e7ebcccd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_20.png and b/TMessagesProj/src/main/assets/emoji/1_20.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_200.png b/TMessagesProj/src/main/assets/emoji/1_200.png index 4b1b975a0..908d71e62 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_200.png and b/TMessagesProj/src/main/assets/emoji/1_200.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_201.png b/TMessagesProj/src/main/assets/emoji/1_201.png index 5bf8b5215..46c55de64 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_201.png and b/TMessagesProj/src/main/assets/emoji/1_201.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_202.png b/TMessagesProj/src/main/assets/emoji/1_202.png index ffa4d7fca..839817fe5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_202.png and b/TMessagesProj/src/main/assets/emoji/1_202.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_203.png b/TMessagesProj/src/main/assets/emoji/1_203.png index 1fbd39698..559857e2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_203.png and b/TMessagesProj/src/main/assets/emoji/1_203.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_204.png b/TMessagesProj/src/main/assets/emoji/1_204.png index 9ed5b6c48..ac6a5ab3f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_204.png and b/TMessagesProj/src/main/assets/emoji/1_204.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_205.png b/TMessagesProj/src/main/assets/emoji/1_205.png index 2505f22b1..68c5c98d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_205.png and b/TMessagesProj/src/main/assets/emoji/1_205.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_206.png b/TMessagesProj/src/main/assets/emoji/1_206.png index 32f70e348..acf0cee6b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_206.png and b/TMessagesProj/src/main/assets/emoji/1_206.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_207.png b/TMessagesProj/src/main/assets/emoji/1_207.png index 17f0b9f8d..8ebb65bd9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_207.png and b/TMessagesProj/src/main/assets/emoji/1_207.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_208.png b/TMessagesProj/src/main/assets/emoji/1_208.png index d606b1398..2eccd455a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_208.png and b/TMessagesProj/src/main/assets/emoji/1_208.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_209.png b/TMessagesProj/src/main/assets/emoji/1_209.png index 43cac5ed2..be72e94b0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_209.png and b/TMessagesProj/src/main/assets/emoji/1_209.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_21.png b/TMessagesProj/src/main/assets/emoji/1_21.png index 9656c4378..aae9d2810 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_21.png and b/TMessagesProj/src/main/assets/emoji/1_21.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_210.png b/TMessagesProj/src/main/assets/emoji/1_210.png index d6b49f371..8c5b0a134 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_210.png and b/TMessagesProj/src/main/assets/emoji/1_210.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_211.png b/TMessagesProj/src/main/assets/emoji/1_211.png new file mode 100644 index 000000000..a3654b1f8 Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/1_211.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_212.png b/TMessagesProj/src/main/assets/emoji/1_212.png new file mode 100644 index 000000000..daee9f6d0 Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/1_212.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_22.png b/TMessagesProj/src/main/assets/emoji/1_22.png index 682a8bdae..b21ce62c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_22.png and b/TMessagesProj/src/main/assets/emoji/1_22.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_23.png b/TMessagesProj/src/main/assets/emoji/1_23.png index fae635d33..6a656776e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_23.png and b/TMessagesProj/src/main/assets/emoji/1_23.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_24.png b/TMessagesProj/src/main/assets/emoji/1_24.png index 2004c8176..8e3a8d086 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_24.png and b/TMessagesProj/src/main/assets/emoji/1_24.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_25.png b/TMessagesProj/src/main/assets/emoji/1_25.png index 1c4338a61..2f9af9634 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_25.png and b/TMessagesProj/src/main/assets/emoji/1_25.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_26.png b/TMessagesProj/src/main/assets/emoji/1_26.png index 02e8f3fb8..119404ade 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_26.png and b/TMessagesProj/src/main/assets/emoji/1_26.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_27.png b/TMessagesProj/src/main/assets/emoji/1_27.png index 0f345afe6..7731d4c0b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_27.png and b/TMessagesProj/src/main/assets/emoji/1_27.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_28.png b/TMessagesProj/src/main/assets/emoji/1_28.png index 9a47f3eee..651a1a534 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_28.png and b/TMessagesProj/src/main/assets/emoji/1_28.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_29.png b/TMessagesProj/src/main/assets/emoji/1_29.png index 81a920c63..5c0f888c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_29.png and b/TMessagesProj/src/main/assets/emoji/1_29.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_3.png b/TMessagesProj/src/main/assets/emoji/1_3.png index 9f0c6efc0..e62f8a2af 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_3.png and b/TMessagesProj/src/main/assets/emoji/1_3.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_30.png b/TMessagesProj/src/main/assets/emoji/1_30.png index 43a3a6f8c..880fd451f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_30.png and b/TMessagesProj/src/main/assets/emoji/1_30.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_31.png b/TMessagesProj/src/main/assets/emoji/1_31.png index b4593912b..a562e468a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_31.png and b/TMessagesProj/src/main/assets/emoji/1_31.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_32.png b/TMessagesProj/src/main/assets/emoji/1_32.png index be726cc9f..315e394da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_32.png and b/TMessagesProj/src/main/assets/emoji/1_32.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_33.png b/TMessagesProj/src/main/assets/emoji/1_33.png index 70c2b8963..e4b131d23 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_33.png and b/TMessagesProj/src/main/assets/emoji/1_33.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_34.png b/TMessagesProj/src/main/assets/emoji/1_34.png index 2b28d7fb2..d534d2291 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_34.png and b/TMessagesProj/src/main/assets/emoji/1_34.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_35.png b/TMessagesProj/src/main/assets/emoji/1_35.png index bd75c5e6d..05b22f935 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_35.png and b/TMessagesProj/src/main/assets/emoji/1_35.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_36.png b/TMessagesProj/src/main/assets/emoji/1_36.png index 76a322a42..fff2102d6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_36.png and b/TMessagesProj/src/main/assets/emoji/1_36.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_37.png b/TMessagesProj/src/main/assets/emoji/1_37.png index 69198bc9f..3d0ddf7bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_37.png and b/TMessagesProj/src/main/assets/emoji/1_37.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_38.png b/TMessagesProj/src/main/assets/emoji/1_38.png index 7d27869e1..b05596ecc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_38.png and b/TMessagesProj/src/main/assets/emoji/1_38.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_39.png b/TMessagesProj/src/main/assets/emoji/1_39.png index 33f40f972..3a510b0cb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_39.png and b/TMessagesProj/src/main/assets/emoji/1_39.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_4.png b/TMessagesProj/src/main/assets/emoji/1_4.png index 277a4aa8a..3804bba29 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_4.png and b/TMessagesProj/src/main/assets/emoji/1_4.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_40.png b/TMessagesProj/src/main/assets/emoji/1_40.png index 2a9520ee1..2ccf7bd63 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_40.png and b/TMessagesProj/src/main/assets/emoji/1_40.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_41.png b/TMessagesProj/src/main/assets/emoji/1_41.png index bbec0c2ec..a70761a5c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_41.png and b/TMessagesProj/src/main/assets/emoji/1_41.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_42.png b/TMessagesProj/src/main/assets/emoji/1_42.png index c89b5106d..ecc52d85a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_42.png and b/TMessagesProj/src/main/assets/emoji/1_42.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_43.png b/TMessagesProj/src/main/assets/emoji/1_43.png index 7474baf3b..5eb25ee97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_43.png and b/TMessagesProj/src/main/assets/emoji/1_43.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_44.png b/TMessagesProj/src/main/assets/emoji/1_44.png index be048d03e..05030a730 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_44.png and b/TMessagesProj/src/main/assets/emoji/1_44.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_45.png b/TMessagesProj/src/main/assets/emoji/1_45.png index 61c2f1253..2d8e5cb5e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_45.png and b/TMessagesProj/src/main/assets/emoji/1_45.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_46.png b/TMessagesProj/src/main/assets/emoji/1_46.png index 1d94a7422..ecdb442ec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_46.png and b/TMessagesProj/src/main/assets/emoji/1_46.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_47.png b/TMessagesProj/src/main/assets/emoji/1_47.png index 8f93a5623..0550a0f9d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_47.png and b/TMessagesProj/src/main/assets/emoji/1_47.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_48.png b/TMessagesProj/src/main/assets/emoji/1_48.png index 8230419e4..e3e4dd4c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_48.png and b/TMessagesProj/src/main/assets/emoji/1_48.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_49.png b/TMessagesProj/src/main/assets/emoji/1_49.png index 0adb766ac..5602c295b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_49.png and b/TMessagesProj/src/main/assets/emoji/1_49.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_5.png b/TMessagesProj/src/main/assets/emoji/1_5.png index 14807c1b7..1374c891b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_5.png and b/TMessagesProj/src/main/assets/emoji/1_5.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_50.png b/TMessagesProj/src/main/assets/emoji/1_50.png index f216d43a1..893cc6ec3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_50.png and b/TMessagesProj/src/main/assets/emoji/1_50.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_51.png b/TMessagesProj/src/main/assets/emoji/1_51.png index 4c33a3399..f063b98c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_51.png and b/TMessagesProj/src/main/assets/emoji/1_51.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_52.png b/TMessagesProj/src/main/assets/emoji/1_52.png index d78996e1a..1592137f9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_52.png and b/TMessagesProj/src/main/assets/emoji/1_52.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_53.png b/TMessagesProj/src/main/assets/emoji/1_53.png index 180b04826..168b12f37 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_53.png and b/TMessagesProj/src/main/assets/emoji/1_53.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_54.png b/TMessagesProj/src/main/assets/emoji/1_54.png index e9d68aaa1..fc62eb39e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_54.png and b/TMessagesProj/src/main/assets/emoji/1_54.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_55.png b/TMessagesProj/src/main/assets/emoji/1_55.png index d14938b2d..cac87d1c5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_55.png and b/TMessagesProj/src/main/assets/emoji/1_55.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_56.png b/TMessagesProj/src/main/assets/emoji/1_56.png index e8f8d8e3f..8843259a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_56.png and b/TMessagesProj/src/main/assets/emoji/1_56.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_57.png b/TMessagesProj/src/main/assets/emoji/1_57.png index 0fa14c16a..4fb66c5df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_57.png and b/TMessagesProj/src/main/assets/emoji/1_57.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_58.png b/TMessagesProj/src/main/assets/emoji/1_58.png index 175d43606..b3c30c0c9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_58.png and b/TMessagesProj/src/main/assets/emoji/1_58.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_59.png b/TMessagesProj/src/main/assets/emoji/1_59.png index 348d8600a..98e69983a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_59.png and b/TMessagesProj/src/main/assets/emoji/1_59.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_6.png b/TMessagesProj/src/main/assets/emoji/1_6.png index 100bc3cfc..226e8e76c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_6.png and b/TMessagesProj/src/main/assets/emoji/1_6.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_60.png b/TMessagesProj/src/main/assets/emoji/1_60.png index cf87e514b..2925b8371 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_60.png and b/TMessagesProj/src/main/assets/emoji/1_60.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_61.png b/TMessagesProj/src/main/assets/emoji/1_61.png index 157fca59e..1fe1f7053 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_61.png and b/TMessagesProj/src/main/assets/emoji/1_61.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_62.png b/TMessagesProj/src/main/assets/emoji/1_62.png index 671213974..c3a81a3dd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_62.png and b/TMessagesProj/src/main/assets/emoji/1_62.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_63.png b/TMessagesProj/src/main/assets/emoji/1_63.png index 04b76cd1a..cb474dd91 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_63.png and b/TMessagesProj/src/main/assets/emoji/1_63.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_64.png b/TMessagesProj/src/main/assets/emoji/1_64.png index 4ec11ac0d..53cc00ff2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_64.png and b/TMessagesProj/src/main/assets/emoji/1_64.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_65.png b/TMessagesProj/src/main/assets/emoji/1_65.png index 34faa681c..16224845b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_65.png and b/TMessagesProj/src/main/assets/emoji/1_65.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_66.png b/TMessagesProj/src/main/assets/emoji/1_66.png index d1ea0a1b0..4e8e9ee2d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_66.png and b/TMessagesProj/src/main/assets/emoji/1_66.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_67.png b/TMessagesProj/src/main/assets/emoji/1_67.png index 7293073e4..847eaf47e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_67.png and b/TMessagesProj/src/main/assets/emoji/1_67.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_68.png b/TMessagesProj/src/main/assets/emoji/1_68.png index 89c70819b..3851c11ca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_68.png and b/TMessagesProj/src/main/assets/emoji/1_68.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_69.png b/TMessagesProj/src/main/assets/emoji/1_69.png index db0ba331f..c94b350af 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_69.png and b/TMessagesProj/src/main/assets/emoji/1_69.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_7.png b/TMessagesProj/src/main/assets/emoji/1_7.png index 62e160e6e..c18613256 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_7.png and b/TMessagesProj/src/main/assets/emoji/1_7.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_70.png b/TMessagesProj/src/main/assets/emoji/1_70.png index 2551e5955..c49b172f7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_70.png and b/TMessagesProj/src/main/assets/emoji/1_70.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_71.png b/TMessagesProj/src/main/assets/emoji/1_71.png index a565a1ab3..5678a6c9c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_71.png and b/TMessagesProj/src/main/assets/emoji/1_71.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_72.png b/TMessagesProj/src/main/assets/emoji/1_72.png index 159553da5..5d445a4d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_72.png and b/TMessagesProj/src/main/assets/emoji/1_72.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_73.png b/TMessagesProj/src/main/assets/emoji/1_73.png index ecd256ff6..5979690c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_73.png and b/TMessagesProj/src/main/assets/emoji/1_73.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_74.png b/TMessagesProj/src/main/assets/emoji/1_74.png index 22c6d2b6c..b966c82f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_74.png and b/TMessagesProj/src/main/assets/emoji/1_74.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_75.png b/TMessagesProj/src/main/assets/emoji/1_75.png index bb1b3392f..e4fb014f7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_75.png and b/TMessagesProj/src/main/assets/emoji/1_75.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_76.png b/TMessagesProj/src/main/assets/emoji/1_76.png index 029a9c84e..e124e60c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_76.png and b/TMessagesProj/src/main/assets/emoji/1_76.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_77.png b/TMessagesProj/src/main/assets/emoji/1_77.png index ed65385a0..7cc71b659 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_77.png and b/TMessagesProj/src/main/assets/emoji/1_77.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_78.png b/TMessagesProj/src/main/assets/emoji/1_78.png index 8d8fedd6f..77e5bd7e8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_78.png and b/TMessagesProj/src/main/assets/emoji/1_78.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_79.png b/TMessagesProj/src/main/assets/emoji/1_79.png index 847dbbedc..c0e1b04b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_79.png and b/TMessagesProj/src/main/assets/emoji/1_79.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_8.png b/TMessagesProj/src/main/assets/emoji/1_8.png index a7d8783e8..9090ccb93 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_8.png and b/TMessagesProj/src/main/assets/emoji/1_8.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_80.png b/TMessagesProj/src/main/assets/emoji/1_80.png index 099e53f88..2856fb0ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_80.png and b/TMessagesProj/src/main/assets/emoji/1_80.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_81.png b/TMessagesProj/src/main/assets/emoji/1_81.png index 0fd34aa31..0741b9c8e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_81.png and b/TMessagesProj/src/main/assets/emoji/1_81.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_82.png b/TMessagesProj/src/main/assets/emoji/1_82.png index bae2d80c3..085cecd46 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_82.png and b/TMessagesProj/src/main/assets/emoji/1_82.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_83.png b/TMessagesProj/src/main/assets/emoji/1_83.png index a04fa225e..02befa291 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_83.png and b/TMessagesProj/src/main/assets/emoji/1_83.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_84.png b/TMessagesProj/src/main/assets/emoji/1_84.png index 60ae0d748..7bb10fae0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_84.png and b/TMessagesProj/src/main/assets/emoji/1_84.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_85.png b/TMessagesProj/src/main/assets/emoji/1_85.png index ae2f12515..9da5574dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_85.png and b/TMessagesProj/src/main/assets/emoji/1_85.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_86.png b/TMessagesProj/src/main/assets/emoji/1_86.png index a2f3a35c2..f9fe21de2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_86.png and b/TMessagesProj/src/main/assets/emoji/1_86.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_87.png b/TMessagesProj/src/main/assets/emoji/1_87.png index e5bb3e361..694da7c74 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_87.png and b/TMessagesProj/src/main/assets/emoji/1_87.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_88.png b/TMessagesProj/src/main/assets/emoji/1_88.png index 43d320c73..a9a9e8a0c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_88.png and b/TMessagesProj/src/main/assets/emoji/1_88.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_89.png b/TMessagesProj/src/main/assets/emoji/1_89.png index 9d43535d0..fe5e3a2ae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_89.png and b/TMessagesProj/src/main/assets/emoji/1_89.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_9.png b/TMessagesProj/src/main/assets/emoji/1_9.png index 7233c3a41..8100387c9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_9.png and b/TMessagesProj/src/main/assets/emoji/1_9.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_90.png b/TMessagesProj/src/main/assets/emoji/1_90.png index 08ed23405..75e8766de 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_90.png and b/TMessagesProj/src/main/assets/emoji/1_90.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_91.png b/TMessagesProj/src/main/assets/emoji/1_91.png index e010b305c..7c0d70626 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_91.png and b/TMessagesProj/src/main/assets/emoji/1_91.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_92.png b/TMessagesProj/src/main/assets/emoji/1_92.png index 5ef68d15a..cddf62bfd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_92.png and b/TMessagesProj/src/main/assets/emoji/1_92.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_93.png b/TMessagesProj/src/main/assets/emoji/1_93.png index 51af9b118..ca0292df1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_93.png and b/TMessagesProj/src/main/assets/emoji/1_93.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_94.png b/TMessagesProj/src/main/assets/emoji/1_94.png index 9beca0017..5e1cdd9c0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_94.png and b/TMessagesProj/src/main/assets/emoji/1_94.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_95.png b/TMessagesProj/src/main/assets/emoji/1_95.png index e45a93e2e..9118525a1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_95.png and b/TMessagesProj/src/main/assets/emoji/1_95.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_96.png b/TMessagesProj/src/main/assets/emoji/1_96.png index 936a27381..22f32ec9a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_96.png and b/TMessagesProj/src/main/assets/emoji/1_96.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_97.png b/TMessagesProj/src/main/assets/emoji/1_97.png index aa32c6c2d..40f5933b3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_97.png and b/TMessagesProj/src/main/assets/emoji/1_97.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_98.png b/TMessagesProj/src/main/assets/emoji/1_98.png index 428522566..890772d08 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_98.png and b/TMessagesProj/src/main/assets/emoji/1_98.png differ diff --git a/TMessagesProj/src/main/assets/emoji/1_99.png b/TMessagesProj/src/main/assets/emoji/1_99.png index c5a7fdfbe..99615e1d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/1_99.png and b/TMessagesProj/src/main/assets/emoji/1_99.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_0.png b/TMessagesProj/src/main/assets/emoji/2_0.png index baa1cda87..b8983c814 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_0.png and b/TMessagesProj/src/main/assets/emoji/2_0.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_1.png b/TMessagesProj/src/main/assets/emoji/2_1.png index 599d03721..1c749ffa7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_1.png and b/TMessagesProj/src/main/assets/emoji/2_1.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_10.png b/TMessagesProj/src/main/assets/emoji/2_10.png index f6dd84d05..bb5a0b167 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_10.png and b/TMessagesProj/src/main/assets/emoji/2_10.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_100.png b/TMessagesProj/src/main/assets/emoji/2_100.png index 9865cb472..e0c7ce0a4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_100.png and b/TMessagesProj/src/main/assets/emoji/2_100.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_101.png b/TMessagesProj/src/main/assets/emoji/2_101.png index 951920aa6..85ef44eba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_101.png and b/TMessagesProj/src/main/assets/emoji/2_101.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_102.png b/TMessagesProj/src/main/assets/emoji/2_102.png index a5bd1b5f3..9d5754150 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_102.png and b/TMessagesProj/src/main/assets/emoji/2_102.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_103.png b/TMessagesProj/src/main/assets/emoji/2_103.png index 865024e19..841e0df49 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_103.png and b/TMessagesProj/src/main/assets/emoji/2_103.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_104.png b/TMessagesProj/src/main/assets/emoji/2_104.png index ca6de53b9..85dcacdd7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_104.png and b/TMessagesProj/src/main/assets/emoji/2_104.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_105.png b/TMessagesProj/src/main/assets/emoji/2_105.png index 2b7891202..5fb5d91d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_105.png and b/TMessagesProj/src/main/assets/emoji/2_105.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_106.png b/TMessagesProj/src/main/assets/emoji/2_106.png index 3d05bb15f..23e8e2087 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_106.png and b/TMessagesProj/src/main/assets/emoji/2_106.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_107.png b/TMessagesProj/src/main/assets/emoji/2_107.png index 80fee3013..a46e6a805 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_107.png and b/TMessagesProj/src/main/assets/emoji/2_107.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_108.png b/TMessagesProj/src/main/assets/emoji/2_108.png index 22f56a955..3cc41ae96 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_108.png and b/TMessagesProj/src/main/assets/emoji/2_108.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_109.png b/TMessagesProj/src/main/assets/emoji/2_109.png index edb749d91..5cbd7ee3b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_109.png and b/TMessagesProj/src/main/assets/emoji/2_109.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_11.png b/TMessagesProj/src/main/assets/emoji/2_11.png index acaa17583..7e2e1bbae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_11.png and b/TMessagesProj/src/main/assets/emoji/2_11.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_110.png b/TMessagesProj/src/main/assets/emoji/2_110.png index 8d7c90bf7..543e141ea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_110.png and b/TMessagesProj/src/main/assets/emoji/2_110.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_111.png b/TMessagesProj/src/main/assets/emoji/2_111.png index 9730a9a06..07b3fb806 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_111.png and b/TMessagesProj/src/main/assets/emoji/2_111.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_112.png b/TMessagesProj/src/main/assets/emoji/2_112.png index 960d0a119..bdcc78944 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_112.png and b/TMessagesProj/src/main/assets/emoji/2_112.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_113.png b/TMessagesProj/src/main/assets/emoji/2_113.png index 69a1ddd1f..94e4f6d7b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_113.png and b/TMessagesProj/src/main/assets/emoji/2_113.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_114.png b/TMessagesProj/src/main/assets/emoji/2_114.png index dd28f1d69..b131a2c26 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_114.png and b/TMessagesProj/src/main/assets/emoji/2_114.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_115.png b/TMessagesProj/src/main/assets/emoji/2_115.png index 0a1858e45..416226dfe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_115.png and b/TMessagesProj/src/main/assets/emoji/2_115.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_116.png b/TMessagesProj/src/main/assets/emoji/2_116.png index 3a919526a..85a4ef3bd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_116.png and b/TMessagesProj/src/main/assets/emoji/2_116.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_117.png b/TMessagesProj/src/main/assets/emoji/2_117.png index 8b573a8ee..f1ad06b67 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_117.png and b/TMessagesProj/src/main/assets/emoji/2_117.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_118.png b/TMessagesProj/src/main/assets/emoji/2_118.png index a7774aa48..2aa17dbf0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_118.png and b/TMessagesProj/src/main/assets/emoji/2_118.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_119.png b/TMessagesProj/src/main/assets/emoji/2_119.png index 8b3ac4874..5eea14242 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_119.png and b/TMessagesProj/src/main/assets/emoji/2_119.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_12.png b/TMessagesProj/src/main/assets/emoji/2_12.png index b36887cfa..201c42c5d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_12.png and b/TMessagesProj/src/main/assets/emoji/2_12.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_120.png b/TMessagesProj/src/main/assets/emoji/2_120.png index c80efe27d..7d9673d4d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_120.png and b/TMessagesProj/src/main/assets/emoji/2_120.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_121.png b/TMessagesProj/src/main/assets/emoji/2_121.png index 3d2652080..c9f5d68a9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_121.png and b/TMessagesProj/src/main/assets/emoji/2_121.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_122.png b/TMessagesProj/src/main/assets/emoji/2_122.png index d6a25fc59..50f338d79 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_122.png and b/TMessagesProj/src/main/assets/emoji/2_122.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_123.png b/TMessagesProj/src/main/assets/emoji/2_123.png index ad9597d13..c41e6d776 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_123.png and b/TMessagesProj/src/main/assets/emoji/2_123.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_124.png b/TMessagesProj/src/main/assets/emoji/2_124.png index c01ec35b0..f6e20d1ed 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_124.png and b/TMessagesProj/src/main/assets/emoji/2_124.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_125.png b/TMessagesProj/src/main/assets/emoji/2_125.png index aa27d816b..6e793ecb0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_125.png and b/TMessagesProj/src/main/assets/emoji/2_125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_126.png b/TMessagesProj/src/main/assets/emoji/2_126.png index 6b433ae87..e76ea1c00 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_126.png and b/TMessagesProj/src/main/assets/emoji/2_126.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_127.png b/TMessagesProj/src/main/assets/emoji/2_127.png index 9663f6df8..a892790e8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_127.png and b/TMessagesProj/src/main/assets/emoji/2_127.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_128.png b/TMessagesProj/src/main/assets/emoji/2_128.png new file mode 100644 index 000000000..d57f83c6f Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/2_128.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_13.png b/TMessagesProj/src/main/assets/emoji/2_13.png index f9c9f0674..1149d114e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_13.png and b/TMessagesProj/src/main/assets/emoji/2_13.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_14.png b/TMessagesProj/src/main/assets/emoji/2_14.png index 7e195a91c..03b87d09d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_14.png and b/TMessagesProj/src/main/assets/emoji/2_14.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_15.png b/TMessagesProj/src/main/assets/emoji/2_15.png index bbaa6f4bf..13e7b4360 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_15.png and b/TMessagesProj/src/main/assets/emoji/2_15.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_16.png b/TMessagesProj/src/main/assets/emoji/2_16.png index b8c1c2c05..71a4283f7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_16.png and b/TMessagesProj/src/main/assets/emoji/2_16.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_17.png b/TMessagesProj/src/main/assets/emoji/2_17.png index f9bb7dd1b..d0d669643 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_17.png and b/TMessagesProj/src/main/assets/emoji/2_17.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_18.png b/TMessagesProj/src/main/assets/emoji/2_18.png index 3e18ce920..6a307f4bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_18.png and b/TMessagesProj/src/main/assets/emoji/2_18.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_19.png b/TMessagesProj/src/main/assets/emoji/2_19.png index fbffa2459..355ed79fa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_19.png and b/TMessagesProj/src/main/assets/emoji/2_19.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_2.png b/TMessagesProj/src/main/assets/emoji/2_2.png index 3de621269..218a6fc5e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_2.png and b/TMessagesProj/src/main/assets/emoji/2_2.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_20.png b/TMessagesProj/src/main/assets/emoji/2_20.png index db7258ff1..6cccba4ca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_20.png and b/TMessagesProj/src/main/assets/emoji/2_20.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_21.png b/TMessagesProj/src/main/assets/emoji/2_21.png index fb6e87624..331147584 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_21.png and b/TMessagesProj/src/main/assets/emoji/2_21.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_22.png b/TMessagesProj/src/main/assets/emoji/2_22.png index fdf4695a3..8173a2761 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_22.png and b/TMessagesProj/src/main/assets/emoji/2_22.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_23.png b/TMessagesProj/src/main/assets/emoji/2_23.png index ddc1997c1..7d799593d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_23.png and b/TMessagesProj/src/main/assets/emoji/2_23.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_24.png b/TMessagesProj/src/main/assets/emoji/2_24.png index d04facac6..2cf0b6cd5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_24.png and b/TMessagesProj/src/main/assets/emoji/2_24.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_25.png b/TMessagesProj/src/main/assets/emoji/2_25.png index dc0fbbf4c..32ab52680 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_25.png and b/TMessagesProj/src/main/assets/emoji/2_25.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_26.png b/TMessagesProj/src/main/assets/emoji/2_26.png index 161cf8c46..e01deb972 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_26.png and b/TMessagesProj/src/main/assets/emoji/2_26.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_27.png b/TMessagesProj/src/main/assets/emoji/2_27.png index 42a1c00ac..d2e532ff2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_27.png and b/TMessagesProj/src/main/assets/emoji/2_27.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_28.png b/TMessagesProj/src/main/assets/emoji/2_28.png index d3d1086ba..d41004dd7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_28.png and b/TMessagesProj/src/main/assets/emoji/2_28.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_29.png b/TMessagesProj/src/main/assets/emoji/2_29.png index c67c56ade..8fdc6f166 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_29.png and b/TMessagesProj/src/main/assets/emoji/2_29.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_3.png b/TMessagesProj/src/main/assets/emoji/2_3.png index e8562ad52..b585a1e3d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_3.png and b/TMessagesProj/src/main/assets/emoji/2_3.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_30.png b/TMessagesProj/src/main/assets/emoji/2_30.png index 9af0c6922..9ff9f5e4b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_30.png and b/TMessagesProj/src/main/assets/emoji/2_30.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_31.png b/TMessagesProj/src/main/assets/emoji/2_31.png index 445b5af77..9aabbbdda 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_31.png and b/TMessagesProj/src/main/assets/emoji/2_31.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_32.png b/TMessagesProj/src/main/assets/emoji/2_32.png index f5e5007d9..63f0ab6be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_32.png and b/TMessagesProj/src/main/assets/emoji/2_32.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_33.png b/TMessagesProj/src/main/assets/emoji/2_33.png index 1f4a01e8a..ce1f22f2e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_33.png and b/TMessagesProj/src/main/assets/emoji/2_33.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_34.png b/TMessagesProj/src/main/assets/emoji/2_34.png index 226fac824..c42917925 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_34.png and b/TMessagesProj/src/main/assets/emoji/2_34.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_35.png b/TMessagesProj/src/main/assets/emoji/2_35.png index b14cdde07..d6c2e04c0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_35.png and b/TMessagesProj/src/main/assets/emoji/2_35.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_36.png b/TMessagesProj/src/main/assets/emoji/2_36.png index 2ceda024e..f433f810c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_36.png and b/TMessagesProj/src/main/assets/emoji/2_36.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_37.png b/TMessagesProj/src/main/assets/emoji/2_37.png index e304a104e..fd143139b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_37.png and b/TMessagesProj/src/main/assets/emoji/2_37.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_38.png b/TMessagesProj/src/main/assets/emoji/2_38.png index b3c69771b..1cb895449 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_38.png and b/TMessagesProj/src/main/assets/emoji/2_38.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_39.png b/TMessagesProj/src/main/assets/emoji/2_39.png index e79330433..446af065f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_39.png and b/TMessagesProj/src/main/assets/emoji/2_39.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_4.png b/TMessagesProj/src/main/assets/emoji/2_4.png index 00ce5d2d9..f573a8fec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_4.png and b/TMessagesProj/src/main/assets/emoji/2_4.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_40.png b/TMessagesProj/src/main/assets/emoji/2_40.png index 9552b9c39..5a9a3c609 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_40.png and b/TMessagesProj/src/main/assets/emoji/2_40.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_41.png b/TMessagesProj/src/main/assets/emoji/2_41.png index 600674866..7254bf881 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_41.png and b/TMessagesProj/src/main/assets/emoji/2_41.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_42.png b/TMessagesProj/src/main/assets/emoji/2_42.png index f90d6a07e..b5ccbf653 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_42.png and b/TMessagesProj/src/main/assets/emoji/2_42.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_43.png b/TMessagesProj/src/main/assets/emoji/2_43.png index aa7db40b6..d1854b40a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_43.png and b/TMessagesProj/src/main/assets/emoji/2_43.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_44.png b/TMessagesProj/src/main/assets/emoji/2_44.png index 809868df9..6e34b581e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_44.png and b/TMessagesProj/src/main/assets/emoji/2_44.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_45.png b/TMessagesProj/src/main/assets/emoji/2_45.png index 563efb5c4..03cfbe518 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_45.png and b/TMessagesProj/src/main/assets/emoji/2_45.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_46.png b/TMessagesProj/src/main/assets/emoji/2_46.png index 7055f0356..4368bb2d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_46.png and b/TMessagesProj/src/main/assets/emoji/2_46.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_47.png b/TMessagesProj/src/main/assets/emoji/2_47.png index 9ce104389..270f61db8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_47.png and b/TMessagesProj/src/main/assets/emoji/2_47.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_48.png b/TMessagesProj/src/main/assets/emoji/2_48.png index cc1bcb21b..e2f32c096 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_48.png and b/TMessagesProj/src/main/assets/emoji/2_48.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_49.png b/TMessagesProj/src/main/assets/emoji/2_49.png index 431edbb64..a24197d08 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_49.png and b/TMessagesProj/src/main/assets/emoji/2_49.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_5.png b/TMessagesProj/src/main/assets/emoji/2_5.png index bac81aab0..cca4301b0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_5.png and b/TMessagesProj/src/main/assets/emoji/2_5.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_50.png b/TMessagesProj/src/main/assets/emoji/2_50.png index 22b764f70..42e812080 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_50.png and b/TMessagesProj/src/main/assets/emoji/2_50.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_51.png b/TMessagesProj/src/main/assets/emoji/2_51.png index adf8e168d..2d338c2c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_51.png and b/TMessagesProj/src/main/assets/emoji/2_51.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_52.png b/TMessagesProj/src/main/assets/emoji/2_52.png index 17abb54c6..3da7bd4e4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_52.png and b/TMessagesProj/src/main/assets/emoji/2_52.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_53.png b/TMessagesProj/src/main/assets/emoji/2_53.png index 556f59671..582a42db7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_53.png and b/TMessagesProj/src/main/assets/emoji/2_53.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_54.png b/TMessagesProj/src/main/assets/emoji/2_54.png index 817b5ce3f..61f92c9d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_54.png and b/TMessagesProj/src/main/assets/emoji/2_54.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_55.png b/TMessagesProj/src/main/assets/emoji/2_55.png index 386c4118f..f2bb6dedb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_55.png and b/TMessagesProj/src/main/assets/emoji/2_55.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_56.png b/TMessagesProj/src/main/assets/emoji/2_56.png index 3e552a7bb..7c8751c4f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_56.png and b/TMessagesProj/src/main/assets/emoji/2_56.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_57.png b/TMessagesProj/src/main/assets/emoji/2_57.png index 9fc438d04..2db37a5b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_57.png and b/TMessagesProj/src/main/assets/emoji/2_57.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_58.png b/TMessagesProj/src/main/assets/emoji/2_58.png index bcbb52083..1152d23d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_58.png and b/TMessagesProj/src/main/assets/emoji/2_58.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_59.png b/TMessagesProj/src/main/assets/emoji/2_59.png index e88230544..a16d36f72 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_59.png and b/TMessagesProj/src/main/assets/emoji/2_59.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_6.png b/TMessagesProj/src/main/assets/emoji/2_6.png index 45f1a6b3f..69f5d7eee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_6.png and b/TMessagesProj/src/main/assets/emoji/2_6.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_60.png b/TMessagesProj/src/main/assets/emoji/2_60.png index b5d076743..5643a21be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_60.png and b/TMessagesProj/src/main/assets/emoji/2_60.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_61.png b/TMessagesProj/src/main/assets/emoji/2_61.png index b347292f6..3b344251a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_61.png and b/TMessagesProj/src/main/assets/emoji/2_61.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_62.png b/TMessagesProj/src/main/assets/emoji/2_62.png index 80b01ecd4..f90742ccd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_62.png and b/TMessagesProj/src/main/assets/emoji/2_62.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_63.png b/TMessagesProj/src/main/assets/emoji/2_63.png index c57b61131..9d6b8d1b0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_63.png and b/TMessagesProj/src/main/assets/emoji/2_63.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_64.png b/TMessagesProj/src/main/assets/emoji/2_64.png index cf04796c5..41d2eaa63 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_64.png and b/TMessagesProj/src/main/assets/emoji/2_64.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_65.png b/TMessagesProj/src/main/assets/emoji/2_65.png index 5491978a9..cf66c2357 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_65.png and b/TMessagesProj/src/main/assets/emoji/2_65.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_66.png b/TMessagesProj/src/main/assets/emoji/2_66.png index 514850b2b..0d8b005c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_66.png and b/TMessagesProj/src/main/assets/emoji/2_66.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_67.png b/TMessagesProj/src/main/assets/emoji/2_67.png index 7396a446f..c3e3252c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_67.png and b/TMessagesProj/src/main/assets/emoji/2_67.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_68.png b/TMessagesProj/src/main/assets/emoji/2_68.png index fc338a001..bfdca1c40 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_68.png and b/TMessagesProj/src/main/assets/emoji/2_68.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_69.png b/TMessagesProj/src/main/assets/emoji/2_69.png index 8f22bca7a..a7ec94fb5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_69.png and b/TMessagesProj/src/main/assets/emoji/2_69.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_7.png b/TMessagesProj/src/main/assets/emoji/2_7.png index 5396f8b39..7a7f06d66 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_7.png and b/TMessagesProj/src/main/assets/emoji/2_7.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_70.png b/TMessagesProj/src/main/assets/emoji/2_70.png index 01effbd18..371cd6441 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_70.png and b/TMessagesProj/src/main/assets/emoji/2_70.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_71.png b/TMessagesProj/src/main/assets/emoji/2_71.png index e34e21dec..db8497ded 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_71.png and b/TMessagesProj/src/main/assets/emoji/2_71.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_72.png b/TMessagesProj/src/main/assets/emoji/2_72.png index dc4d42d18..71f057f75 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_72.png and b/TMessagesProj/src/main/assets/emoji/2_72.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_73.png b/TMessagesProj/src/main/assets/emoji/2_73.png index 2b0c77579..b44afe576 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_73.png and b/TMessagesProj/src/main/assets/emoji/2_73.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_74.png b/TMessagesProj/src/main/assets/emoji/2_74.png index 1d4a089dc..93ac500d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_74.png and b/TMessagesProj/src/main/assets/emoji/2_74.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_75.png b/TMessagesProj/src/main/assets/emoji/2_75.png index 84eca2e13..f65e029a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_75.png and b/TMessagesProj/src/main/assets/emoji/2_75.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_76.png b/TMessagesProj/src/main/assets/emoji/2_76.png index 84263f8c3..091637dd0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_76.png and b/TMessagesProj/src/main/assets/emoji/2_76.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_77.png b/TMessagesProj/src/main/assets/emoji/2_77.png index 221239c2a..ca93f44e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_77.png and b/TMessagesProj/src/main/assets/emoji/2_77.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_78.png b/TMessagesProj/src/main/assets/emoji/2_78.png index 8514280d7..5ac7736ec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_78.png and b/TMessagesProj/src/main/assets/emoji/2_78.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_79.png b/TMessagesProj/src/main/assets/emoji/2_79.png index 22aac9d1f..9e977a573 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_79.png and b/TMessagesProj/src/main/assets/emoji/2_79.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_8.png b/TMessagesProj/src/main/assets/emoji/2_8.png index fd9474733..c4a2e6b2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_8.png and b/TMessagesProj/src/main/assets/emoji/2_8.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_80.png b/TMessagesProj/src/main/assets/emoji/2_80.png index 7e96280be..d80d19713 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_80.png and b/TMessagesProj/src/main/assets/emoji/2_80.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_81.png b/TMessagesProj/src/main/assets/emoji/2_81.png index be6420be7..4f9896beb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_81.png and b/TMessagesProj/src/main/assets/emoji/2_81.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_82.png b/TMessagesProj/src/main/assets/emoji/2_82.png index dec450979..98c3a0075 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_82.png and b/TMessagesProj/src/main/assets/emoji/2_82.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_83.png b/TMessagesProj/src/main/assets/emoji/2_83.png index 3bf2383b2..8948aadba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_83.png and b/TMessagesProj/src/main/assets/emoji/2_83.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_84.png b/TMessagesProj/src/main/assets/emoji/2_84.png index 39edd5174..1e64968a1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_84.png and b/TMessagesProj/src/main/assets/emoji/2_84.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_85.png b/TMessagesProj/src/main/assets/emoji/2_85.png index 2ff14a5f1..e83e5d5e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_85.png and b/TMessagesProj/src/main/assets/emoji/2_85.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_86.png b/TMessagesProj/src/main/assets/emoji/2_86.png index b68fe04ce..1574cd757 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_86.png and b/TMessagesProj/src/main/assets/emoji/2_86.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_87.png b/TMessagesProj/src/main/assets/emoji/2_87.png index cd1347db2..5aa16dd90 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_87.png and b/TMessagesProj/src/main/assets/emoji/2_87.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_88.png b/TMessagesProj/src/main/assets/emoji/2_88.png index 56e353d44..0014d0774 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_88.png and b/TMessagesProj/src/main/assets/emoji/2_88.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_89.png b/TMessagesProj/src/main/assets/emoji/2_89.png index e3274d955..f1ba758c8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_89.png and b/TMessagesProj/src/main/assets/emoji/2_89.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_9.png b/TMessagesProj/src/main/assets/emoji/2_9.png index 1d80f5f89..915369bd9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_9.png and b/TMessagesProj/src/main/assets/emoji/2_9.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_90.png b/TMessagesProj/src/main/assets/emoji/2_90.png index 18bc828fb..072b7d2c9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_90.png and b/TMessagesProj/src/main/assets/emoji/2_90.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_91.png b/TMessagesProj/src/main/assets/emoji/2_91.png index fb8ff9a84..b04763858 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_91.png and b/TMessagesProj/src/main/assets/emoji/2_91.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_92.png b/TMessagesProj/src/main/assets/emoji/2_92.png index 6c23b0753..66f3fe84d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_92.png and b/TMessagesProj/src/main/assets/emoji/2_92.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_93.png b/TMessagesProj/src/main/assets/emoji/2_93.png index b17578829..a8b70bbfb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_93.png and b/TMessagesProj/src/main/assets/emoji/2_93.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_94.png b/TMessagesProj/src/main/assets/emoji/2_94.png index 124bd51e2..04c6dd9f9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_94.png and b/TMessagesProj/src/main/assets/emoji/2_94.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_95.png b/TMessagesProj/src/main/assets/emoji/2_95.png index 1dcc2e3c7..788fd36fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_95.png and b/TMessagesProj/src/main/assets/emoji/2_95.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_96.png b/TMessagesProj/src/main/assets/emoji/2_96.png index ab0a04dd1..ff5281e70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_96.png and b/TMessagesProj/src/main/assets/emoji/2_96.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_97.png b/TMessagesProj/src/main/assets/emoji/2_97.png index 6df595576..0e562f6c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_97.png and b/TMessagesProj/src/main/assets/emoji/2_97.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_98.png b/TMessagesProj/src/main/assets/emoji/2_98.png index 52b80df0b..c4734568a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_98.png and b/TMessagesProj/src/main/assets/emoji/2_98.png differ diff --git a/TMessagesProj/src/main/assets/emoji/2_99.png b/TMessagesProj/src/main/assets/emoji/2_99.png index 8aed90371..3c92dfc67 100644 Binary files a/TMessagesProj/src/main/assets/emoji/2_99.png and b/TMessagesProj/src/main/assets/emoji/2_99.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_0.png b/TMessagesProj/src/main/assets/emoji/3_0.png index 02baef3a5..525febfb3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_0.png and b/TMessagesProj/src/main/assets/emoji/3_0.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_1.png b/TMessagesProj/src/main/assets/emoji/3_1.png index 74873afd3..8c6f5606b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_1.png and b/TMessagesProj/src/main/assets/emoji/3_1.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_10.png b/TMessagesProj/src/main/assets/emoji/3_10.png index dafa5df48..d7994f0ab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_10.png and b/TMessagesProj/src/main/assets/emoji/3_10.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_100.png b/TMessagesProj/src/main/assets/emoji/3_100.png index 1bd5c3ef6..835949d08 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_100.png and b/TMessagesProj/src/main/assets/emoji/3_100.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_101.png b/TMessagesProj/src/main/assets/emoji/3_101.png index 30b16041f..b09a90bad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_101.png and b/TMessagesProj/src/main/assets/emoji/3_101.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_102.png b/TMessagesProj/src/main/assets/emoji/3_102.png index 8db2c2cdd..19d91a840 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_102.png and b/TMessagesProj/src/main/assets/emoji/3_102.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_103.png b/TMessagesProj/src/main/assets/emoji/3_103.png index ff8959841..56fabc5bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_103.png and b/TMessagesProj/src/main/assets/emoji/3_103.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_104.png b/TMessagesProj/src/main/assets/emoji/3_104.png index 98641a566..b476a2a54 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_104.png and b/TMessagesProj/src/main/assets/emoji/3_104.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_105.png b/TMessagesProj/src/main/assets/emoji/3_105.png index 81118141a..2eacb7530 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_105.png and b/TMessagesProj/src/main/assets/emoji/3_105.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_106.png b/TMessagesProj/src/main/assets/emoji/3_106.png index 519f1fa72..77dd12c11 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_106.png and b/TMessagesProj/src/main/assets/emoji/3_106.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_107.png b/TMessagesProj/src/main/assets/emoji/3_107.png index 96c2a4854..f80eff1af 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_107.png and b/TMessagesProj/src/main/assets/emoji/3_107.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_108.png b/TMessagesProj/src/main/assets/emoji/3_108.png index 5e5730fc7..41f16b339 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_108.png and b/TMessagesProj/src/main/assets/emoji/3_108.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_109.png b/TMessagesProj/src/main/assets/emoji/3_109.png index 929d381b1..278c148c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_109.png and b/TMessagesProj/src/main/assets/emoji/3_109.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_11.png b/TMessagesProj/src/main/assets/emoji/3_11.png index 3e04e28d2..17266501c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_11.png and b/TMessagesProj/src/main/assets/emoji/3_11.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_110.png b/TMessagesProj/src/main/assets/emoji/3_110.png index b6e5931de..cbf24d157 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_110.png and b/TMessagesProj/src/main/assets/emoji/3_110.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_111.png b/TMessagesProj/src/main/assets/emoji/3_111.png index 81fc8a91d..b398a42ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_111.png and b/TMessagesProj/src/main/assets/emoji/3_111.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_112.png b/TMessagesProj/src/main/assets/emoji/3_112.png index acc5588d4..bf9897cf8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_112.png and b/TMessagesProj/src/main/assets/emoji/3_112.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_113.png b/TMessagesProj/src/main/assets/emoji/3_113.png index af7c606e2..719c29d1e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_113.png and b/TMessagesProj/src/main/assets/emoji/3_113.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_114.png b/TMessagesProj/src/main/assets/emoji/3_114.png index 0fabe70d0..9238accfd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_114.png and b/TMessagesProj/src/main/assets/emoji/3_114.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_115.png b/TMessagesProj/src/main/assets/emoji/3_115.png index 680b4d6e6..2643a8668 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_115.png and b/TMessagesProj/src/main/assets/emoji/3_115.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_116.png b/TMessagesProj/src/main/assets/emoji/3_116.png index 8f6ff1ebd..b62b0d0f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_116.png and b/TMessagesProj/src/main/assets/emoji/3_116.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_117.png b/TMessagesProj/src/main/assets/emoji/3_117.png index a6a74d2d2..d63c9d2db 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_117.png and b/TMessagesProj/src/main/assets/emoji/3_117.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_118.png b/TMessagesProj/src/main/assets/emoji/3_118.png index f0c07f9ec..0ccca1176 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_118.png and b/TMessagesProj/src/main/assets/emoji/3_118.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_119.png b/TMessagesProj/src/main/assets/emoji/3_119.png index 41f2012dd..2b81f0547 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_119.png and b/TMessagesProj/src/main/assets/emoji/3_119.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_12.png b/TMessagesProj/src/main/assets/emoji/3_12.png index 9d2227931..0f5c2847b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_12.png and b/TMessagesProj/src/main/assets/emoji/3_12.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_120.png b/TMessagesProj/src/main/assets/emoji/3_120.png index c479b43b9..4f331f5dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_120.png and b/TMessagesProj/src/main/assets/emoji/3_120.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_121.png b/TMessagesProj/src/main/assets/emoji/3_121.png index 543e2f118..9ee3e7118 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_121.png and b/TMessagesProj/src/main/assets/emoji/3_121.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_122.png b/TMessagesProj/src/main/assets/emoji/3_122.png index ad483d252..d16b50a65 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_122.png and b/TMessagesProj/src/main/assets/emoji/3_122.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_123.png b/TMessagesProj/src/main/assets/emoji/3_123.png index ab729c885..a1b501376 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_123.png and b/TMessagesProj/src/main/assets/emoji/3_123.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_124.png b/TMessagesProj/src/main/assets/emoji/3_124.png index 5aef13642..6ec0b4023 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_124.png and b/TMessagesProj/src/main/assets/emoji/3_124.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_125.png b/TMessagesProj/src/main/assets/emoji/3_125.png index 9b33a8f6f..64d19098c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_125.png and b/TMessagesProj/src/main/assets/emoji/3_125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_126.png b/TMessagesProj/src/main/assets/emoji/3_126.png index 280e1026f..f26100bfa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_126.png and b/TMessagesProj/src/main/assets/emoji/3_126.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_127.png b/TMessagesProj/src/main/assets/emoji/3_127.png index 938a09a5f..afd5d57a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_127.png and b/TMessagesProj/src/main/assets/emoji/3_127.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_128.png b/TMessagesProj/src/main/assets/emoji/3_128.png index 56a1672ff..58fe617a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_128.png and b/TMessagesProj/src/main/assets/emoji/3_128.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_129.png b/TMessagesProj/src/main/assets/emoji/3_129.png index 1ec22d07e..e1dea49ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_129.png and b/TMessagesProj/src/main/assets/emoji/3_129.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_13.png b/TMessagesProj/src/main/assets/emoji/3_13.png index d975576f3..8fdc1212a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_13.png and b/TMessagesProj/src/main/assets/emoji/3_13.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_130.png b/TMessagesProj/src/main/assets/emoji/3_130.png index c92f1604f..07fec112b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_130.png and b/TMessagesProj/src/main/assets/emoji/3_130.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_131.png b/TMessagesProj/src/main/assets/emoji/3_131.png index c77c66b41..9be8df935 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_131.png and b/TMessagesProj/src/main/assets/emoji/3_131.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_132.png b/TMessagesProj/src/main/assets/emoji/3_132.png index 61bc9d265..2857930d9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_132.png and b/TMessagesProj/src/main/assets/emoji/3_132.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_133.png b/TMessagesProj/src/main/assets/emoji/3_133.png index ce924cafd..e487ad9ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_133.png and b/TMessagesProj/src/main/assets/emoji/3_133.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_134.png b/TMessagesProj/src/main/assets/emoji/3_134.png index 8e7069aa2..a49a08d38 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_134.png and b/TMessagesProj/src/main/assets/emoji/3_134.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_135.png b/TMessagesProj/src/main/assets/emoji/3_135.png index ddab02a88..7389991da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_135.png and b/TMessagesProj/src/main/assets/emoji/3_135.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_136.png b/TMessagesProj/src/main/assets/emoji/3_136.png index 18cb62ba4..98d828e5b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_136.png and b/TMessagesProj/src/main/assets/emoji/3_136.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_137.png b/TMessagesProj/src/main/assets/emoji/3_137.png index d3caef380..3c7d144d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_137.png and b/TMessagesProj/src/main/assets/emoji/3_137.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_138.png b/TMessagesProj/src/main/assets/emoji/3_138.png index 582cd45ea..d44bc2741 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_138.png and b/TMessagesProj/src/main/assets/emoji/3_138.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_139.png b/TMessagesProj/src/main/assets/emoji/3_139.png index faf287c15..053806a27 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_139.png and b/TMessagesProj/src/main/assets/emoji/3_139.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_14.png b/TMessagesProj/src/main/assets/emoji/3_14.png index fb97531f4..432077065 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_14.png and b/TMessagesProj/src/main/assets/emoji/3_14.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_140.png b/TMessagesProj/src/main/assets/emoji/3_140.png index 53dc90407..e69e29091 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_140.png and b/TMessagesProj/src/main/assets/emoji/3_140.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_141.png b/TMessagesProj/src/main/assets/emoji/3_141.png index c2a37620a..dbf49877e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_141.png and b/TMessagesProj/src/main/assets/emoji/3_141.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_142.png b/TMessagesProj/src/main/assets/emoji/3_142.png index 44f3f6965..74c18374c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_142.png and b/TMessagesProj/src/main/assets/emoji/3_142.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_143.png b/TMessagesProj/src/main/assets/emoji/3_143.png index ffcabb815..bc856a1e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_143.png and b/TMessagesProj/src/main/assets/emoji/3_143.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_144.png b/TMessagesProj/src/main/assets/emoji/3_144.png index 4168d3c56..2c3db58ad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_144.png and b/TMessagesProj/src/main/assets/emoji/3_144.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_145.png b/TMessagesProj/src/main/assets/emoji/3_145.png index 914fa5f43..1ee1cb438 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_145.png and b/TMessagesProj/src/main/assets/emoji/3_145.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_146.png b/TMessagesProj/src/main/assets/emoji/3_146.png index 9a558a1a5..75afb133a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_146.png and b/TMessagesProj/src/main/assets/emoji/3_146.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_147.png b/TMessagesProj/src/main/assets/emoji/3_147.png index bf54d0903..adc4c2deb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_147.png and b/TMessagesProj/src/main/assets/emoji/3_147.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_148.png b/TMessagesProj/src/main/assets/emoji/3_148.png index b2d4e5d63..2ae5270b0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_148.png and b/TMessagesProj/src/main/assets/emoji/3_148.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_149.png b/TMessagesProj/src/main/assets/emoji/3_149.png index 2e73e70b2..a95a150a1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_149.png and b/TMessagesProj/src/main/assets/emoji/3_149.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_15.png b/TMessagesProj/src/main/assets/emoji/3_15.png index 5b187b907..57033d635 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_15.png and b/TMessagesProj/src/main/assets/emoji/3_15.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_150.png b/TMessagesProj/src/main/assets/emoji/3_150.png index 494d95a1a..a336ae33e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_150.png and b/TMessagesProj/src/main/assets/emoji/3_150.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_151.png b/TMessagesProj/src/main/assets/emoji/3_151.png index 4c6518a5d..6a649b3e6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_151.png and b/TMessagesProj/src/main/assets/emoji/3_151.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_152.png b/TMessagesProj/src/main/assets/emoji/3_152.png index 0ec1f5779..111e15aa2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_152.png and b/TMessagesProj/src/main/assets/emoji/3_152.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_153.png b/TMessagesProj/src/main/assets/emoji/3_153.png index 6f3267727..477a990f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_153.png and b/TMessagesProj/src/main/assets/emoji/3_153.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_154.png b/TMessagesProj/src/main/assets/emoji/3_154.png index 2bd47270d..a7ceaefbb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_154.png and b/TMessagesProj/src/main/assets/emoji/3_154.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_155.png b/TMessagesProj/src/main/assets/emoji/3_155.png index 40c616d01..6b0c48774 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_155.png and b/TMessagesProj/src/main/assets/emoji/3_155.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_156.png b/TMessagesProj/src/main/assets/emoji/3_156.png index e20355d59..781839010 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_156.png and b/TMessagesProj/src/main/assets/emoji/3_156.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_157.png b/TMessagesProj/src/main/assets/emoji/3_157.png index c189b6e17..6aca1fff0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_157.png and b/TMessagesProj/src/main/assets/emoji/3_157.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_158.png b/TMessagesProj/src/main/assets/emoji/3_158.png index 260741127..e71a9a273 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_158.png and b/TMessagesProj/src/main/assets/emoji/3_158.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_159.png b/TMessagesProj/src/main/assets/emoji/3_159.png index fc747a72b..ac24ed162 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_159.png and b/TMessagesProj/src/main/assets/emoji/3_159.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_16.png b/TMessagesProj/src/main/assets/emoji/3_16.png index 2e7df1d22..fb83a6d12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_16.png and b/TMessagesProj/src/main/assets/emoji/3_16.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_160.png b/TMessagesProj/src/main/assets/emoji/3_160.png index a885e12fe..9b164ae5b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_160.png and b/TMessagesProj/src/main/assets/emoji/3_160.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_161.png b/TMessagesProj/src/main/assets/emoji/3_161.png index c0a5c5fb2..446287302 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_161.png and b/TMessagesProj/src/main/assets/emoji/3_161.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_162.png b/TMessagesProj/src/main/assets/emoji/3_162.png index 0143afbfd..157ac001a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_162.png and b/TMessagesProj/src/main/assets/emoji/3_162.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_163.png b/TMessagesProj/src/main/assets/emoji/3_163.png index 027ae3358..e882a9f71 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_163.png and b/TMessagesProj/src/main/assets/emoji/3_163.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_164.png b/TMessagesProj/src/main/assets/emoji/3_164.png index 6e715a71f..bfbcc194f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_164.png and b/TMessagesProj/src/main/assets/emoji/3_164.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_165.png b/TMessagesProj/src/main/assets/emoji/3_165.png index b5fb4f9c8..47ac39ad7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_165.png and b/TMessagesProj/src/main/assets/emoji/3_165.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_166.png b/TMessagesProj/src/main/assets/emoji/3_166.png index 67779d83b..13d17bade 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_166.png and b/TMessagesProj/src/main/assets/emoji/3_166.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_167.png b/TMessagesProj/src/main/assets/emoji/3_167.png index 3673111f1..249ad4804 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_167.png and b/TMessagesProj/src/main/assets/emoji/3_167.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_168.png b/TMessagesProj/src/main/assets/emoji/3_168.png index 6c2c1bd41..adc3d03be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_168.png and b/TMessagesProj/src/main/assets/emoji/3_168.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_169.png b/TMessagesProj/src/main/assets/emoji/3_169.png index 9540e9a6f..ae4b29e75 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_169.png and b/TMessagesProj/src/main/assets/emoji/3_169.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_17.png b/TMessagesProj/src/main/assets/emoji/3_17.png index d35aa510e..eedb181c7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_17.png and b/TMessagesProj/src/main/assets/emoji/3_17.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_170.png b/TMessagesProj/src/main/assets/emoji/3_170.png index 0794f3166..4e42f8c13 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_170.png and b/TMessagesProj/src/main/assets/emoji/3_170.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_171.png b/TMessagesProj/src/main/assets/emoji/3_171.png index 8692cef38..c94ad4d59 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_171.png and b/TMessagesProj/src/main/assets/emoji/3_171.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_172.png b/TMessagesProj/src/main/assets/emoji/3_172.png index 4ef248fc8..8e4d951e0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_172.png and b/TMessagesProj/src/main/assets/emoji/3_172.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_173.png b/TMessagesProj/src/main/assets/emoji/3_173.png index 4eda81975..c3f8675a6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_173.png and b/TMessagesProj/src/main/assets/emoji/3_173.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_174.png b/TMessagesProj/src/main/assets/emoji/3_174.png index d93833e53..b87222c84 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_174.png and b/TMessagesProj/src/main/assets/emoji/3_174.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_175.png b/TMessagesProj/src/main/assets/emoji/3_175.png index aeaa607bd..620ae1c02 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_175.png and b/TMessagesProj/src/main/assets/emoji/3_175.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_176.png b/TMessagesProj/src/main/assets/emoji/3_176.png index 81c4b7fb9..7f96a5eb5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_176.png and b/TMessagesProj/src/main/assets/emoji/3_176.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_177.png b/TMessagesProj/src/main/assets/emoji/3_177.png index 412b92f49..72a5bec52 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_177.png and b/TMessagesProj/src/main/assets/emoji/3_177.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_178.png b/TMessagesProj/src/main/assets/emoji/3_178.png index ff8fff41a..132735e37 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_178.png and b/TMessagesProj/src/main/assets/emoji/3_178.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_179.png b/TMessagesProj/src/main/assets/emoji/3_179.png index 89ee35203..3d546d9b7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_179.png and b/TMessagesProj/src/main/assets/emoji/3_179.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_18.png b/TMessagesProj/src/main/assets/emoji/3_18.png index 2a243ffb1..a4e7239b1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_18.png and b/TMessagesProj/src/main/assets/emoji/3_18.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_180.png b/TMessagesProj/src/main/assets/emoji/3_180.png index 077704bd5..517f7a702 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_180.png and b/TMessagesProj/src/main/assets/emoji/3_180.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_181.png b/TMessagesProj/src/main/assets/emoji/3_181.png index 43e08666c..08a8a8c9d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_181.png and b/TMessagesProj/src/main/assets/emoji/3_181.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_182.png b/TMessagesProj/src/main/assets/emoji/3_182.png index e7a7ef2bf..051ca9297 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_182.png and b/TMessagesProj/src/main/assets/emoji/3_182.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_183.png b/TMessagesProj/src/main/assets/emoji/3_183.png index 1aaa2f9d2..59923a8d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_183.png and b/TMessagesProj/src/main/assets/emoji/3_183.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_184.png b/TMessagesProj/src/main/assets/emoji/3_184.png index dd0587dfa..969ea00f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_184.png and b/TMessagesProj/src/main/assets/emoji/3_184.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_185.png b/TMessagesProj/src/main/assets/emoji/3_185.png index d14dbea90..54ffbc883 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_185.png and b/TMessagesProj/src/main/assets/emoji/3_185.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_186.png b/TMessagesProj/src/main/assets/emoji/3_186.png index 73b8c9766..6f1907368 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_186.png and b/TMessagesProj/src/main/assets/emoji/3_186.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_187.png b/TMessagesProj/src/main/assets/emoji/3_187.png index a087ebf0d..07db02e98 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_187.png and b/TMessagesProj/src/main/assets/emoji/3_187.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_188.png b/TMessagesProj/src/main/assets/emoji/3_188.png index f0d3f3de0..30e92e0fc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_188.png and b/TMessagesProj/src/main/assets/emoji/3_188.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_189.png b/TMessagesProj/src/main/assets/emoji/3_189.png index 49ce71f44..48e25703e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_189.png and b/TMessagesProj/src/main/assets/emoji/3_189.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_19.png b/TMessagesProj/src/main/assets/emoji/3_19.png index c8f93cafc..527b04ecc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_19.png and b/TMessagesProj/src/main/assets/emoji/3_19.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_190.png b/TMessagesProj/src/main/assets/emoji/3_190.png index 28db50c48..36faa8ccf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_190.png and b/TMessagesProj/src/main/assets/emoji/3_190.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_191.png b/TMessagesProj/src/main/assets/emoji/3_191.png index 054e59d96..0c430e187 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_191.png and b/TMessagesProj/src/main/assets/emoji/3_191.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_192.png b/TMessagesProj/src/main/assets/emoji/3_192.png index d74917c6f..2aaec07bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_192.png and b/TMessagesProj/src/main/assets/emoji/3_192.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_193.png b/TMessagesProj/src/main/assets/emoji/3_193.png index b1f49efcc..39cdb2b41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_193.png and b/TMessagesProj/src/main/assets/emoji/3_193.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_194.png b/TMessagesProj/src/main/assets/emoji/3_194.png index c281d2309..56b99c70f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_194.png and b/TMessagesProj/src/main/assets/emoji/3_194.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_195.png b/TMessagesProj/src/main/assets/emoji/3_195.png index 8a9d79b36..5990aff42 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_195.png and b/TMessagesProj/src/main/assets/emoji/3_195.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_196.png b/TMessagesProj/src/main/assets/emoji/3_196.png index 8894cc872..5e1f12d1e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_196.png and b/TMessagesProj/src/main/assets/emoji/3_196.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_197.png b/TMessagesProj/src/main/assets/emoji/3_197.png index ab3a2a04e..548f27c2e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_197.png and b/TMessagesProj/src/main/assets/emoji/3_197.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_198.png b/TMessagesProj/src/main/assets/emoji/3_198.png index 91857161c..6317ac6d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_198.png and b/TMessagesProj/src/main/assets/emoji/3_198.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_199.png b/TMessagesProj/src/main/assets/emoji/3_199.png index 41df032da..9d0a3db2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_199.png and b/TMessagesProj/src/main/assets/emoji/3_199.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_2.png b/TMessagesProj/src/main/assets/emoji/3_2.png index e12fcd129..ab845a6ce 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_2.png and b/TMessagesProj/src/main/assets/emoji/3_2.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_20.png b/TMessagesProj/src/main/assets/emoji/3_20.png index 30c59d3b7..c8ca7d3d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_20.png and b/TMessagesProj/src/main/assets/emoji/3_20.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_200.png b/TMessagesProj/src/main/assets/emoji/3_200.png index b1588bea8..d1b585a1a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_200.png and b/TMessagesProj/src/main/assets/emoji/3_200.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_201.png b/TMessagesProj/src/main/assets/emoji/3_201.png index 4277db54e..a194eb53b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_201.png and b/TMessagesProj/src/main/assets/emoji/3_201.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_202.png b/TMessagesProj/src/main/assets/emoji/3_202.png index dc222cec6..b291fdc3d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_202.png and b/TMessagesProj/src/main/assets/emoji/3_202.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_203.png b/TMessagesProj/src/main/assets/emoji/3_203.png index 3c2ff277e..93701da26 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_203.png and b/TMessagesProj/src/main/assets/emoji/3_203.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_204.png b/TMessagesProj/src/main/assets/emoji/3_204.png index 36d423753..63b6b3990 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_204.png and b/TMessagesProj/src/main/assets/emoji/3_204.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_205.png b/TMessagesProj/src/main/assets/emoji/3_205.png index 7b8d6adf2..29f644c07 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_205.png and b/TMessagesProj/src/main/assets/emoji/3_205.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_206.png b/TMessagesProj/src/main/assets/emoji/3_206.png index 8259f5da5..ffb6664a7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_206.png and b/TMessagesProj/src/main/assets/emoji/3_206.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_207.png b/TMessagesProj/src/main/assets/emoji/3_207.png index 0ef796c30..2ab7d4c55 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_207.png and b/TMessagesProj/src/main/assets/emoji/3_207.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_208.png b/TMessagesProj/src/main/assets/emoji/3_208.png index aa4f55890..567d14f42 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_208.png and b/TMessagesProj/src/main/assets/emoji/3_208.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_209.png b/TMessagesProj/src/main/assets/emoji/3_209.png index 3cdade790..4a4585f8c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_209.png and b/TMessagesProj/src/main/assets/emoji/3_209.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_21.png b/TMessagesProj/src/main/assets/emoji/3_21.png index 0b1764f99..e1e6883b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_21.png and b/TMessagesProj/src/main/assets/emoji/3_21.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_210.png b/TMessagesProj/src/main/assets/emoji/3_210.png index 500a7dd7f..581d0eca1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_210.png and b/TMessagesProj/src/main/assets/emoji/3_210.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_211.png b/TMessagesProj/src/main/assets/emoji/3_211.png index cb0312f55..1b2cdd531 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_211.png and b/TMessagesProj/src/main/assets/emoji/3_211.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_212.png b/TMessagesProj/src/main/assets/emoji/3_212.png index f43d4b7a4..18f1426f5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_212.png and b/TMessagesProj/src/main/assets/emoji/3_212.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_213.png b/TMessagesProj/src/main/assets/emoji/3_213.png index 7808c66ed..3e3fc916c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_213.png and b/TMessagesProj/src/main/assets/emoji/3_213.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_214.png b/TMessagesProj/src/main/assets/emoji/3_214.png index af30e1f0c..891b44060 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_214.png and b/TMessagesProj/src/main/assets/emoji/3_214.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_215.png b/TMessagesProj/src/main/assets/emoji/3_215.png index c281bac59..3ee661ab0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_215.png and b/TMessagesProj/src/main/assets/emoji/3_215.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_216.png b/TMessagesProj/src/main/assets/emoji/3_216.png index 8390adb56..f4140a2a0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_216.png and b/TMessagesProj/src/main/assets/emoji/3_216.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_217.png b/TMessagesProj/src/main/assets/emoji/3_217.png index 7ad3279a8..ee1927430 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_217.png and b/TMessagesProj/src/main/assets/emoji/3_217.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_218.png b/TMessagesProj/src/main/assets/emoji/3_218.png index 935f6e7ca..f5a335a19 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_218.png and b/TMessagesProj/src/main/assets/emoji/3_218.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_219.png b/TMessagesProj/src/main/assets/emoji/3_219.png index 44108bb93..422c65c12 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_219.png and b/TMessagesProj/src/main/assets/emoji/3_219.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_22.png b/TMessagesProj/src/main/assets/emoji/3_22.png index 44162e76a..e9bac7f93 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_22.png and b/TMessagesProj/src/main/assets/emoji/3_22.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_220.png b/TMessagesProj/src/main/assets/emoji/3_220.png index 4f1b9c7f0..1380d8fdb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_220.png and b/TMessagesProj/src/main/assets/emoji/3_220.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_221.png b/TMessagesProj/src/main/assets/emoji/3_221.png index 44b40cf52..513376f8d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_221.png and b/TMessagesProj/src/main/assets/emoji/3_221.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_222.png b/TMessagesProj/src/main/assets/emoji/3_222.png index 442296010..6b897e8d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_222.png and b/TMessagesProj/src/main/assets/emoji/3_222.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_223.png b/TMessagesProj/src/main/assets/emoji/3_223.png index 05712cb46..26a0a12de 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_223.png and b/TMessagesProj/src/main/assets/emoji/3_223.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_224.png b/TMessagesProj/src/main/assets/emoji/3_224.png index 87b41094d..2314c914e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_224.png and b/TMessagesProj/src/main/assets/emoji/3_224.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_225.png b/TMessagesProj/src/main/assets/emoji/3_225.png index 2df1c6b61..8ba2d6b80 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_225.png and b/TMessagesProj/src/main/assets/emoji/3_225.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_226.png b/TMessagesProj/src/main/assets/emoji/3_226.png index a2226da60..361df5a98 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_226.png and b/TMessagesProj/src/main/assets/emoji/3_226.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_227.png b/TMessagesProj/src/main/assets/emoji/3_227.png index 77ccc3a06..93465f822 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_227.png and b/TMessagesProj/src/main/assets/emoji/3_227.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_228.png b/TMessagesProj/src/main/assets/emoji/3_228.png index 3c1b43bd7..3933a71d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_228.png and b/TMessagesProj/src/main/assets/emoji/3_228.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_229.png b/TMessagesProj/src/main/assets/emoji/3_229.png index 9dbaf4754..4e9fdb52e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_229.png and b/TMessagesProj/src/main/assets/emoji/3_229.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_23.png b/TMessagesProj/src/main/assets/emoji/3_23.png index c173ebca9..f64672e66 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_23.png and b/TMessagesProj/src/main/assets/emoji/3_23.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_230.png b/TMessagesProj/src/main/assets/emoji/3_230.png index 9c01d9ba2..eaa31866b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_230.png and b/TMessagesProj/src/main/assets/emoji/3_230.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_231.png b/TMessagesProj/src/main/assets/emoji/3_231.png index 48bd5d94a..1683b55ba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_231.png and b/TMessagesProj/src/main/assets/emoji/3_231.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_232.png b/TMessagesProj/src/main/assets/emoji/3_232.png index a52b693ff..76d344c3b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_232.png and b/TMessagesProj/src/main/assets/emoji/3_232.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_233.png b/TMessagesProj/src/main/assets/emoji/3_233.png index 1e970ba49..4b28a0b3d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_233.png and b/TMessagesProj/src/main/assets/emoji/3_233.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_234.png b/TMessagesProj/src/main/assets/emoji/3_234.png index 68e87a378..d2c658665 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_234.png and b/TMessagesProj/src/main/assets/emoji/3_234.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_235.png b/TMessagesProj/src/main/assets/emoji/3_235.png index c52aa3c22..ca6b9e7da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_235.png and b/TMessagesProj/src/main/assets/emoji/3_235.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_236.png b/TMessagesProj/src/main/assets/emoji/3_236.png index 1d435948b..9d6cf6c93 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_236.png and b/TMessagesProj/src/main/assets/emoji/3_236.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_237.png b/TMessagesProj/src/main/assets/emoji/3_237.png index 448bd4b58..845f7705b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_237.png and b/TMessagesProj/src/main/assets/emoji/3_237.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_238.png b/TMessagesProj/src/main/assets/emoji/3_238.png index f16dbe8a4..6f2b940e0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_238.png and b/TMessagesProj/src/main/assets/emoji/3_238.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_239.png b/TMessagesProj/src/main/assets/emoji/3_239.png index 335aca10c..92b36db5c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_239.png and b/TMessagesProj/src/main/assets/emoji/3_239.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_24.png b/TMessagesProj/src/main/assets/emoji/3_24.png index a01d5f71b..2d88555f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_24.png and b/TMessagesProj/src/main/assets/emoji/3_24.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_240.png b/TMessagesProj/src/main/assets/emoji/3_240.png index 169132ead..0f4150e4b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_240.png and b/TMessagesProj/src/main/assets/emoji/3_240.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_241.png b/TMessagesProj/src/main/assets/emoji/3_241.png index 7cbdd0ca3..c7513dd8e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_241.png and b/TMessagesProj/src/main/assets/emoji/3_241.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_242.png b/TMessagesProj/src/main/assets/emoji/3_242.png index 2f6b7b5b8..ce57ea207 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_242.png and b/TMessagesProj/src/main/assets/emoji/3_242.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_243.png b/TMessagesProj/src/main/assets/emoji/3_243.png index d526f196b..f7c9132d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_243.png and b/TMessagesProj/src/main/assets/emoji/3_243.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_244.png b/TMessagesProj/src/main/assets/emoji/3_244.png index 0e31dd433..8519c04f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_244.png and b/TMessagesProj/src/main/assets/emoji/3_244.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_245.png b/TMessagesProj/src/main/assets/emoji/3_245.png index 0272dc183..b1582885a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_245.png and b/TMessagesProj/src/main/assets/emoji/3_245.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_246.png b/TMessagesProj/src/main/assets/emoji/3_246.png index 721b4af67..48fda9cb6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_246.png and b/TMessagesProj/src/main/assets/emoji/3_246.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_247.png b/TMessagesProj/src/main/assets/emoji/3_247.png index 409b1d434..946c4c3c8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_247.png and b/TMessagesProj/src/main/assets/emoji/3_247.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_248.png b/TMessagesProj/src/main/assets/emoji/3_248.png index 58020aab9..69a8e39a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_248.png and b/TMessagesProj/src/main/assets/emoji/3_248.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_249.png b/TMessagesProj/src/main/assets/emoji/3_249.png index 21b59368b..06b5b16b3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_249.png and b/TMessagesProj/src/main/assets/emoji/3_249.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_25.png b/TMessagesProj/src/main/assets/emoji/3_25.png index f3f715b87..ff871b4f7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_25.png and b/TMessagesProj/src/main/assets/emoji/3_25.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_250.png b/TMessagesProj/src/main/assets/emoji/3_250.png index 316d1a690..b76a29955 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_250.png and b/TMessagesProj/src/main/assets/emoji/3_250.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_251.png b/TMessagesProj/src/main/assets/emoji/3_251.png index 340117b9e..d35920be1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_251.png and b/TMessagesProj/src/main/assets/emoji/3_251.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_252.png b/TMessagesProj/src/main/assets/emoji/3_252.png index 4996cd1d5..0f0d25a43 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_252.png and b/TMessagesProj/src/main/assets/emoji/3_252.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_253.png b/TMessagesProj/src/main/assets/emoji/3_253.png index 1c274dac4..09354436b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_253.png and b/TMessagesProj/src/main/assets/emoji/3_253.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_254.png b/TMessagesProj/src/main/assets/emoji/3_254.png index 876615ad0..33dece08e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_254.png and b/TMessagesProj/src/main/assets/emoji/3_254.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_255.png b/TMessagesProj/src/main/assets/emoji/3_255.png index 2a4831925..68f820dcc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_255.png and b/TMessagesProj/src/main/assets/emoji/3_255.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_256.png b/TMessagesProj/src/main/assets/emoji/3_256.png index bb81607ff..fc4fe1f53 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_256.png and b/TMessagesProj/src/main/assets/emoji/3_256.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_257.png b/TMessagesProj/src/main/assets/emoji/3_257.png index 99d81ca49..27639b1b8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_257.png and b/TMessagesProj/src/main/assets/emoji/3_257.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_258.png b/TMessagesProj/src/main/assets/emoji/3_258.png index 4dd962d73..b15b16c4c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_258.png and b/TMessagesProj/src/main/assets/emoji/3_258.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_259.png b/TMessagesProj/src/main/assets/emoji/3_259.png index ddadd3a83..b8a4bc6bd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_259.png and b/TMessagesProj/src/main/assets/emoji/3_259.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_26.png b/TMessagesProj/src/main/assets/emoji/3_26.png index 0fae544fc..d0180f779 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_26.png and b/TMessagesProj/src/main/assets/emoji/3_26.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_260.png b/TMessagesProj/src/main/assets/emoji/3_260.png index 96a85deb5..c4350846b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_260.png and b/TMessagesProj/src/main/assets/emoji/3_260.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_261.png b/TMessagesProj/src/main/assets/emoji/3_261.png index 8865b598d..6f90586f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_261.png and b/TMessagesProj/src/main/assets/emoji/3_261.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_262.png b/TMessagesProj/src/main/assets/emoji/3_262.png index 14d29939a..a5f1bb016 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_262.png and b/TMessagesProj/src/main/assets/emoji/3_262.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_263.png b/TMessagesProj/src/main/assets/emoji/3_263.png index e1737a6a9..778c45ad3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_263.png and b/TMessagesProj/src/main/assets/emoji/3_263.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_264.png b/TMessagesProj/src/main/assets/emoji/3_264.png index a156407c5..18c3987f8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_264.png and b/TMessagesProj/src/main/assets/emoji/3_264.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_265.png b/TMessagesProj/src/main/assets/emoji/3_265.png index d83659f48..20ba7e6ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_265.png and b/TMessagesProj/src/main/assets/emoji/3_265.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_266.png b/TMessagesProj/src/main/assets/emoji/3_266.png index 497653763..e3cadbbf6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_266.png and b/TMessagesProj/src/main/assets/emoji/3_266.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_267.png b/TMessagesProj/src/main/assets/emoji/3_267.png index 26cf36415..c907f7a5e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_267.png and b/TMessagesProj/src/main/assets/emoji/3_267.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_268.png b/TMessagesProj/src/main/assets/emoji/3_268.png index 5232830ec..829fd1d6d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_268.png and b/TMessagesProj/src/main/assets/emoji/3_268.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_269.png b/TMessagesProj/src/main/assets/emoji/3_269.png index c1078de13..238dcf903 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_269.png and b/TMessagesProj/src/main/assets/emoji/3_269.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_27.png b/TMessagesProj/src/main/assets/emoji/3_27.png index 7239ee84e..d719cb6ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_27.png and b/TMessagesProj/src/main/assets/emoji/3_27.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_270.png b/TMessagesProj/src/main/assets/emoji/3_270.png index f5a8ea441..74bf5cdc6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_270.png and b/TMessagesProj/src/main/assets/emoji/3_270.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_271.png b/TMessagesProj/src/main/assets/emoji/3_271.png index cef7b7b0c..fd6588501 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_271.png and b/TMessagesProj/src/main/assets/emoji/3_271.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_272.png b/TMessagesProj/src/main/assets/emoji/3_272.png index b2a740c25..8c41b1104 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_272.png and b/TMessagesProj/src/main/assets/emoji/3_272.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_273.png b/TMessagesProj/src/main/assets/emoji/3_273.png index 5925fa664..f1699de42 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_273.png and b/TMessagesProj/src/main/assets/emoji/3_273.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_274.png b/TMessagesProj/src/main/assets/emoji/3_274.png index 78686a602..8468121fb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_274.png and b/TMessagesProj/src/main/assets/emoji/3_274.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_275.png b/TMessagesProj/src/main/assets/emoji/3_275.png index 7bf811d48..1650f5a05 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_275.png and b/TMessagesProj/src/main/assets/emoji/3_275.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_276.png b/TMessagesProj/src/main/assets/emoji/3_276.png index 2a0ad3746..d4755ab9f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_276.png and b/TMessagesProj/src/main/assets/emoji/3_276.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_277.png b/TMessagesProj/src/main/assets/emoji/3_277.png index d14cd28ee..fd241a2c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_277.png and b/TMessagesProj/src/main/assets/emoji/3_277.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_278.png b/TMessagesProj/src/main/assets/emoji/3_278.png index 26052e50b..b49bad17d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_278.png and b/TMessagesProj/src/main/assets/emoji/3_278.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_279.png b/TMessagesProj/src/main/assets/emoji/3_279.png index 63aba5690..e05ab63f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_279.png and b/TMessagesProj/src/main/assets/emoji/3_279.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_28.png b/TMessagesProj/src/main/assets/emoji/3_28.png index 88a31b62d..87225ca2f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_28.png and b/TMessagesProj/src/main/assets/emoji/3_28.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_280.png b/TMessagesProj/src/main/assets/emoji/3_280.png index d1f082320..09fa27f0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_280.png and b/TMessagesProj/src/main/assets/emoji/3_280.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_281.png b/TMessagesProj/src/main/assets/emoji/3_281.png index 491971f0b..86eccae16 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_281.png and b/TMessagesProj/src/main/assets/emoji/3_281.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_282.png b/TMessagesProj/src/main/assets/emoji/3_282.png index 39488beae..c6bd9fe45 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_282.png and b/TMessagesProj/src/main/assets/emoji/3_282.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_283.png b/TMessagesProj/src/main/assets/emoji/3_283.png index d63dbcafe..3b308fa79 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_283.png and b/TMessagesProj/src/main/assets/emoji/3_283.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_284.png b/TMessagesProj/src/main/assets/emoji/3_284.png index 2ba7e3e4e..72d51310d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_284.png and b/TMessagesProj/src/main/assets/emoji/3_284.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_285.png b/TMessagesProj/src/main/assets/emoji/3_285.png index 56d79d725..4b5cfb571 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_285.png and b/TMessagesProj/src/main/assets/emoji/3_285.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_286.png b/TMessagesProj/src/main/assets/emoji/3_286.png index bf7eb2e92..debb1d431 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_286.png and b/TMessagesProj/src/main/assets/emoji/3_286.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_287.png b/TMessagesProj/src/main/assets/emoji/3_287.png index 81135c49e..8b4873610 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_287.png and b/TMessagesProj/src/main/assets/emoji/3_287.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_288.png b/TMessagesProj/src/main/assets/emoji/3_288.png index aa34f842e..9cc03c3a1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_288.png and b/TMessagesProj/src/main/assets/emoji/3_288.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_289.png b/TMessagesProj/src/main/assets/emoji/3_289.png index 703a5ee99..f31bbe427 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_289.png and b/TMessagesProj/src/main/assets/emoji/3_289.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_29.png b/TMessagesProj/src/main/assets/emoji/3_29.png index 866aec165..08804f923 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_29.png and b/TMessagesProj/src/main/assets/emoji/3_29.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_290.png b/TMessagesProj/src/main/assets/emoji/3_290.png index b91184822..79219ea63 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_290.png and b/TMessagesProj/src/main/assets/emoji/3_290.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_291.png b/TMessagesProj/src/main/assets/emoji/3_291.png index 0821968fa..3ae0090ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_291.png and b/TMessagesProj/src/main/assets/emoji/3_291.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_292.png b/TMessagesProj/src/main/assets/emoji/3_292.png index fea80204b..cb8ee7646 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_292.png and b/TMessagesProj/src/main/assets/emoji/3_292.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_293.png b/TMessagesProj/src/main/assets/emoji/3_293.png index 6773409f3..f4ae03a39 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_293.png and b/TMessagesProj/src/main/assets/emoji/3_293.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_294.png b/TMessagesProj/src/main/assets/emoji/3_294.png index ebed28d94..bc69e4f64 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_294.png and b/TMessagesProj/src/main/assets/emoji/3_294.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_295.png b/TMessagesProj/src/main/assets/emoji/3_295.png index fb21dbcc5..131c90114 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_295.png and b/TMessagesProj/src/main/assets/emoji/3_295.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_296.png b/TMessagesProj/src/main/assets/emoji/3_296.png index 9c8740e6a..bd0214b38 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_296.png and b/TMessagesProj/src/main/assets/emoji/3_296.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_297.png b/TMessagesProj/src/main/assets/emoji/3_297.png index 5c3890705..d15600c70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_297.png and b/TMessagesProj/src/main/assets/emoji/3_297.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_298.png b/TMessagesProj/src/main/assets/emoji/3_298.png index f0dff9bb9..3af455604 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_298.png and b/TMessagesProj/src/main/assets/emoji/3_298.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_299.png b/TMessagesProj/src/main/assets/emoji/3_299.png index 0e5bb5052..ffc4f0064 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_299.png and b/TMessagesProj/src/main/assets/emoji/3_299.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_3.png b/TMessagesProj/src/main/assets/emoji/3_3.png index 768046dcc..4a9003614 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_3.png and b/TMessagesProj/src/main/assets/emoji/3_3.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_30.png b/TMessagesProj/src/main/assets/emoji/3_30.png index f44ff9d74..63ae1f564 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_30.png and b/TMessagesProj/src/main/assets/emoji/3_30.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_300.png b/TMessagesProj/src/main/assets/emoji/3_300.png index 779f341ca..ed747721f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_300.png and b/TMessagesProj/src/main/assets/emoji/3_300.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_301.png b/TMessagesProj/src/main/assets/emoji/3_301.png index bda1578c5..69e79cf68 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_301.png and b/TMessagesProj/src/main/assets/emoji/3_301.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_302.png b/TMessagesProj/src/main/assets/emoji/3_302.png index 091df7337..68328546d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_302.png and b/TMessagesProj/src/main/assets/emoji/3_302.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_303.png b/TMessagesProj/src/main/assets/emoji/3_303.png index 08194ca3c..c54bf206a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_303.png and b/TMessagesProj/src/main/assets/emoji/3_303.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_304.png b/TMessagesProj/src/main/assets/emoji/3_304.png index 3f6a5c6be..b12100140 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_304.png and b/TMessagesProj/src/main/assets/emoji/3_304.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_305.png b/TMessagesProj/src/main/assets/emoji/3_305.png index 41904dfaa..cc352daff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_305.png and b/TMessagesProj/src/main/assets/emoji/3_305.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_306.png b/TMessagesProj/src/main/assets/emoji/3_306.png index 759af0559..dd0f5a9fa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_306.png and b/TMessagesProj/src/main/assets/emoji/3_306.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_307.png b/TMessagesProj/src/main/assets/emoji/3_307.png index c8de6b674..01a68d4d6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_307.png and b/TMessagesProj/src/main/assets/emoji/3_307.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_308.png b/TMessagesProj/src/main/assets/emoji/3_308.png index f5c84dd8c..35dcddd97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_308.png and b/TMessagesProj/src/main/assets/emoji/3_308.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_309.png b/TMessagesProj/src/main/assets/emoji/3_309.png index 4aa0718a4..bae7d3fcf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_309.png and b/TMessagesProj/src/main/assets/emoji/3_309.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_31.png b/TMessagesProj/src/main/assets/emoji/3_31.png index c115c18b2..3433ae176 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_31.png and b/TMessagesProj/src/main/assets/emoji/3_31.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_310.png b/TMessagesProj/src/main/assets/emoji/3_310.png index 77291d499..e0efc6059 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_310.png and b/TMessagesProj/src/main/assets/emoji/3_310.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_311.png b/TMessagesProj/src/main/assets/emoji/3_311.png index 8db595bda..ffadf3305 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_311.png and b/TMessagesProj/src/main/assets/emoji/3_311.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_312.png b/TMessagesProj/src/main/assets/emoji/3_312.png index 66ee7a2f4..b54e77ea7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_312.png and b/TMessagesProj/src/main/assets/emoji/3_312.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_313.png b/TMessagesProj/src/main/assets/emoji/3_313.png index 351041fbd..a987c6d61 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_313.png and b/TMessagesProj/src/main/assets/emoji/3_313.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_314.png b/TMessagesProj/src/main/assets/emoji/3_314.png index 34d60b212..13965e9be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_314.png and b/TMessagesProj/src/main/assets/emoji/3_314.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_315.png b/TMessagesProj/src/main/assets/emoji/3_315.png index 29ee8c3ac..1921710c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_315.png and b/TMessagesProj/src/main/assets/emoji/3_315.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_316.png b/TMessagesProj/src/main/assets/emoji/3_316.png index 80c34cf1b..76959be29 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_316.png and b/TMessagesProj/src/main/assets/emoji/3_316.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_317.png b/TMessagesProj/src/main/assets/emoji/3_317.png index 6a61a0615..3b6830928 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_317.png and b/TMessagesProj/src/main/assets/emoji/3_317.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_318.png b/TMessagesProj/src/main/assets/emoji/3_318.png index 5a8247c54..05152f9b1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_318.png and b/TMessagesProj/src/main/assets/emoji/3_318.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_319.png b/TMessagesProj/src/main/assets/emoji/3_319.png index 83aa840d6..0bed3dfc5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_319.png and b/TMessagesProj/src/main/assets/emoji/3_319.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_32.png b/TMessagesProj/src/main/assets/emoji/3_32.png index e433eb909..d174327bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_32.png and b/TMessagesProj/src/main/assets/emoji/3_32.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_320.png b/TMessagesProj/src/main/assets/emoji/3_320.png index 83b3c0800..858cd0986 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_320.png and b/TMessagesProj/src/main/assets/emoji/3_320.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_321.png b/TMessagesProj/src/main/assets/emoji/3_321.png index e7407e9ad..bf76fd646 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_321.png and b/TMessagesProj/src/main/assets/emoji/3_321.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_322.png b/TMessagesProj/src/main/assets/emoji/3_322.png index 1f0190156..0a336e057 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_322.png and b/TMessagesProj/src/main/assets/emoji/3_322.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_323.png b/TMessagesProj/src/main/assets/emoji/3_323.png index a786f1052..1524ecc2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_323.png and b/TMessagesProj/src/main/assets/emoji/3_323.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_324.png b/TMessagesProj/src/main/assets/emoji/3_324.png index 6a856f472..ba8ce5823 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_324.png and b/TMessagesProj/src/main/assets/emoji/3_324.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_325.png b/TMessagesProj/src/main/assets/emoji/3_325.png index 34390d9da..cbf984252 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_325.png and b/TMessagesProj/src/main/assets/emoji/3_325.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_326.png b/TMessagesProj/src/main/assets/emoji/3_326.png index 28e98d958..33d578c21 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_326.png and b/TMessagesProj/src/main/assets/emoji/3_326.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_327.png b/TMessagesProj/src/main/assets/emoji/3_327.png index b87b50624..f2504f97a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_327.png and b/TMessagesProj/src/main/assets/emoji/3_327.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_328.png b/TMessagesProj/src/main/assets/emoji/3_328.png index f9c8e1b1d..fcc9a684a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_328.png and b/TMessagesProj/src/main/assets/emoji/3_328.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_329.png b/TMessagesProj/src/main/assets/emoji/3_329.png index 0156f6c90..aafc45646 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_329.png and b/TMessagesProj/src/main/assets/emoji/3_329.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_33.png b/TMessagesProj/src/main/assets/emoji/3_33.png index b18419fd5..65de70450 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_33.png and b/TMessagesProj/src/main/assets/emoji/3_33.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_330.png b/TMessagesProj/src/main/assets/emoji/3_330.png index 4795f24c1..d99b613ad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_330.png and b/TMessagesProj/src/main/assets/emoji/3_330.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_331.png b/TMessagesProj/src/main/assets/emoji/3_331.png index 0c9862232..fef751582 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_331.png and b/TMessagesProj/src/main/assets/emoji/3_331.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_332.png b/TMessagesProj/src/main/assets/emoji/3_332.png index 647f12598..55ab1b24e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_332.png and b/TMessagesProj/src/main/assets/emoji/3_332.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_333.png b/TMessagesProj/src/main/assets/emoji/3_333.png index 33b65dbf3..4a2986047 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_333.png and b/TMessagesProj/src/main/assets/emoji/3_333.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_334.png b/TMessagesProj/src/main/assets/emoji/3_334.png index 2787438c0..2452c1ac2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_334.png and b/TMessagesProj/src/main/assets/emoji/3_334.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_34.png b/TMessagesProj/src/main/assets/emoji/3_34.png index 80c9b80cc..5f8287ba6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_34.png and b/TMessagesProj/src/main/assets/emoji/3_34.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_35.png b/TMessagesProj/src/main/assets/emoji/3_35.png index cff04e682..8af3c736c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_35.png and b/TMessagesProj/src/main/assets/emoji/3_35.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_36.png b/TMessagesProj/src/main/assets/emoji/3_36.png index 6236e5541..6794f264c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_36.png and b/TMessagesProj/src/main/assets/emoji/3_36.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_37.png b/TMessagesProj/src/main/assets/emoji/3_37.png index 49e94e12e..68f77351c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_37.png and b/TMessagesProj/src/main/assets/emoji/3_37.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_38.png b/TMessagesProj/src/main/assets/emoji/3_38.png index 751c9b228..eea7bd277 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_38.png and b/TMessagesProj/src/main/assets/emoji/3_38.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_39.png b/TMessagesProj/src/main/assets/emoji/3_39.png index 0be19d16a..74c59f536 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_39.png and b/TMessagesProj/src/main/assets/emoji/3_39.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_4.png b/TMessagesProj/src/main/assets/emoji/3_4.png index 3628c9865..695bf6952 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_4.png and b/TMessagesProj/src/main/assets/emoji/3_4.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_40.png b/TMessagesProj/src/main/assets/emoji/3_40.png index b1fa8592f..4dc0908d4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_40.png and b/TMessagesProj/src/main/assets/emoji/3_40.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_41.png b/TMessagesProj/src/main/assets/emoji/3_41.png index 9b1c1f2fc..6e0da452f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_41.png and b/TMessagesProj/src/main/assets/emoji/3_41.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_42.png b/TMessagesProj/src/main/assets/emoji/3_42.png index 2c4ac7897..b307ab30a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_42.png and b/TMessagesProj/src/main/assets/emoji/3_42.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_43.png b/TMessagesProj/src/main/assets/emoji/3_43.png index 2fca47b91..732970a3f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_43.png and b/TMessagesProj/src/main/assets/emoji/3_43.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_44.png b/TMessagesProj/src/main/assets/emoji/3_44.png index e0f63dc03..cc892112a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_44.png and b/TMessagesProj/src/main/assets/emoji/3_44.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_45.png b/TMessagesProj/src/main/assets/emoji/3_45.png index b632ef625..79d3090ba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_45.png and b/TMessagesProj/src/main/assets/emoji/3_45.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_46.png b/TMessagesProj/src/main/assets/emoji/3_46.png index 0e9283b3f..1abf94d43 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_46.png and b/TMessagesProj/src/main/assets/emoji/3_46.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_47.png b/TMessagesProj/src/main/assets/emoji/3_47.png index 3d5577bc2..9903d157c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_47.png and b/TMessagesProj/src/main/assets/emoji/3_47.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_48.png b/TMessagesProj/src/main/assets/emoji/3_48.png index eaa1b9490..d312a492f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_48.png and b/TMessagesProj/src/main/assets/emoji/3_48.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_49.png b/TMessagesProj/src/main/assets/emoji/3_49.png index 454c1cccb..00b5e3517 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_49.png and b/TMessagesProj/src/main/assets/emoji/3_49.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_5.png b/TMessagesProj/src/main/assets/emoji/3_5.png index 00b29432e..fcedd7bf9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_5.png and b/TMessagesProj/src/main/assets/emoji/3_5.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_50.png b/TMessagesProj/src/main/assets/emoji/3_50.png index 6349b53a0..4373a1df7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_50.png and b/TMessagesProj/src/main/assets/emoji/3_50.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_51.png b/TMessagesProj/src/main/assets/emoji/3_51.png index f7818df72..2558a8e0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_51.png and b/TMessagesProj/src/main/assets/emoji/3_51.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_52.png b/TMessagesProj/src/main/assets/emoji/3_52.png index 553f001bd..29e35348a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_52.png and b/TMessagesProj/src/main/assets/emoji/3_52.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_53.png b/TMessagesProj/src/main/assets/emoji/3_53.png index 077bfa629..6b9862895 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_53.png and b/TMessagesProj/src/main/assets/emoji/3_53.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_54.png b/TMessagesProj/src/main/assets/emoji/3_54.png index f17618a83..232c9a6b8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_54.png and b/TMessagesProj/src/main/assets/emoji/3_54.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_55.png b/TMessagesProj/src/main/assets/emoji/3_55.png index a9aa58893..5ce1445dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_55.png and b/TMessagesProj/src/main/assets/emoji/3_55.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_56.png b/TMessagesProj/src/main/assets/emoji/3_56.png index 4e3a73a7a..25f91d4af 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_56.png and b/TMessagesProj/src/main/assets/emoji/3_56.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_57.png b/TMessagesProj/src/main/assets/emoji/3_57.png index 08b6233f7..311103eb4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_57.png and b/TMessagesProj/src/main/assets/emoji/3_57.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_58.png b/TMessagesProj/src/main/assets/emoji/3_58.png index 9e62f3e40..1a0825abf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_58.png and b/TMessagesProj/src/main/assets/emoji/3_58.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_59.png b/TMessagesProj/src/main/assets/emoji/3_59.png index e044212be..5f101c863 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_59.png and b/TMessagesProj/src/main/assets/emoji/3_59.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_6.png b/TMessagesProj/src/main/assets/emoji/3_6.png index 71745a11c..fa93a47f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_6.png and b/TMessagesProj/src/main/assets/emoji/3_6.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_60.png b/TMessagesProj/src/main/assets/emoji/3_60.png index 33c3d7ff7..351d882ea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_60.png and b/TMessagesProj/src/main/assets/emoji/3_60.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_61.png b/TMessagesProj/src/main/assets/emoji/3_61.png index e521a0e12..645af7163 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_61.png and b/TMessagesProj/src/main/assets/emoji/3_61.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_62.png b/TMessagesProj/src/main/assets/emoji/3_62.png index 7ff38f2b6..11dbe391c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_62.png and b/TMessagesProj/src/main/assets/emoji/3_62.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_63.png b/TMessagesProj/src/main/assets/emoji/3_63.png index 3b3676d17..70404e866 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_63.png and b/TMessagesProj/src/main/assets/emoji/3_63.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_64.png b/TMessagesProj/src/main/assets/emoji/3_64.png index ce94db7e5..e455878d4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_64.png and b/TMessagesProj/src/main/assets/emoji/3_64.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_65.png b/TMessagesProj/src/main/assets/emoji/3_65.png index 0f1e39ef4..5d816f1a5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_65.png and b/TMessagesProj/src/main/assets/emoji/3_65.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_66.png b/TMessagesProj/src/main/assets/emoji/3_66.png index 4e0ed910a..bc9a64cef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_66.png and b/TMessagesProj/src/main/assets/emoji/3_66.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_67.png b/TMessagesProj/src/main/assets/emoji/3_67.png index 6572fd1b3..02d4b6555 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_67.png and b/TMessagesProj/src/main/assets/emoji/3_67.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_68.png b/TMessagesProj/src/main/assets/emoji/3_68.png index d647651ed..42fea07b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_68.png and b/TMessagesProj/src/main/assets/emoji/3_68.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_69.png b/TMessagesProj/src/main/assets/emoji/3_69.png index 7f1c949a9..657f780b3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_69.png and b/TMessagesProj/src/main/assets/emoji/3_69.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_7.png b/TMessagesProj/src/main/assets/emoji/3_7.png index 1e8a4be3d..14322f8ee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_7.png and b/TMessagesProj/src/main/assets/emoji/3_7.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_70.png b/TMessagesProj/src/main/assets/emoji/3_70.png index 0af7b0d41..b94a9358d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_70.png and b/TMessagesProj/src/main/assets/emoji/3_70.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_71.png b/TMessagesProj/src/main/assets/emoji/3_71.png index 5ab7db751..ee9e49677 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_71.png and b/TMessagesProj/src/main/assets/emoji/3_71.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_72.png b/TMessagesProj/src/main/assets/emoji/3_72.png index ddf350f5e..f0991fa60 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_72.png and b/TMessagesProj/src/main/assets/emoji/3_72.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_73.png b/TMessagesProj/src/main/assets/emoji/3_73.png index 195a47d8b..6949e2122 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_73.png and b/TMessagesProj/src/main/assets/emoji/3_73.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_74.png b/TMessagesProj/src/main/assets/emoji/3_74.png index d26357bfe..7adc7eaf3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_74.png and b/TMessagesProj/src/main/assets/emoji/3_74.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_75.png b/TMessagesProj/src/main/assets/emoji/3_75.png index b04aba70f..91266ebc8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_75.png and b/TMessagesProj/src/main/assets/emoji/3_75.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_76.png b/TMessagesProj/src/main/assets/emoji/3_76.png index 798860b12..d8ad56746 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_76.png and b/TMessagesProj/src/main/assets/emoji/3_76.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_77.png b/TMessagesProj/src/main/assets/emoji/3_77.png index 57ea25a4d..0cee50303 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_77.png and b/TMessagesProj/src/main/assets/emoji/3_77.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_78.png b/TMessagesProj/src/main/assets/emoji/3_78.png index c1fdb60c2..7fc8b9882 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_78.png and b/TMessagesProj/src/main/assets/emoji/3_78.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_79.png b/TMessagesProj/src/main/assets/emoji/3_79.png index e68f6514d..249b8d2d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_79.png and b/TMessagesProj/src/main/assets/emoji/3_79.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_8.png b/TMessagesProj/src/main/assets/emoji/3_8.png index 43e7cd848..c3ccd8bbd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_8.png and b/TMessagesProj/src/main/assets/emoji/3_8.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_80.png b/TMessagesProj/src/main/assets/emoji/3_80.png index 5d738626e..8f16bab4d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_80.png and b/TMessagesProj/src/main/assets/emoji/3_80.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_81.png b/TMessagesProj/src/main/assets/emoji/3_81.png index e22e6c631..249d6e15a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_81.png and b/TMessagesProj/src/main/assets/emoji/3_81.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_82.png b/TMessagesProj/src/main/assets/emoji/3_82.png index be4000cac..a0145319c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_82.png and b/TMessagesProj/src/main/assets/emoji/3_82.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_83.png b/TMessagesProj/src/main/assets/emoji/3_83.png index 2d79f5097..82fe362d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_83.png and b/TMessagesProj/src/main/assets/emoji/3_83.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_84.png b/TMessagesProj/src/main/assets/emoji/3_84.png index c7cf7ef15..316fadb68 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_84.png and b/TMessagesProj/src/main/assets/emoji/3_84.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_85.png b/TMessagesProj/src/main/assets/emoji/3_85.png index 39e8ecbfe..1c4b9be0d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_85.png and b/TMessagesProj/src/main/assets/emoji/3_85.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_86.png b/TMessagesProj/src/main/assets/emoji/3_86.png index b7edc79b2..a70606098 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_86.png and b/TMessagesProj/src/main/assets/emoji/3_86.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_87.png b/TMessagesProj/src/main/assets/emoji/3_87.png index fab5832ce..86a429ec9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_87.png and b/TMessagesProj/src/main/assets/emoji/3_87.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_88.png b/TMessagesProj/src/main/assets/emoji/3_88.png index f8e81b15f..27f8970bb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_88.png and b/TMessagesProj/src/main/assets/emoji/3_88.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_89.png b/TMessagesProj/src/main/assets/emoji/3_89.png index 36bf47bb0..d709287c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_89.png and b/TMessagesProj/src/main/assets/emoji/3_89.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_9.png b/TMessagesProj/src/main/assets/emoji/3_9.png index 098d3df72..b3fb16ca4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_9.png and b/TMessagesProj/src/main/assets/emoji/3_9.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_90.png b/TMessagesProj/src/main/assets/emoji/3_90.png index 947cfd5dd..b8017e4ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_90.png and b/TMessagesProj/src/main/assets/emoji/3_90.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_91.png b/TMessagesProj/src/main/assets/emoji/3_91.png index 80ee88b6c..32659977a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_91.png and b/TMessagesProj/src/main/assets/emoji/3_91.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_92.png b/TMessagesProj/src/main/assets/emoji/3_92.png index a8fae1408..88010e31c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_92.png and b/TMessagesProj/src/main/assets/emoji/3_92.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_93.png b/TMessagesProj/src/main/assets/emoji/3_93.png index 8124403ed..275460926 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_93.png and b/TMessagesProj/src/main/assets/emoji/3_93.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_94.png b/TMessagesProj/src/main/assets/emoji/3_94.png index bbd5c825e..7a55c2c66 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_94.png and b/TMessagesProj/src/main/assets/emoji/3_94.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_95.png b/TMessagesProj/src/main/assets/emoji/3_95.png index aa99b7a22..74dffe7ec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_95.png and b/TMessagesProj/src/main/assets/emoji/3_95.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_96.png b/TMessagesProj/src/main/assets/emoji/3_96.png index 87f4db552..fc56b41d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_96.png and b/TMessagesProj/src/main/assets/emoji/3_96.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_97.png b/TMessagesProj/src/main/assets/emoji/3_97.png index 49b75273b..f02c4b09f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_97.png and b/TMessagesProj/src/main/assets/emoji/3_97.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_98.png b/TMessagesProj/src/main/assets/emoji/3_98.png index 12916b782..ca158ef13 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_98.png and b/TMessagesProj/src/main/assets/emoji/3_98.png differ diff --git a/TMessagesProj/src/main/assets/emoji/3_99.png b/TMessagesProj/src/main/assets/emoji/3_99.png index 14e1c90f8..992699b5f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/3_99.png and b/TMessagesProj/src/main/assets/emoji/3_99.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_0.png b/TMessagesProj/src/main/assets/emoji/4_0.png index b456d0ff6..bb8c3e8e8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_0.png and b/TMessagesProj/src/main/assets/emoji/4_0.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_1.png b/TMessagesProj/src/main/assets/emoji/4_1.png index 65847b0fd..46648ed3e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_1.png and b/TMessagesProj/src/main/assets/emoji/4_1.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_10.png b/TMessagesProj/src/main/assets/emoji/4_10.png index 146085cc8..eee12240b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_10.png and b/TMessagesProj/src/main/assets/emoji/4_10.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_100.png b/TMessagesProj/src/main/assets/emoji/4_100.png index bf91cfcb1..0db12cf3a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_100.png and b/TMessagesProj/src/main/assets/emoji/4_100.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_101.png b/TMessagesProj/src/main/assets/emoji/4_101.png index 8a4998ec9..f7b4163af 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_101.png and b/TMessagesProj/src/main/assets/emoji/4_101.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_102.png b/TMessagesProj/src/main/assets/emoji/4_102.png index 901a9ccc3..db45ac119 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_102.png and b/TMessagesProj/src/main/assets/emoji/4_102.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_103.png b/TMessagesProj/src/main/assets/emoji/4_103.png index 36953e3ad..cb7290083 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_103.png and b/TMessagesProj/src/main/assets/emoji/4_103.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_104.png b/TMessagesProj/src/main/assets/emoji/4_104.png index 37bf48f0f..a33ee1b86 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_104.png and b/TMessagesProj/src/main/assets/emoji/4_104.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_105.png b/TMessagesProj/src/main/assets/emoji/4_105.png index 87cf13140..e992cda8b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_105.png and b/TMessagesProj/src/main/assets/emoji/4_105.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_106.png b/TMessagesProj/src/main/assets/emoji/4_106.png index 82ad413c3..c0da28c0d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_106.png and b/TMessagesProj/src/main/assets/emoji/4_106.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_107.png b/TMessagesProj/src/main/assets/emoji/4_107.png index bbdbb81db..b1931f957 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_107.png and b/TMessagesProj/src/main/assets/emoji/4_107.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_108.png b/TMessagesProj/src/main/assets/emoji/4_108.png index db9f1daad..c763e8028 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_108.png and b/TMessagesProj/src/main/assets/emoji/4_108.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_109.png b/TMessagesProj/src/main/assets/emoji/4_109.png index 05fa25398..35432f951 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_109.png and b/TMessagesProj/src/main/assets/emoji/4_109.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_11.png b/TMessagesProj/src/main/assets/emoji/4_11.png index 81bbadff7..a348eb797 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_11.png and b/TMessagesProj/src/main/assets/emoji/4_11.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_110.png b/TMessagesProj/src/main/assets/emoji/4_110.png index 7bf517186..3dcc6521d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_110.png and b/TMessagesProj/src/main/assets/emoji/4_110.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_111.png b/TMessagesProj/src/main/assets/emoji/4_111.png index e6b12c4d1..71acb6621 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_111.png and b/TMessagesProj/src/main/assets/emoji/4_111.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_112.png b/TMessagesProj/src/main/assets/emoji/4_112.png index df9621670..4d0abfb94 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_112.png and b/TMessagesProj/src/main/assets/emoji/4_112.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_113.png b/TMessagesProj/src/main/assets/emoji/4_113.png index 88e8358e1..f9e3558ba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_113.png and b/TMessagesProj/src/main/assets/emoji/4_113.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_114.png b/TMessagesProj/src/main/assets/emoji/4_114.png index c3a5c5cbf..fb6631c05 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_114.png and b/TMessagesProj/src/main/assets/emoji/4_114.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_115.png b/TMessagesProj/src/main/assets/emoji/4_115.png index c9a911f49..d36d3adc5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_115.png and b/TMessagesProj/src/main/assets/emoji/4_115.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_116.png b/TMessagesProj/src/main/assets/emoji/4_116.png index f79ce5abf..4f19d97f9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_116.png and b/TMessagesProj/src/main/assets/emoji/4_116.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_117.png b/TMessagesProj/src/main/assets/emoji/4_117.png index 89369867a..de4bb5eba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_117.png and b/TMessagesProj/src/main/assets/emoji/4_117.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_118.png b/TMessagesProj/src/main/assets/emoji/4_118.png index 05960a479..f403a9a34 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_118.png and b/TMessagesProj/src/main/assets/emoji/4_118.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_119.png b/TMessagesProj/src/main/assets/emoji/4_119.png index 07adfc178..9d4b3a9ab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_119.png and b/TMessagesProj/src/main/assets/emoji/4_119.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_12.png b/TMessagesProj/src/main/assets/emoji/4_12.png index 8eb37aaeb..478a09d34 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_12.png and b/TMessagesProj/src/main/assets/emoji/4_12.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_120.png b/TMessagesProj/src/main/assets/emoji/4_120.png index d11b5727b..813601169 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_120.png and b/TMessagesProj/src/main/assets/emoji/4_120.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_121.png b/TMessagesProj/src/main/assets/emoji/4_121.png index 29d12d33e..fb7eec162 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_121.png and b/TMessagesProj/src/main/assets/emoji/4_121.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_122.png b/TMessagesProj/src/main/assets/emoji/4_122.png index 3f0b2fb19..f39a415af 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_122.png and b/TMessagesProj/src/main/assets/emoji/4_122.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_123.png b/TMessagesProj/src/main/assets/emoji/4_123.png index 934a11404..e7e520132 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_123.png and b/TMessagesProj/src/main/assets/emoji/4_123.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_124.png b/TMessagesProj/src/main/assets/emoji/4_124.png index 70693fb4c..f73c9a046 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_124.png and b/TMessagesProj/src/main/assets/emoji/4_124.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_125.png b/TMessagesProj/src/main/assets/emoji/4_125.png index 1d8aefa08..4431df56b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_125.png and b/TMessagesProj/src/main/assets/emoji/4_125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_126.png b/TMessagesProj/src/main/assets/emoji/4_126.png index 19589cd71..156ace02e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_126.png and b/TMessagesProj/src/main/assets/emoji/4_126.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_127.png b/TMessagesProj/src/main/assets/emoji/4_127.png index 74a62996b..cf772cba2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_127.png and b/TMessagesProj/src/main/assets/emoji/4_127.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_128.png b/TMessagesProj/src/main/assets/emoji/4_128.png index d1a204e3c..232aa10b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_128.png and b/TMessagesProj/src/main/assets/emoji/4_128.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_129.png b/TMessagesProj/src/main/assets/emoji/4_129.png index 2e5bc98b6..849b62fef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_129.png and b/TMessagesProj/src/main/assets/emoji/4_129.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_13.png b/TMessagesProj/src/main/assets/emoji/4_13.png index 9f1f5b4a0..a6f2c2a46 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_13.png and b/TMessagesProj/src/main/assets/emoji/4_13.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_130.png b/TMessagesProj/src/main/assets/emoji/4_130.png index b0120242c..eb392deb5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_130.png and b/TMessagesProj/src/main/assets/emoji/4_130.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_14.png b/TMessagesProj/src/main/assets/emoji/4_14.png index 39b2dca5c..254d01d22 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_14.png and b/TMessagesProj/src/main/assets/emoji/4_14.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_15.png b/TMessagesProj/src/main/assets/emoji/4_15.png index ebc92cd43..513f8a459 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_15.png and b/TMessagesProj/src/main/assets/emoji/4_15.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_16.png b/TMessagesProj/src/main/assets/emoji/4_16.png index a6beedfb7..5ee81a6f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_16.png and b/TMessagesProj/src/main/assets/emoji/4_16.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_17.png b/TMessagesProj/src/main/assets/emoji/4_17.png index 542989853..554925226 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_17.png and b/TMessagesProj/src/main/assets/emoji/4_17.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_18.png b/TMessagesProj/src/main/assets/emoji/4_18.png index 9fb2cd928..02c00cf55 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_18.png and b/TMessagesProj/src/main/assets/emoji/4_18.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_19.png b/TMessagesProj/src/main/assets/emoji/4_19.png index 398eb1107..2b7a109d4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_19.png and b/TMessagesProj/src/main/assets/emoji/4_19.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_2.png b/TMessagesProj/src/main/assets/emoji/4_2.png index 994050b5c..a3f6c690f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_2.png and b/TMessagesProj/src/main/assets/emoji/4_2.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_20.png b/TMessagesProj/src/main/assets/emoji/4_20.png index c1b8f6050..71536ca14 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_20.png and b/TMessagesProj/src/main/assets/emoji/4_20.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_21.png b/TMessagesProj/src/main/assets/emoji/4_21.png index 5767bb25d..61a3645da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_21.png and b/TMessagesProj/src/main/assets/emoji/4_21.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_22.png b/TMessagesProj/src/main/assets/emoji/4_22.png index c93e24c47..b4a01b55a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_22.png and b/TMessagesProj/src/main/assets/emoji/4_22.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_23.png b/TMessagesProj/src/main/assets/emoji/4_23.png index 1475777df..413fa2d4d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_23.png and b/TMessagesProj/src/main/assets/emoji/4_23.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_24.png b/TMessagesProj/src/main/assets/emoji/4_24.png index 575002a8c..a8f74de40 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_24.png and b/TMessagesProj/src/main/assets/emoji/4_24.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_25.png b/TMessagesProj/src/main/assets/emoji/4_25.png index 5e272a961..360c35d00 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_25.png and b/TMessagesProj/src/main/assets/emoji/4_25.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_26.png b/TMessagesProj/src/main/assets/emoji/4_26.png index 989cdbeb9..a5e48da56 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_26.png and b/TMessagesProj/src/main/assets/emoji/4_26.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_27.png b/TMessagesProj/src/main/assets/emoji/4_27.png index 31d92f16b..0395db817 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_27.png and b/TMessagesProj/src/main/assets/emoji/4_27.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_28.png b/TMessagesProj/src/main/assets/emoji/4_28.png index 300d3037c..de4164952 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_28.png and b/TMessagesProj/src/main/assets/emoji/4_28.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_29.png b/TMessagesProj/src/main/assets/emoji/4_29.png index e2f92c311..ebe9d3cf4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_29.png and b/TMessagesProj/src/main/assets/emoji/4_29.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_3.png b/TMessagesProj/src/main/assets/emoji/4_3.png index 182c9f49c..f096ff968 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_3.png and b/TMessagesProj/src/main/assets/emoji/4_3.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_30.png b/TMessagesProj/src/main/assets/emoji/4_30.png index ba75f84b9..bc4d1b2b4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_30.png and b/TMessagesProj/src/main/assets/emoji/4_30.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_31.png b/TMessagesProj/src/main/assets/emoji/4_31.png index 523b8625e..713818221 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_31.png and b/TMessagesProj/src/main/assets/emoji/4_31.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_32.png b/TMessagesProj/src/main/assets/emoji/4_32.png index d153d90d6..8af55abf8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_32.png and b/TMessagesProj/src/main/assets/emoji/4_32.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_33.png b/TMessagesProj/src/main/assets/emoji/4_33.png index 6b8672dbc..96ef2414d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_33.png and b/TMessagesProj/src/main/assets/emoji/4_33.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_34.png b/TMessagesProj/src/main/assets/emoji/4_34.png index dc540d11b..1c886faa6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_34.png and b/TMessagesProj/src/main/assets/emoji/4_34.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_35.png b/TMessagesProj/src/main/assets/emoji/4_35.png index 2cca9eb2b..7fb94fc9f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_35.png and b/TMessagesProj/src/main/assets/emoji/4_35.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_36.png b/TMessagesProj/src/main/assets/emoji/4_36.png index e451b1bcd..4492c4a39 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_36.png and b/TMessagesProj/src/main/assets/emoji/4_36.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_37.png b/TMessagesProj/src/main/assets/emoji/4_37.png index bfc190fb7..8aca72cbd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_37.png and b/TMessagesProj/src/main/assets/emoji/4_37.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_38.png b/TMessagesProj/src/main/assets/emoji/4_38.png index 7421cc765..fdcb373a8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_38.png and b/TMessagesProj/src/main/assets/emoji/4_38.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_39.png b/TMessagesProj/src/main/assets/emoji/4_39.png index c6ed9b9aa..99a2703a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_39.png and b/TMessagesProj/src/main/assets/emoji/4_39.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_4.png b/TMessagesProj/src/main/assets/emoji/4_4.png index 13c890342..ab829decc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_4.png and b/TMessagesProj/src/main/assets/emoji/4_4.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_40.png b/TMessagesProj/src/main/assets/emoji/4_40.png index 53256c5f6..cdbdffbad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_40.png and b/TMessagesProj/src/main/assets/emoji/4_40.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_41.png b/TMessagesProj/src/main/assets/emoji/4_41.png index c3865134c..c94ab0a32 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_41.png and b/TMessagesProj/src/main/assets/emoji/4_41.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_42.png b/TMessagesProj/src/main/assets/emoji/4_42.png index 4f5ec469d..4d5bdc6b1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_42.png and b/TMessagesProj/src/main/assets/emoji/4_42.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_43.png b/TMessagesProj/src/main/assets/emoji/4_43.png index 1e3a0d1f7..658f97519 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_43.png and b/TMessagesProj/src/main/assets/emoji/4_43.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_44.png b/TMessagesProj/src/main/assets/emoji/4_44.png index e8b4eed69..f70b382e4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_44.png and b/TMessagesProj/src/main/assets/emoji/4_44.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_45.png b/TMessagesProj/src/main/assets/emoji/4_45.png index d5d0fe7d1..5a412685a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_45.png and b/TMessagesProj/src/main/assets/emoji/4_45.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_46.png b/TMessagesProj/src/main/assets/emoji/4_46.png index 38c7b7e93..56a2169a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_46.png and b/TMessagesProj/src/main/assets/emoji/4_46.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_47.png b/TMessagesProj/src/main/assets/emoji/4_47.png index 216c3c17c..7e7ade3c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_47.png and b/TMessagesProj/src/main/assets/emoji/4_47.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_48.png b/TMessagesProj/src/main/assets/emoji/4_48.png index eebe5332c..7be7cd9cd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_48.png and b/TMessagesProj/src/main/assets/emoji/4_48.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_49.png b/TMessagesProj/src/main/assets/emoji/4_49.png index 910f55c3d..1b8117936 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_49.png and b/TMessagesProj/src/main/assets/emoji/4_49.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_5.png b/TMessagesProj/src/main/assets/emoji/4_5.png index 1b1927c00..0f0940ed6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_5.png and b/TMessagesProj/src/main/assets/emoji/4_5.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_50.png b/TMessagesProj/src/main/assets/emoji/4_50.png index cf5481fc5..36cce2864 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_50.png and b/TMessagesProj/src/main/assets/emoji/4_50.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_51.png b/TMessagesProj/src/main/assets/emoji/4_51.png index b0cc84afc..f6f837891 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_51.png and b/TMessagesProj/src/main/assets/emoji/4_51.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_52.png b/TMessagesProj/src/main/assets/emoji/4_52.png index 313704f1b..5a7e76160 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_52.png and b/TMessagesProj/src/main/assets/emoji/4_52.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_53.png b/TMessagesProj/src/main/assets/emoji/4_53.png index 08e7bb743..a5105f0b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_53.png and b/TMessagesProj/src/main/assets/emoji/4_53.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_54.png b/TMessagesProj/src/main/assets/emoji/4_54.png index e04f75041..7db12713f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_54.png and b/TMessagesProj/src/main/assets/emoji/4_54.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_55.png b/TMessagesProj/src/main/assets/emoji/4_55.png index c3494d142..d1abdd029 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_55.png and b/TMessagesProj/src/main/assets/emoji/4_55.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_56.png b/TMessagesProj/src/main/assets/emoji/4_56.png index 08928f07b..7681cf7f1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_56.png and b/TMessagesProj/src/main/assets/emoji/4_56.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_57.png b/TMessagesProj/src/main/assets/emoji/4_57.png index 437f53993..eef0dad02 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_57.png and b/TMessagesProj/src/main/assets/emoji/4_57.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_58.png b/TMessagesProj/src/main/assets/emoji/4_58.png index f01267041..6c5cd4fd6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_58.png and b/TMessagesProj/src/main/assets/emoji/4_58.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_59.png b/TMessagesProj/src/main/assets/emoji/4_59.png index f6d660235..1b681d9c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_59.png and b/TMessagesProj/src/main/assets/emoji/4_59.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_6.png b/TMessagesProj/src/main/assets/emoji/4_6.png index f385da2c8..ca2a20d5b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_6.png and b/TMessagesProj/src/main/assets/emoji/4_6.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_60.png b/TMessagesProj/src/main/assets/emoji/4_60.png index 36722d5f8..42dfc2f51 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_60.png and b/TMessagesProj/src/main/assets/emoji/4_60.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_61.png b/TMessagesProj/src/main/assets/emoji/4_61.png index 4a77fef12..d65fd1ec6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_61.png and b/TMessagesProj/src/main/assets/emoji/4_61.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_62.png b/TMessagesProj/src/main/assets/emoji/4_62.png index 97893f55c..973d06213 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_62.png and b/TMessagesProj/src/main/assets/emoji/4_62.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_63.png b/TMessagesProj/src/main/assets/emoji/4_63.png index 684510fbb..2d2c4df82 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_63.png and b/TMessagesProj/src/main/assets/emoji/4_63.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_64.png b/TMessagesProj/src/main/assets/emoji/4_64.png index 296cf4984..c1af39ea7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_64.png and b/TMessagesProj/src/main/assets/emoji/4_64.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_65.png b/TMessagesProj/src/main/assets/emoji/4_65.png index c2caf78b8..3fbc2b66b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_65.png and b/TMessagesProj/src/main/assets/emoji/4_65.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_66.png b/TMessagesProj/src/main/assets/emoji/4_66.png index 6628549db..134c4a22e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_66.png and b/TMessagesProj/src/main/assets/emoji/4_66.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_67.png b/TMessagesProj/src/main/assets/emoji/4_67.png index 4c6a78179..e78ba16de 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_67.png and b/TMessagesProj/src/main/assets/emoji/4_67.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_68.png b/TMessagesProj/src/main/assets/emoji/4_68.png index 29a145a00..ae50116f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_68.png and b/TMessagesProj/src/main/assets/emoji/4_68.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_69.png b/TMessagesProj/src/main/assets/emoji/4_69.png index f11ad9b4a..d007b4b06 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_69.png and b/TMessagesProj/src/main/assets/emoji/4_69.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_7.png b/TMessagesProj/src/main/assets/emoji/4_7.png index 21203ce17..c08269555 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_7.png and b/TMessagesProj/src/main/assets/emoji/4_7.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_70.png b/TMessagesProj/src/main/assets/emoji/4_70.png index ffe66691b..0475ec48e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_70.png and b/TMessagesProj/src/main/assets/emoji/4_70.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_71.png b/TMessagesProj/src/main/assets/emoji/4_71.png index 7236f13c1..0c363cbcb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_71.png and b/TMessagesProj/src/main/assets/emoji/4_71.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_72.png b/TMessagesProj/src/main/assets/emoji/4_72.png index f07323737..cbde3751a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_72.png and b/TMessagesProj/src/main/assets/emoji/4_72.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_73.png b/TMessagesProj/src/main/assets/emoji/4_73.png index 82e24d56e..b98266197 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_73.png and b/TMessagesProj/src/main/assets/emoji/4_73.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_74.png b/TMessagesProj/src/main/assets/emoji/4_74.png index ad0a18979..2f915c52a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_74.png and b/TMessagesProj/src/main/assets/emoji/4_74.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_75.png b/TMessagesProj/src/main/assets/emoji/4_75.png index 4943e8c26..b0ba1b380 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_75.png and b/TMessagesProj/src/main/assets/emoji/4_75.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_76.png b/TMessagesProj/src/main/assets/emoji/4_76.png index b3d95f344..6990f789f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_76.png and b/TMessagesProj/src/main/assets/emoji/4_76.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_77.png b/TMessagesProj/src/main/assets/emoji/4_77.png index b263ed1d8..7b0e638bd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_77.png and b/TMessagesProj/src/main/assets/emoji/4_77.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_78.png b/TMessagesProj/src/main/assets/emoji/4_78.png index 094c447d7..23f635331 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_78.png and b/TMessagesProj/src/main/assets/emoji/4_78.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_79.png b/TMessagesProj/src/main/assets/emoji/4_79.png index 5cf23e8e6..da6aa4c80 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_79.png and b/TMessagesProj/src/main/assets/emoji/4_79.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_8.png b/TMessagesProj/src/main/assets/emoji/4_8.png index a79de7e1b..f854a2e89 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_8.png and b/TMessagesProj/src/main/assets/emoji/4_8.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_80.png b/TMessagesProj/src/main/assets/emoji/4_80.png index 8653166f3..1b9e315a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_80.png and b/TMessagesProj/src/main/assets/emoji/4_80.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_81.png b/TMessagesProj/src/main/assets/emoji/4_81.png index 297e518a6..5b6aae026 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_81.png and b/TMessagesProj/src/main/assets/emoji/4_81.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_82.png b/TMessagesProj/src/main/assets/emoji/4_82.png index bc750ac46..a448ca060 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_82.png and b/TMessagesProj/src/main/assets/emoji/4_82.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_83.png b/TMessagesProj/src/main/assets/emoji/4_83.png index 24c2eb8e3..715eb0506 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_83.png and b/TMessagesProj/src/main/assets/emoji/4_83.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_84.png b/TMessagesProj/src/main/assets/emoji/4_84.png index 271a66bdc..9643f8cbf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_84.png and b/TMessagesProj/src/main/assets/emoji/4_84.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_85.png b/TMessagesProj/src/main/assets/emoji/4_85.png index 3be1ef63d..110367a7b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_85.png and b/TMessagesProj/src/main/assets/emoji/4_85.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_86.png b/TMessagesProj/src/main/assets/emoji/4_86.png index 15f180cc8..829ed1cef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_86.png and b/TMessagesProj/src/main/assets/emoji/4_86.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_87.png b/TMessagesProj/src/main/assets/emoji/4_87.png index 4d77510c3..5e568c7c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_87.png and b/TMessagesProj/src/main/assets/emoji/4_87.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_88.png b/TMessagesProj/src/main/assets/emoji/4_88.png index 4ed75e345..313678437 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_88.png and b/TMessagesProj/src/main/assets/emoji/4_88.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_89.png b/TMessagesProj/src/main/assets/emoji/4_89.png index 9d65c33f5..157cf24d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_89.png and b/TMessagesProj/src/main/assets/emoji/4_89.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_9.png b/TMessagesProj/src/main/assets/emoji/4_9.png index eb20e19d8..fb5a7c3db 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_9.png and b/TMessagesProj/src/main/assets/emoji/4_9.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_90.png b/TMessagesProj/src/main/assets/emoji/4_90.png index 8ddf4e8fb..2bd8e4350 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_90.png and b/TMessagesProj/src/main/assets/emoji/4_90.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_91.png b/TMessagesProj/src/main/assets/emoji/4_91.png index 2d1b58d35..289d5edc1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_91.png and b/TMessagesProj/src/main/assets/emoji/4_91.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_92.png b/TMessagesProj/src/main/assets/emoji/4_92.png index a07cfd7c0..8695f5790 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_92.png and b/TMessagesProj/src/main/assets/emoji/4_92.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_93.png b/TMessagesProj/src/main/assets/emoji/4_93.png index 63ac6b909..76f30d53b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_93.png and b/TMessagesProj/src/main/assets/emoji/4_93.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_94.png b/TMessagesProj/src/main/assets/emoji/4_94.png index 11e25a6e7..299a59b50 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_94.png and b/TMessagesProj/src/main/assets/emoji/4_94.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_95.png b/TMessagesProj/src/main/assets/emoji/4_95.png index 33c7cfd69..551f11163 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_95.png and b/TMessagesProj/src/main/assets/emoji/4_95.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_96.png b/TMessagesProj/src/main/assets/emoji/4_96.png index 656921432..eb04ca7f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_96.png and b/TMessagesProj/src/main/assets/emoji/4_96.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_97.png b/TMessagesProj/src/main/assets/emoji/4_97.png index d1df82cd6..7a7611081 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_97.png and b/TMessagesProj/src/main/assets/emoji/4_97.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_98.png b/TMessagesProj/src/main/assets/emoji/4_98.png index fa8b416d0..29b1749f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_98.png and b/TMessagesProj/src/main/assets/emoji/4_98.png differ diff --git a/TMessagesProj/src/main/assets/emoji/4_99.png b/TMessagesProj/src/main/assets/emoji/4_99.png index 36bd9be68..e0dd25fd6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/4_99.png and b/TMessagesProj/src/main/assets/emoji/4_99.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_0.png b/TMessagesProj/src/main/assets/emoji/5_0.png index 795101aac..5e450837b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_0.png and b/TMessagesProj/src/main/assets/emoji/5_0.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_1.png b/TMessagesProj/src/main/assets/emoji/5_1.png index 5a718a68a..b63c8a045 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_1.png and b/TMessagesProj/src/main/assets/emoji/5_1.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_10.png b/TMessagesProj/src/main/assets/emoji/5_10.png index 0d4e9d831..134a2dcc4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_10.png and b/TMessagesProj/src/main/assets/emoji/5_10.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_100.png b/TMessagesProj/src/main/assets/emoji/5_100.png index ba02acfa4..8d73ccc25 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_100.png and b/TMessagesProj/src/main/assets/emoji/5_100.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_101.png b/TMessagesProj/src/main/assets/emoji/5_101.png index 95c537885..9cf676c88 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_101.png and b/TMessagesProj/src/main/assets/emoji/5_101.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_102.png b/TMessagesProj/src/main/assets/emoji/5_102.png index b54b9dbf0..1d7c01e53 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_102.png and b/TMessagesProj/src/main/assets/emoji/5_102.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_103.png b/TMessagesProj/src/main/assets/emoji/5_103.png index 3e9edafd6..e09831a0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_103.png and b/TMessagesProj/src/main/assets/emoji/5_103.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_104.png b/TMessagesProj/src/main/assets/emoji/5_104.png index 80b7d65b8..36e95797b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_104.png and b/TMessagesProj/src/main/assets/emoji/5_104.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_105.png b/TMessagesProj/src/main/assets/emoji/5_105.png index 1e7fb7bbc..6b670e570 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_105.png and b/TMessagesProj/src/main/assets/emoji/5_105.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_106.png b/TMessagesProj/src/main/assets/emoji/5_106.png index 4181e2d07..c426475e7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_106.png and b/TMessagesProj/src/main/assets/emoji/5_106.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_107.png b/TMessagesProj/src/main/assets/emoji/5_107.png index a859115b1..78b704d39 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_107.png and b/TMessagesProj/src/main/assets/emoji/5_107.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_108.png b/TMessagesProj/src/main/assets/emoji/5_108.png index 6d59221f5..3b10ba4e5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_108.png and b/TMessagesProj/src/main/assets/emoji/5_108.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_109.png b/TMessagesProj/src/main/assets/emoji/5_109.png index 17b732fd2..31ecb69e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_109.png and b/TMessagesProj/src/main/assets/emoji/5_109.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_11.png b/TMessagesProj/src/main/assets/emoji/5_11.png index e1697ff68..b3e370b11 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_11.png and b/TMessagesProj/src/main/assets/emoji/5_11.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_110.png b/TMessagesProj/src/main/assets/emoji/5_110.png index 7b5fe6576..8acccf117 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_110.png and b/TMessagesProj/src/main/assets/emoji/5_110.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_111.png b/TMessagesProj/src/main/assets/emoji/5_111.png index a6d2a5555..d8115e7d3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_111.png and b/TMessagesProj/src/main/assets/emoji/5_111.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_112.png b/TMessagesProj/src/main/assets/emoji/5_112.png index c92293bed..4c59ad98a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_112.png and b/TMessagesProj/src/main/assets/emoji/5_112.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_113.png b/TMessagesProj/src/main/assets/emoji/5_113.png index c0d09b11a..2111c66b1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_113.png and b/TMessagesProj/src/main/assets/emoji/5_113.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_114.png b/TMessagesProj/src/main/assets/emoji/5_114.png index 237beff27..9a9c35658 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_114.png and b/TMessagesProj/src/main/assets/emoji/5_114.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_115.png b/TMessagesProj/src/main/assets/emoji/5_115.png index 787cb5a42..64fc0f7e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_115.png and b/TMessagesProj/src/main/assets/emoji/5_115.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_116.png b/TMessagesProj/src/main/assets/emoji/5_116.png index 18fbb190a..ac06e135d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_116.png and b/TMessagesProj/src/main/assets/emoji/5_116.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_117.png b/TMessagesProj/src/main/assets/emoji/5_117.png index 34db62ca6..c7ce188ea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_117.png and b/TMessagesProj/src/main/assets/emoji/5_117.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_118.png b/TMessagesProj/src/main/assets/emoji/5_118.png index 67987c3c7..b7b689340 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_118.png and b/TMessagesProj/src/main/assets/emoji/5_118.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_119.png b/TMessagesProj/src/main/assets/emoji/5_119.png index 1c59a1edd..c134e3ee5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_119.png and b/TMessagesProj/src/main/assets/emoji/5_119.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_12.png b/TMessagesProj/src/main/assets/emoji/5_12.png index 28b6d5668..29eaf6652 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_12.png and b/TMessagesProj/src/main/assets/emoji/5_12.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_120.png b/TMessagesProj/src/main/assets/emoji/5_120.png index bec63ad89..3d5aa23ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_120.png and b/TMessagesProj/src/main/assets/emoji/5_120.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_121.png b/TMessagesProj/src/main/assets/emoji/5_121.png index 95ac13f9e..1792de937 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_121.png and b/TMessagesProj/src/main/assets/emoji/5_121.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_122.png b/TMessagesProj/src/main/assets/emoji/5_122.png index 3e08f7b89..a6a2a5538 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_122.png and b/TMessagesProj/src/main/assets/emoji/5_122.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_123.png b/TMessagesProj/src/main/assets/emoji/5_123.png index da21a6937..066e0c7aa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_123.png and b/TMessagesProj/src/main/assets/emoji/5_123.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_124.png b/TMessagesProj/src/main/assets/emoji/5_124.png index 700d41c41..fe12e766d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_124.png and b/TMessagesProj/src/main/assets/emoji/5_124.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_125.png b/TMessagesProj/src/main/assets/emoji/5_125.png index 9aad305e5..dc44ba47c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_125.png and b/TMessagesProj/src/main/assets/emoji/5_125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_126.png b/TMessagesProj/src/main/assets/emoji/5_126.png index c91b5d8da..5c0b43597 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_126.png and b/TMessagesProj/src/main/assets/emoji/5_126.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_127.png b/TMessagesProj/src/main/assets/emoji/5_127.png index 384173576..e029f552f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_127.png and b/TMessagesProj/src/main/assets/emoji/5_127.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_128.png b/TMessagesProj/src/main/assets/emoji/5_128.png index 461073a46..85519765c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_128.png and b/TMessagesProj/src/main/assets/emoji/5_128.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_129.png b/TMessagesProj/src/main/assets/emoji/5_129.png index 3bf75851a..94477085f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_129.png and b/TMessagesProj/src/main/assets/emoji/5_129.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_13.png b/TMessagesProj/src/main/assets/emoji/5_13.png index d079a8cd9..064e187c0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_13.png and b/TMessagesProj/src/main/assets/emoji/5_13.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_130.png b/TMessagesProj/src/main/assets/emoji/5_130.png index c12835831..e091254b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_130.png and b/TMessagesProj/src/main/assets/emoji/5_130.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_131.png b/TMessagesProj/src/main/assets/emoji/5_131.png index 90adb5dd7..5505af987 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_131.png and b/TMessagesProj/src/main/assets/emoji/5_131.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_132.png b/TMessagesProj/src/main/assets/emoji/5_132.png index 7c5197306..5adaba2d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_132.png and b/TMessagesProj/src/main/assets/emoji/5_132.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_133.png b/TMessagesProj/src/main/assets/emoji/5_133.png index a025b04a8..0acbac67d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_133.png and b/TMessagesProj/src/main/assets/emoji/5_133.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_134.png b/TMessagesProj/src/main/assets/emoji/5_134.png index 3342dd6fa..21d9fc92b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_134.png and b/TMessagesProj/src/main/assets/emoji/5_134.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_135.png b/TMessagesProj/src/main/assets/emoji/5_135.png index 561d61f4b..db7e9f49d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_135.png and b/TMessagesProj/src/main/assets/emoji/5_135.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_136.png b/TMessagesProj/src/main/assets/emoji/5_136.png index c4ec12bac..b0ea3e0e0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_136.png and b/TMessagesProj/src/main/assets/emoji/5_136.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_137.png b/TMessagesProj/src/main/assets/emoji/5_137.png index ceaff8817..5bc76ec6f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_137.png and b/TMessagesProj/src/main/assets/emoji/5_137.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_138.png b/TMessagesProj/src/main/assets/emoji/5_138.png index ab0e6ab69..3e2dfcc63 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_138.png and b/TMessagesProj/src/main/assets/emoji/5_138.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_139.png b/TMessagesProj/src/main/assets/emoji/5_139.png index a97885101..62928412e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_139.png and b/TMessagesProj/src/main/assets/emoji/5_139.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_14.png b/TMessagesProj/src/main/assets/emoji/5_14.png index fe368bc96..2bfaf0c41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_14.png and b/TMessagesProj/src/main/assets/emoji/5_14.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_140.png b/TMessagesProj/src/main/assets/emoji/5_140.png index d983deb87..1aa1bc9a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_140.png and b/TMessagesProj/src/main/assets/emoji/5_140.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_141.png b/TMessagesProj/src/main/assets/emoji/5_141.png index 8945f2f25..1fd92b545 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_141.png and b/TMessagesProj/src/main/assets/emoji/5_141.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_142.png b/TMessagesProj/src/main/assets/emoji/5_142.png index 0ccfe8f55..5bd48077c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_142.png and b/TMessagesProj/src/main/assets/emoji/5_142.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_143.png b/TMessagesProj/src/main/assets/emoji/5_143.png index 40654c3d8..80b21ab4b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_143.png and b/TMessagesProj/src/main/assets/emoji/5_143.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_144.png b/TMessagesProj/src/main/assets/emoji/5_144.png index f306e147e..6ad13a609 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_144.png and b/TMessagesProj/src/main/assets/emoji/5_144.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_145.png b/TMessagesProj/src/main/assets/emoji/5_145.png index 5bf485ff1..cd6fd9b13 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_145.png and b/TMessagesProj/src/main/assets/emoji/5_145.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_146.png b/TMessagesProj/src/main/assets/emoji/5_146.png index e56fbabce..0394e9200 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_146.png and b/TMessagesProj/src/main/assets/emoji/5_146.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_147.png b/TMessagesProj/src/main/assets/emoji/5_147.png index 0a36dd07f..ca4302bcb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_147.png and b/TMessagesProj/src/main/assets/emoji/5_147.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_148.png b/TMessagesProj/src/main/assets/emoji/5_148.png index 0d409c682..9c65f8718 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_148.png and b/TMessagesProj/src/main/assets/emoji/5_148.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_149.png b/TMessagesProj/src/main/assets/emoji/5_149.png index 241201189..12a776f20 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_149.png and b/TMessagesProj/src/main/assets/emoji/5_149.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_15.png b/TMessagesProj/src/main/assets/emoji/5_15.png index 709b54a34..0c90af022 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_15.png and b/TMessagesProj/src/main/assets/emoji/5_15.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_150.png b/TMessagesProj/src/main/assets/emoji/5_150.png index 5c8d2afb9..549362244 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_150.png and b/TMessagesProj/src/main/assets/emoji/5_150.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_151.png b/TMessagesProj/src/main/assets/emoji/5_151.png index 3ca3d271b..4f106eaa6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_151.png and b/TMessagesProj/src/main/assets/emoji/5_151.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_152.png b/TMessagesProj/src/main/assets/emoji/5_152.png index 7d5f8f3c9..3589967b7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_152.png and b/TMessagesProj/src/main/assets/emoji/5_152.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_153.png b/TMessagesProj/src/main/assets/emoji/5_153.png index 846e5dfba..295ea25cb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_153.png and b/TMessagesProj/src/main/assets/emoji/5_153.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_154.png b/TMessagesProj/src/main/assets/emoji/5_154.png index ff43d71d9..1dfa64535 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_154.png and b/TMessagesProj/src/main/assets/emoji/5_154.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_155.png b/TMessagesProj/src/main/assets/emoji/5_155.png index ab114737a..224266f4a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_155.png and b/TMessagesProj/src/main/assets/emoji/5_155.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_156.png b/TMessagesProj/src/main/assets/emoji/5_156.png index d2d5c1b18..ba4f10036 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_156.png and b/TMessagesProj/src/main/assets/emoji/5_156.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_157.png b/TMessagesProj/src/main/assets/emoji/5_157.png index da231500a..acdf792d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_157.png and b/TMessagesProj/src/main/assets/emoji/5_157.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_158.png b/TMessagesProj/src/main/assets/emoji/5_158.png index c9a62bd8b..23cead508 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_158.png and b/TMessagesProj/src/main/assets/emoji/5_158.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_159.png b/TMessagesProj/src/main/assets/emoji/5_159.png index a92ca805e..9e39b8382 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_159.png and b/TMessagesProj/src/main/assets/emoji/5_159.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_16.png b/TMessagesProj/src/main/assets/emoji/5_16.png index 65f80715c..0a680a340 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_16.png and b/TMessagesProj/src/main/assets/emoji/5_16.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_160.png b/TMessagesProj/src/main/assets/emoji/5_160.png index 45a461f31..57639be56 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_160.png and b/TMessagesProj/src/main/assets/emoji/5_160.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_161.png b/TMessagesProj/src/main/assets/emoji/5_161.png index 20fb48028..ef7ab5c67 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_161.png and b/TMessagesProj/src/main/assets/emoji/5_161.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_162.png b/TMessagesProj/src/main/assets/emoji/5_162.png index 63be27e17..e2dd58d42 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_162.png and b/TMessagesProj/src/main/assets/emoji/5_162.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_163.png b/TMessagesProj/src/main/assets/emoji/5_163.png index 71956b772..4f471a8f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_163.png and b/TMessagesProj/src/main/assets/emoji/5_163.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_164.png b/TMessagesProj/src/main/assets/emoji/5_164.png index 5b6bfccb3..bbd6d50a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_164.png and b/TMessagesProj/src/main/assets/emoji/5_164.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_165.png b/TMessagesProj/src/main/assets/emoji/5_165.png index b43615c98..6ee176359 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_165.png and b/TMessagesProj/src/main/assets/emoji/5_165.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_166.png b/TMessagesProj/src/main/assets/emoji/5_166.png index bec248eed..311e55ac1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_166.png and b/TMessagesProj/src/main/assets/emoji/5_166.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_167.png b/TMessagesProj/src/main/assets/emoji/5_167.png index c3bc0b452..eff092116 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_167.png and b/TMessagesProj/src/main/assets/emoji/5_167.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_168.png b/TMessagesProj/src/main/assets/emoji/5_168.png index 7acb2c7d5..db7cf6220 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_168.png and b/TMessagesProj/src/main/assets/emoji/5_168.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_169.png b/TMessagesProj/src/main/assets/emoji/5_169.png index d93e40b0a..82e8a836d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_169.png and b/TMessagesProj/src/main/assets/emoji/5_169.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_17.png b/TMessagesProj/src/main/assets/emoji/5_17.png index 00f16e351..943ab60be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_17.png and b/TMessagesProj/src/main/assets/emoji/5_17.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_170.png b/TMessagesProj/src/main/assets/emoji/5_170.png index f7f8a176a..f8cb1bcc4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_170.png and b/TMessagesProj/src/main/assets/emoji/5_170.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_171.png b/TMessagesProj/src/main/assets/emoji/5_171.png index d68b089ce..d6611ca2e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_171.png and b/TMessagesProj/src/main/assets/emoji/5_171.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_172.png b/TMessagesProj/src/main/assets/emoji/5_172.png index 16c100a0b..dbbe63fb5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_172.png and b/TMessagesProj/src/main/assets/emoji/5_172.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_173.png b/TMessagesProj/src/main/assets/emoji/5_173.png index 219b92bc0..081928fed 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_173.png and b/TMessagesProj/src/main/assets/emoji/5_173.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_174.png b/TMessagesProj/src/main/assets/emoji/5_174.png index 7314f1996..98af1ef13 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_174.png and b/TMessagesProj/src/main/assets/emoji/5_174.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_175.png b/TMessagesProj/src/main/assets/emoji/5_175.png index 4a5cd3b07..1415d4045 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_175.png and b/TMessagesProj/src/main/assets/emoji/5_175.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_176.png b/TMessagesProj/src/main/assets/emoji/5_176.png index e83529042..6d566b8e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_176.png and b/TMessagesProj/src/main/assets/emoji/5_176.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_177.png b/TMessagesProj/src/main/assets/emoji/5_177.png index c594443a2..fb46d6829 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_177.png and b/TMessagesProj/src/main/assets/emoji/5_177.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_178.png b/TMessagesProj/src/main/assets/emoji/5_178.png index 4a3b53a03..8a0c85609 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_178.png and b/TMessagesProj/src/main/assets/emoji/5_178.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_179.png b/TMessagesProj/src/main/assets/emoji/5_179.png index 550dd8954..70789204d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_179.png and b/TMessagesProj/src/main/assets/emoji/5_179.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_18.png b/TMessagesProj/src/main/assets/emoji/5_18.png index ea916e38c..ce73d2b8f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_18.png and b/TMessagesProj/src/main/assets/emoji/5_18.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_180.png b/TMessagesProj/src/main/assets/emoji/5_180.png index ac63f62e1..23097bf54 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_180.png and b/TMessagesProj/src/main/assets/emoji/5_180.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_181.png b/TMessagesProj/src/main/assets/emoji/5_181.png index e0bbdb978..0bda24b86 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_181.png and b/TMessagesProj/src/main/assets/emoji/5_181.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_182.png b/TMessagesProj/src/main/assets/emoji/5_182.png index 50738c2ef..354e968ce 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_182.png and b/TMessagesProj/src/main/assets/emoji/5_182.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_183.png b/TMessagesProj/src/main/assets/emoji/5_183.png index c599b509a..bbeb5496c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_183.png and b/TMessagesProj/src/main/assets/emoji/5_183.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_184.png b/TMessagesProj/src/main/assets/emoji/5_184.png index 256d911d8..26b6f7c78 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_184.png and b/TMessagesProj/src/main/assets/emoji/5_184.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_185.png b/TMessagesProj/src/main/assets/emoji/5_185.png index d9eed2851..2e1313ee6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_185.png and b/TMessagesProj/src/main/assets/emoji/5_185.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_186.png b/TMessagesProj/src/main/assets/emoji/5_186.png index 0d5077a1f..1a6185115 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_186.png and b/TMessagesProj/src/main/assets/emoji/5_186.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_187.png b/TMessagesProj/src/main/assets/emoji/5_187.png index 562930c36..9d281cc50 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_187.png and b/TMessagesProj/src/main/assets/emoji/5_187.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_188.png b/TMessagesProj/src/main/assets/emoji/5_188.png index dbc40308a..8aacb80db 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_188.png and b/TMessagesProj/src/main/assets/emoji/5_188.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_189.png b/TMessagesProj/src/main/assets/emoji/5_189.png index 5d6d4bee6..e9d9f3c77 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_189.png and b/TMessagesProj/src/main/assets/emoji/5_189.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_19.png b/TMessagesProj/src/main/assets/emoji/5_19.png index 393421852..56ffb9543 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_19.png and b/TMessagesProj/src/main/assets/emoji/5_19.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_190.png b/TMessagesProj/src/main/assets/emoji/5_190.png index 34744a4e4..7b5cc3efe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_190.png and b/TMessagesProj/src/main/assets/emoji/5_190.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_191.png b/TMessagesProj/src/main/assets/emoji/5_191.png index be50fcdf3..268d3e70d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_191.png and b/TMessagesProj/src/main/assets/emoji/5_191.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_192.png b/TMessagesProj/src/main/assets/emoji/5_192.png index 143ceef01..0bf93ea0c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_192.png and b/TMessagesProj/src/main/assets/emoji/5_192.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_193.png b/TMessagesProj/src/main/assets/emoji/5_193.png index 4b50e79a0..b91076ea1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_193.png and b/TMessagesProj/src/main/assets/emoji/5_193.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_194.png b/TMessagesProj/src/main/assets/emoji/5_194.png index 20d0f1c53..54e6a0fa1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_194.png and b/TMessagesProj/src/main/assets/emoji/5_194.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_195.png b/TMessagesProj/src/main/assets/emoji/5_195.png index fcfe31897..099cab920 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_195.png and b/TMessagesProj/src/main/assets/emoji/5_195.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_196.png b/TMessagesProj/src/main/assets/emoji/5_196.png index 5ec781ecf..8813ca881 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_196.png and b/TMessagesProj/src/main/assets/emoji/5_196.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_197.png b/TMessagesProj/src/main/assets/emoji/5_197.png index 08fb154da..d63e6c622 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_197.png and b/TMessagesProj/src/main/assets/emoji/5_197.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_198.png b/TMessagesProj/src/main/assets/emoji/5_198.png index ec4f4f4cc..b2a4d14fe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_198.png and b/TMessagesProj/src/main/assets/emoji/5_198.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_199.png b/TMessagesProj/src/main/assets/emoji/5_199.png index 9c0d246ae..a3a227c3d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_199.png and b/TMessagesProj/src/main/assets/emoji/5_199.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_2.png b/TMessagesProj/src/main/assets/emoji/5_2.png index c2da129d4..64b750326 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_2.png and b/TMessagesProj/src/main/assets/emoji/5_2.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_20.png b/TMessagesProj/src/main/assets/emoji/5_20.png index 1228b81db..425cde5a1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_20.png and b/TMessagesProj/src/main/assets/emoji/5_20.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_200.png b/TMessagesProj/src/main/assets/emoji/5_200.png index 41d4fbf0b..5ae3ebd25 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_200.png and b/TMessagesProj/src/main/assets/emoji/5_200.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_201.png b/TMessagesProj/src/main/assets/emoji/5_201.png index 503fdc8de..67b4cc833 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_201.png and b/TMessagesProj/src/main/assets/emoji/5_201.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_202.png b/TMessagesProj/src/main/assets/emoji/5_202.png index 579f436ee..e297bad82 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_202.png and b/TMessagesProj/src/main/assets/emoji/5_202.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_203.png b/TMessagesProj/src/main/assets/emoji/5_203.png index d816088a4..c7346abd4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_203.png and b/TMessagesProj/src/main/assets/emoji/5_203.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_204.png b/TMessagesProj/src/main/assets/emoji/5_204.png index b9183215a..ea3528594 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_204.png and b/TMessagesProj/src/main/assets/emoji/5_204.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_205.png b/TMessagesProj/src/main/assets/emoji/5_205.png index 756fa3662..225c1f328 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_205.png and b/TMessagesProj/src/main/assets/emoji/5_205.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_206.png b/TMessagesProj/src/main/assets/emoji/5_206.png index 0dc505ae0..06e6ba368 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_206.png and b/TMessagesProj/src/main/assets/emoji/5_206.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_207.png b/TMessagesProj/src/main/assets/emoji/5_207.png index 80d6b7cb9..03ebd6050 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_207.png and b/TMessagesProj/src/main/assets/emoji/5_207.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_208.png b/TMessagesProj/src/main/assets/emoji/5_208.png index c382da1f6..ce6b4ea41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_208.png and b/TMessagesProj/src/main/assets/emoji/5_208.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_209.png b/TMessagesProj/src/main/assets/emoji/5_209.png index 82a9b2ff4..259347444 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_209.png and b/TMessagesProj/src/main/assets/emoji/5_209.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_21.png b/TMessagesProj/src/main/assets/emoji/5_21.png index c39d2afe5..1e6c17902 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_21.png and b/TMessagesProj/src/main/assets/emoji/5_21.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_210.png b/TMessagesProj/src/main/assets/emoji/5_210.png index b4989463f..571bfdb59 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_210.png and b/TMessagesProj/src/main/assets/emoji/5_210.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_211.png b/TMessagesProj/src/main/assets/emoji/5_211.png index 4609beb1c..1b8a46282 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_211.png and b/TMessagesProj/src/main/assets/emoji/5_211.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_212.png b/TMessagesProj/src/main/assets/emoji/5_212.png index 8df82be8c..97b8e1b5c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_212.png and b/TMessagesProj/src/main/assets/emoji/5_212.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_213.png b/TMessagesProj/src/main/assets/emoji/5_213.png index fc4afb04e..2cd7be883 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_213.png and b/TMessagesProj/src/main/assets/emoji/5_213.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_214.png b/TMessagesProj/src/main/assets/emoji/5_214.png index ba6ed2fb6..9c9fdc2fb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_214.png and b/TMessagesProj/src/main/assets/emoji/5_214.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_215.png b/TMessagesProj/src/main/assets/emoji/5_215.png index 28cf22402..adbff04b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_215.png and b/TMessagesProj/src/main/assets/emoji/5_215.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_216.png b/TMessagesProj/src/main/assets/emoji/5_216.png index 70d6639e4..418ee569a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_216.png and b/TMessagesProj/src/main/assets/emoji/5_216.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_217.png b/TMessagesProj/src/main/assets/emoji/5_217.png index 29f2ff404..c7e83d5c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_217.png and b/TMessagesProj/src/main/assets/emoji/5_217.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_218.png b/TMessagesProj/src/main/assets/emoji/5_218.png index e1df59b1f..95398105c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_218.png and b/TMessagesProj/src/main/assets/emoji/5_218.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_219.png b/TMessagesProj/src/main/assets/emoji/5_219.png index 91aea6d24..7f78b9cf3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_219.png and b/TMessagesProj/src/main/assets/emoji/5_219.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_22.png b/TMessagesProj/src/main/assets/emoji/5_22.png index 65d2baaf9..baf272960 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_22.png and b/TMessagesProj/src/main/assets/emoji/5_22.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_220.png b/TMessagesProj/src/main/assets/emoji/5_220.png index fd98714d9..283e751df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_220.png and b/TMessagesProj/src/main/assets/emoji/5_220.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_221.png b/TMessagesProj/src/main/assets/emoji/5_221.png index 1254779db..165228005 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_221.png and b/TMessagesProj/src/main/assets/emoji/5_221.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_222.png b/TMessagesProj/src/main/assets/emoji/5_222.png index ba10bfcbf..3e29be473 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_222.png and b/TMessagesProj/src/main/assets/emoji/5_222.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_223.png b/TMessagesProj/src/main/assets/emoji/5_223.png index ff1a6e69c..bd1b2112a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_223.png and b/TMessagesProj/src/main/assets/emoji/5_223.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_224.png b/TMessagesProj/src/main/assets/emoji/5_224.png index a30802bd0..d7721f7cf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_224.png and b/TMessagesProj/src/main/assets/emoji/5_224.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_225.png b/TMessagesProj/src/main/assets/emoji/5_225.png index ce4f1a108..12b108878 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_225.png and b/TMessagesProj/src/main/assets/emoji/5_225.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_226.png b/TMessagesProj/src/main/assets/emoji/5_226.png index 076732259..16575b2c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_226.png and b/TMessagesProj/src/main/assets/emoji/5_226.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_227.png b/TMessagesProj/src/main/assets/emoji/5_227.png index da8345620..2a81cae62 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_227.png and b/TMessagesProj/src/main/assets/emoji/5_227.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_228.png b/TMessagesProj/src/main/assets/emoji/5_228.png index e09081e71..5bbbd6660 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_228.png and b/TMessagesProj/src/main/assets/emoji/5_228.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_229.png b/TMessagesProj/src/main/assets/emoji/5_229.png new file mode 100644 index 000000000..05a3193ea Binary files /dev/null and b/TMessagesProj/src/main/assets/emoji/5_229.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_23.png b/TMessagesProj/src/main/assets/emoji/5_23.png index b8a42a17a..39500211f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_23.png and b/TMessagesProj/src/main/assets/emoji/5_23.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_24.png b/TMessagesProj/src/main/assets/emoji/5_24.png index 669c5ec98..514fa7813 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_24.png and b/TMessagesProj/src/main/assets/emoji/5_24.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_25.png b/TMessagesProj/src/main/assets/emoji/5_25.png index 2fe736d06..812917bd0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_25.png and b/TMessagesProj/src/main/assets/emoji/5_25.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_26.png b/TMessagesProj/src/main/assets/emoji/5_26.png index 2f4f04c54..230484ee8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_26.png and b/TMessagesProj/src/main/assets/emoji/5_26.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_27.png b/TMessagesProj/src/main/assets/emoji/5_27.png index 12992b26b..b07c6e628 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_27.png and b/TMessagesProj/src/main/assets/emoji/5_27.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_28.png b/TMessagesProj/src/main/assets/emoji/5_28.png index 5617809ee..cd6e39b6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_28.png and b/TMessagesProj/src/main/assets/emoji/5_28.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_29.png b/TMessagesProj/src/main/assets/emoji/5_29.png index 6bc98e0ed..452dfeb3f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_29.png and b/TMessagesProj/src/main/assets/emoji/5_29.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_3.png b/TMessagesProj/src/main/assets/emoji/5_3.png index 037b8e1fc..8640f749c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_3.png and b/TMessagesProj/src/main/assets/emoji/5_3.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_30.png b/TMessagesProj/src/main/assets/emoji/5_30.png index 88fa99002..212d4482e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_30.png and b/TMessagesProj/src/main/assets/emoji/5_30.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_31.png b/TMessagesProj/src/main/assets/emoji/5_31.png index 85124f911..758bc2c2e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_31.png and b/TMessagesProj/src/main/assets/emoji/5_31.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_32.png b/TMessagesProj/src/main/assets/emoji/5_32.png index ad388de6b..eeae24bcf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_32.png and b/TMessagesProj/src/main/assets/emoji/5_32.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_33.png b/TMessagesProj/src/main/assets/emoji/5_33.png index 1b258a492..48da451c0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_33.png and b/TMessagesProj/src/main/assets/emoji/5_33.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_34.png b/TMessagesProj/src/main/assets/emoji/5_34.png index 11479a07a..5a4c43899 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_34.png and b/TMessagesProj/src/main/assets/emoji/5_34.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_35.png b/TMessagesProj/src/main/assets/emoji/5_35.png index 5169fa33c..e76ca8481 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_35.png and b/TMessagesProj/src/main/assets/emoji/5_35.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_36.png b/TMessagesProj/src/main/assets/emoji/5_36.png index ddb016256..6b072cbe6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_36.png and b/TMessagesProj/src/main/assets/emoji/5_36.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_37.png b/TMessagesProj/src/main/assets/emoji/5_37.png index 8e0dcf288..8c5deb5ba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_37.png and b/TMessagesProj/src/main/assets/emoji/5_37.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_38.png b/TMessagesProj/src/main/assets/emoji/5_38.png index 668618a3f..eefd0c4e6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_38.png and b/TMessagesProj/src/main/assets/emoji/5_38.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_39.png b/TMessagesProj/src/main/assets/emoji/5_39.png index 898355d0e..262aa3b35 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_39.png and b/TMessagesProj/src/main/assets/emoji/5_39.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_4.png b/TMessagesProj/src/main/assets/emoji/5_4.png index 6916a2c4a..57a637f45 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_4.png and b/TMessagesProj/src/main/assets/emoji/5_4.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_40.png b/TMessagesProj/src/main/assets/emoji/5_40.png index ef1916c66..17bea3b81 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_40.png and b/TMessagesProj/src/main/assets/emoji/5_40.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_41.png b/TMessagesProj/src/main/assets/emoji/5_41.png index 366905e65..b38da5d1e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_41.png and b/TMessagesProj/src/main/assets/emoji/5_41.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_42.png b/TMessagesProj/src/main/assets/emoji/5_42.png index de2ce03a0..9ba9542d4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_42.png and b/TMessagesProj/src/main/assets/emoji/5_42.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_43.png b/TMessagesProj/src/main/assets/emoji/5_43.png index bf5daca6a..3451d3cb9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_43.png and b/TMessagesProj/src/main/assets/emoji/5_43.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_44.png b/TMessagesProj/src/main/assets/emoji/5_44.png index 36e67c983..ea0d816ff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_44.png and b/TMessagesProj/src/main/assets/emoji/5_44.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_45.png b/TMessagesProj/src/main/assets/emoji/5_45.png index c17f53fd2..6d28a6889 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_45.png and b/TMessagesProj/src/main/assets/emoji/5_45.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_46.png b/TMessagesProj/src/main/assets/emoji/5_46.png index 10354c30a..515e90a83 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_46.png and b/TMessagesProj/src/main/assets/emoji/5_46.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_47.png b/TMessagesProj/src/main/assets/emoji/5_47.png index e463b9ff3..a8a29fb37 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_47.png and b/TMessagesProj/src/main/assets/emoji/5_47.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_48.png b/TMessagesProj/src/main/assets/emoji/5_48.png index 654aff39b..791eaf316 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_48.png and b/TMessagesProj/src/main/assets/emoji/5_48.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_49.png b/TMessagesProj/src/main/assets/emoji/5_49.png index 76c4de9ca..ea9f75dd2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_49.png and b/TMessagesProj/src/main/assets/emoji/5_49.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_5.png b/TMessagesProj/src/main/assets/emoji/5_5.png index b603dad64..9e60be44d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_5.png and b/TMessagesProj/src/main/assets/emoji/5_5.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_50.png b/TMessagesProj/src/main/assets/emoji/5_50.png index 432da2a65..ca69e487a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_50.png and b/TMessagesProj/src/main/assets/emoji/5_50.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_51.png b/TMessagesProj/src/main/assets/emoji/5_51.png index 6df8de6b3..6f645aaf6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_51.png and b/TMessagesProj/src/main/assets/emoji/5_51.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_52.png b/TMessagesProj/src/main/assets/emoji/5_52.png index 79094ccb9..6f7cb9b69 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_52.png and b/TMessagesProj/src/main/assets/emoji/5_52.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_53.png b/TMessagesProj/src/main/assets/emoji/5_53.png index 96eb12abf..fe688c15b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_53.png and b/TMessagesProj/src/main/assets/emoji/5_53.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_54.png b/TMessagesProj/src/main/assets/emoji/5_54.png index fc9b6a9cb..b46235bd0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_54.png and b/TMessagesProj/src/main/assets/emoji/5_54.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_55.png b/TMessagesProj/src/main/assets/emoji/5_55.png index 9aafb6771..6ab461779 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_55.png and b/TMessagesProj/src/main/assets/emoji/5_55.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_56.png b/TMessagesProj/src/main/assets/emoji/5_56.png index 0c99845bf..fff1aa5d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_56.png and b/TMessagesProj/src/main/assets/emoji/5_56.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_57.png b/TMessagesProj/src/main/assets/emoji/5_57.png index 176ecde8f..23e136fbc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_57.png and b/TMessagesProj/src/main/assets/emoji/5_57.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_58.png b/TMessagesProj/src/main/assets/emoji/5_58.png index 03e5f1b45..87bd32678 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_58.png and b/TMessagesProj/src/main/assets/emoji/5_58.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_59.png b/TMessagesProj/src/main/assets/emoji/5_59.png index 4d4317a0d..97d0ee102 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_59.png and b/TMessagesProj/src/main/assets/emoji/5_59.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_6.png b/TMessagesProj/src/main/assets/emoji/5_6.png index e4cebac2f..b4895a709 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_6.png and b/TMessagesProj/src/main/assets/emoji/5_6.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_60.png b/TMessagesProj/src/main/assets/emoji/5_60.png index 9c92c315a..76625a379 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_60.png and b/TMessagesProj/src/main/assets/emoji/5_60.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_61.png b/TMessagesProj/src/main/assets/emoji/5_61.png index e8a50eb63..8b139f957 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_61.png and b/TMessagesProj/src/main/assets/emoji/5_61.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_62.png b/TMessagesProj/src/main/assets/emoji/5_62.png index d04fe9611..2ad2212c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_62.png and b/TMessagesProj/src/main/assets/emoji/5_62.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_63.png b/TMessagesProj/src/main/assets/emoji/5_63.png index df0ccfa68..75af97286 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_63.png and b/TMessagesProj/src/main/assets/emoji/5_63.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_64.png b/TMessagesProj/src/main/assets/emoji/5_64.png index 276dd5111..49c1b5402 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_64.png and b/TMessagesProj/src/main/assets/emoji/5_64.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_65.png b/TMessagesProj/src/main/assets/emoji/5_65.png index 2e70f1517..162b0f714 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_65.png and b/TMessagesProj/src/main/assets/emoji/5_65.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_66.png b/TMessagesProj/src/main/assets/emoji/5_66.png index 341999148..073fe30b5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_66.png and b/TMessagesProj/src/main/assets/emoji/5_66.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_67.png b/TMessagesProj/src/main/assets/emoji/5_67.png index 8c280522a..f9c310849 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_67.png and b/TMessagesProj/src/main/assets/emoji/5_67.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_68.png b/TMessagesProj/src/main/assets/emoji/5_68.png index 1ca621ed2..0f41b0da7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_68.png and b/TMessagesProj/src/main/assets/emoji/5_68.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_69.png b/TMessagesProj/src/main/assets/emoji/5_69.png index 5ef529f56..bfe3d4157 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_69.png and b/TMessagesProj/src/main/assets/emoji/5_69.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_7.png b/TMessagesProj/src/main/assets/emoji/5_7.png index e0bbe725e..b828c887c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_7.png and b/TMessagesProj/src/main/assets/emoji/5_7.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_70.png b/TMessagesProj/src/main/assets/emoji/5_70.png index 277691bc8..ff29591b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_70.png and b/TMessagesProj/src/main/assets/emoji/5_70.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_71.png b/TMessagesProj/src/main/assets/emoji/5_71.png index 6584427ed..60cc9e161 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_71.png and b/TMessagesProj/src/main/assets/emoji/5_71.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_72.png b/TMessagesProj/src/main/assets/emoji/5_72.png index 3a3fc71e9..cf3950410 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_72.png and b/TMessagesProj/src/main/assets/emoji/5_72.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_73.png b/TMessagesProj/src/main/assets/emoji/5_73.png index 5dfe24ae4..23bf0bb55 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_73.png and b/TMessagesProj/src/main/assets/emoji/5_73.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_74.png b/TMessagesProj/src/main/assets/emoji/5_74.png index 69bd4d702..f498fef02 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_74.png and b/TMessagesProj/src/main/assets/emoji/5_74.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_75.png b/TMessagesProj/src/main/assets/emoji/5_75.png index 398bf4f3a..fb4cdd268 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_75.png and b/TMessagesProj/src/main/assets/emoji/5_75.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_76.png b/TMessagesProj/src/main/assets/emoji/5_76.png index e35344985..dc92204e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_76.png and b/TMessagesProj/src/main/assets/emoji/5_76.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_77.png b/TMessagesProj/src/main/assets/emoji/5_77.png index 8d82747b4..be7fc4a42 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_77.png and b/TMessagesProj/src/main/assets/emoji/5_77.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_78.png b/TMessagesProj/src/main/assets/emoji/5_78.png index 8f13a21a4..2f8dab0f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_78.png and b/TMessagesProj/src/main/assets/emoji/5_78.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_79.png b/TMessagesProj/src/main/assets/emoji/5_79.png index 0bc401ddc..1d993c68e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_79.png and b/TMessagesProj/src/main/assets/emoji/5_79.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_8.png b/TMessagesProj/src/main/assets/emoji/5_8.png index 0434dbcd9..e77bfe975 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_8.png and b/TMessagesProj/src/main/assets/emoji/5_8.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_80.png b/TMessagesProj/src/main/assets/emoji/5_80.png index aef65bac4..728ff9659 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_80.png and b/TMessagesProj/src/main/assets/emoji/5_80.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_81.png b/TMessagesProj/src/main/assets/emoji/5_81.png index c52972b51..7ad1db0f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_81.png and b/TMessagesProj/src/main/assets/emoji/5_81.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_82.png b/TMessagesProj/src/main/assets/emoji/5_82.png index 48e4a6e82..fd7426104 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_82.png and b/TMessagesProj/src/main/assets/emoji/5_82.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_83.png b/TMessagesProj/src/main/assets/emoji/5_83.png index a39c4a490..68c3bbd17 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_83.png and b/TMessagesProj/src/main/assets/emoji/5_83.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_84.png b/TMessagesProj/src/main/assets/emoji/5_84.png index 7019573d1..c484a4e0e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_84.png and b/TMessagesProj/src/main/assets/emoji/5_84.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_85.png b/TMessagesProj/src/main/assets/emoji/5_85.png index 677dde37a..af12fd3a7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_85.png and b/TMessagesProj/src/main/assets/emoji/5_85.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_86.png b/TMessagesProj/src/main/assets/emoji/5_86.png index 3579c81c9..09bdd943a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_86.png and b/TMessagesProj/src/main/assets/emoji/5_86.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_87.png b/TMessagesProj/src/main/assets/emoji/5_87.png index 4291e085c..865c90963 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_87.png and b/TMessagesProj/src/main/assets/emoji/5_87.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_88.png b/TMessagesProj/src/main/assets/emoji/5_88.png index c86119b1d..e8d45a55e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_88.png and b/TMessagesProj/src/main/assets/emoji/5_88.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_89.png b/TMessagesProj/src/main/assets/emoji/5_89.png index 38fbb0c17..4017d56d6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_89.png and b/TMessagesProj/src/main/assets/emoji/5_89.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_9.png b/TMessagesProj/src/main/assets/emoji/5_9.png index e191f2c3a..eef4ce881 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_9.png and b/TMessagesProj/src/main/assets/emoji/5_9.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_90.png b/TMessagesProj/src/main/assets/emoji/5_90.png index 34226abc4..2052ab108 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_90.png and b/TMessagesProj/src/main/assets/emoji/5_90.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_91.png b/TMessagesProj/src/main/assets/emoji/5_91.png index c6ccd258a..d51399ea9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_91.png and b/TMessagesProj/src/main/assets/emoji/5_91.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_92.png b/TMessagesProj/src/main/assets/emoji/5_92.png index d2715bb3a..e61e03110 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_92.png and b/TMessagesProj/src/main/assets/emoji/5_92.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_93.png b/TMessagesProj/src/main/assets/emoji/5_93.png index 08c1138dd..057d72db7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_93.png and b/TMessagesProj/src/main/assets/emoji/5_93.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_94.png b/TMessagesProj/src/main/assets/emoji/5_94.png index 8f2d6528a..4bb01b48c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_94.png and b/TMessagesProj/src/main/assets/emoji/5_94.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_95.png b/TMessagesProj/src/main/assets/emoji/5_95.png index 73986212f..0f6872773 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_95.png and b/TMessagesProj/src/main/assets/emoji/5_95.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_96.png b/TMessagesProj/src/main/assets/emoji/5_96.png index e74cc9fa1..067caf45c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_96.png and b/TMessagesProj/src/main/assets/emoji/5_96.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_97.png b/TMessagesProj/src/main/assets/emoji/5_97.png index 6ade6f9be..0f1240fbe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_97.png and b/TMessagesProj/src/main/assets/emoji/5_97.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_98.png b/TMessagesProj/src/main/assets/emoji/5_98.png index eb0845aaf..8c4a9dc25 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_98.png and b/TMessagesProj/src/main/assets/emoji/5_98.png differ diff --git a/TMessagesProj/src/main/assets/emoji/5_99.png b/TMessagesProj/src/main/assets/emoji/5_99.png index e60328537..f9e072d28 100644 Binary files a/TMessagesProj/src/main/assets/emoji/5_99.png and b/TMessagesProj/src/main/assets/emoji/5_99.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_0.png b/TMessagesProj/src/main/assets/emoji/6_0.png index 84b6317c9..8be64f99b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_0.png and b/TMessagesProj/src/main/assets/emoji/6_0.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_1.png b/TMessagesProj/src/main/assets/emoji/6_1.png index 38ad15ae8..a02f89d21 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_1.png and b/TMessagesProj/src/main/assets/emoji/6_1.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_10.png b/TMessagesProj/src/main/assets/emoji/6_10.png index 6dcc5ff28..e33139241 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_10.png and b/TMessagesProj/src/main/assets/emoji/6_10.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_100.png b/TMessagesProj/src/main/assets/emoji/6_100.png index 91180a4aa..2c0d78c87 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_100.png and b/TMessagesProj/src/main/assets/emoji/6_100.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_101.png b/TMessagesProj/src/main/assets/emoji/6_101.png index a57f9d430..30f09cf77 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_101.png and b/TMessagesProj/src/main/assets/emoji/6_101.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_102.png b/TMessagesProj/src/main/assets/emoji/6_102.png index 9a1e67a21..b57b91355 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_102.png and b/TMessagesProj/src/main/assets/emoji/6_102.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_103.png b/TMessagesProj/src/main/assets/emoji/6_103.png index 2434ad2be..bce270701 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_103.png and b/TMessagesProj/src/main/assets/emoji/6_103.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_104.png b/TMessagesProj/src/main/assets/emoji/6_104.png index 966ef1195..402e4c4a1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_104.png and b/TMessagesProj/src/main/assets/emoji/6_104.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_105.png b/TMessagesProj/src/main/assets/emoji/6_105.png index 3d5e0f07f..938764a2d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_105.png and b/TMessagesProj/src/main/assets/emoji/6_105.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_106.png b/TMessagesProj/src/main/assets/emoji/6_106.png index 5a45201bf..5bfa503ae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_106.png and b/TMessagesProj/src/main/assets/emoji/6_106.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_107.png b/TMessagesProj/src/main/assets/emoji/6_107.png index 9a9531f3c..f4b7fae7a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_107.png and b/TMessagesProj/src/main/assets/emoji/6_107.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_108.png b/TMessagesProj/src/main/assets/emoji/6_108.png index 242e83400..3c128bc10 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_108.png and b/TMessagesProj/src/main/assets/emoji/6_108.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_109.png b/TMessagesProj/src/main/assets/emoji/6_109.png index 6a6404003..03446c0e1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_109.png and b/TMessagesProj/src/main/assets/emoji/6_109.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_11.png b/TMessagesProj/src/main/assets/emoji/6_11.png index cc4b9d39c..cf04dd689 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_11.png and b/TMessagesProj/src/main/assets/emoji/6_11.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_110.png b/TMessagesProj/src/main/assets/emoji/6_110.png index aabab08a2..fe99a8cfe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_110.png and b/TMessagesProj/src/main/assets/emoji/6_110.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_111.png b/TMessagesProj/src/main/assets/emoji/6_111.png index b79f48f17..8e0a5444a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_111.png and b/TMessagesProj/src/main/assets/emoji/6_111.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_112.png b/TMessagesProj/src/main/assets/emoji/6_112.png index a55d020c1..9b83fa259 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_112.png and b/TMessagesProj/src/main/assets/emoji/6_112.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_113.png b/TMessagesProj/src/main/assets/emoji/6_113.png index e5b3fdcca..5d0b4b15a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_113.png and b/TMessagesProj/src/main/assets/emoji/6_113.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_114.png b/TMessagesProj/src/main/assets/emoji/6_114.png index b48a6254a..24bb1afb7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_114.png and b/TMessagesProj/src/main/assets/emoji/6_114.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_115.png b/TMessagesProj/src/main/assets/emoji/6_115.png index 26daa9213..c6e88729c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_115.png and b/TMessagesProj/src/main/assets/emoji/6_115.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_116.png b/TMessagesProj/src/main/assets/emoji/6_116.png index 3e94a0f0d..9f80b23d1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_116.png and b/TMessagesProj/src/main/assets/emoji/6_116.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_117.png b/TMessagesProj/src/main/assets/emoji/6_117.png index bc35ce9c8..2792d74bd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_117.png and b/TMessagesProj/src/main/assets/emoji/6_117.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_118.png b/TMessagesProj/src/main/assets/emoji/6_118.png index bc0698162..87a103153 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_118.png and b/TMessagesProj/src/main/assets/emoji/6_118.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_119.png b/TMessagesProj/src/main/assets/emoji/6_119.png index 762b8e204..0d303bab2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_119.png and b/TMessagesProj/src/main/assets/emoji/6_119.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_12.png b/TMessagesProj/src/main/assets/emoji/6_12.png index 3aff5b4e6..50619fbde 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_12.png and b/TMessagesProj/src/main/assets/emoji/6_12.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_120.png b/TMessagesProj/src/main/assets/emoji/6_120.png index 79f11a318..f3f182715 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_120.png and b/TMessagesProj/src/main/assets/emoji/6_120.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_121.png b/TMessagesProj/src/main/assets/emoji/6_121.png index 999c78153..8d2190da1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_121.png and b/TMessagesProj/src/main/assets/emoji/6_121.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_122.png b/TMessagesProj/src/main/assets/emoji/6_122.png index 3cc7e3ef7..5282cfc01 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_122.png and b/TMessagesProj/src/main/assets/emoji/6_122.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_123.png b/TMessagesProj/src/main/assets/emoji/6_123.png index 6d0c00d42..c56a1158d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_123.png and b/TMessagesProj/src/main/assets/emoji/6_123.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_124.png b/TMessagesProj/src/main/assets/emoji/6_124.png index 69da2864b..e7e00491b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_124.png and b/TMessagesProj/src/main/assets/emoji/6_124.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_125.png b/TMessagesProj/src/main/assets/emoji/6_125.png index ce53f15a2..2cf58c8be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_125.png and b/TMessagesProj/src/main/assets/emoji/6_125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_126.png b/TMessagesProj/src/main/assets/emoji/6_126.png index 849f14c9b..a378b0223 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_126.png and b/TMessagesProj/src/main/assets/emoji/6_126.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_127.png b/TMessagesProj/src/main/assets/emoji/6_127.png index cf5fd199f..0cbace45f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_127.png and b/TMessagesProj/src/main/assets/emoji/6_127.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_128.png b/TMessagesProj/src/main/assets/emoji/6_128.png index 79ced7e07..ecb668266 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_128.png and b/TMessagesProj/src/main/assets/emoji/6_128.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_129.png b/TMessagesProj/src/main/assets/emoji/6_129.png index c1a69afa1..fcffe7a86 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_129.png and b/TMessagesProj/src/main/assets/emoji/6_129.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_13.png b/TMessagesProj/src/main/assets/emoji/6_13.png index 6a7959184..90e04122e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_13.png and b/TMessagesProj/src/main/assets/emoji/6_13.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_130.png b/TMessagesProj/src/main/assets/emoji/6_130.png index 0228f2b2f..789b414cb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_130.png and b/TMessagesProj/src/main/assets/emoji/6_130.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_131.png b/TMessagesProj/src/main/assets/emoji/6_131.png index 02a1ebf7f..4b3d72796 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_131.png and b/TMessagesProj/src/main/assets/emoji/6_131.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_132.png b/TMessagesProj/src/main/assets/emoji/6_132.png index 4fb50bfc0..6d1d56c22 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_132.png and b/TMessagesProj/src/main/assets/emoji/6_132.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_133.png b/TMessagesProj/src/main/assets/emoji/6_133.png index efb926c74..f11cf4dee 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_133.png and b/TMessagesProj/src/main/assets/emoji/6_133.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_134.png b/TMessagesProj/src/main/assets/emoji/6_134.png index 5d7d53d30..4053a7c8d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_134.png and b/TMessagesProj/src/main/assets/emoji/6_134.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_135.png b/TMessagesProj/src/main/assets/emoji/6_135.png index f19f6cdb7..c32b20e15 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_135.png and b/TMessagesProj/src/main/assets/emoji/6_135.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_136.png b/TMessagesProj/src/main/assets/emoji/6_136.png index 62e68b100..2a641c344 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_136.png and b/TMessagesProj/src/main/assets/emoji/6_136.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_137.png b/TMessagesProj/src/main/assets/emoji/6_137.png index 689bbe14f..f5ac9d425 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_137.png and b/TMessagesProj/src/main/assets/emoji/6_137.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_138.png b/TMessagesProj/src/main/assets/emoji/6_138.png index 1bb0c7eb0..11410dc35 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_138.png and b/TMessagesProj/src/main/assets/emoji/6_138.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_139.png b/TMessagesProj/src/main/assets/emoji/6_139.png index fd2df51a9..26ee05356 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_139.png and b/TMessagesProj/src/main/assets/emoji/6_139.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_14.png b/TMessagesProj/src/main/assets/emoji/6_14.png index 67860bdf2..2876d3d58 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_14.png and b/TMessagesProj/src/main/assets/emoji/6_14.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_140.png b/TMessagesProj/src/main/assets/emoji/6_140.png index db0a2d6c3..e1ff28a78 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_140.png and b/TMessagesProj/src/main/assets/emoji/6_140.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_141.png b/TMessagesProj/src/main/assets/emoji/6_141.png index 9d6288647..ae403c97f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_141.png and b/TMessagesProj/src/main/assets/emoji/6_141.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_142.png b/TMessagesProj/src/main/assets/emoji/6_142.png index 6eebf5a01..1bd36850a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_142.png and b/TMessagesProj/src/main/assets/emoji/6_142.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_143.png b/TMessagesProj/src/main/assets/emoji/6_143.png index ce040f145..69e9730d7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_143.png and b/TMessagesProj/src/main/assets/emoji/6_143.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_144.png b/TMessagesProj/src/main/assets/emoji/6_144.png index 34256c4bc..c27faf664 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_144.png and b/TMessagesProj/src/main/assets/emoji/6_144.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_145.png b/TMessagesProj/src/main/assets/emoji/6_145.png index 560917ebd..551098aab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_145.png and b/TMessagesProj/src/main/assets/emoji/6_145.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_146.png b/TMessagesProj/src/main/assets/emoji/6_146.png index c1e46e0a4..9ff86ecc2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_146.png and b/TMessagesProj/src/main/assets/emoji/6_146.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_147.png b/TMessagesProj/src/main/assets/emoji/6_147.png index 3b9970086..d7d32074b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_147.png and b/TMessagesProj/src/main/assets/emoji/6_147.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_148.png b/TMessagesProj/src/main/assets/emoji/6_148.png index 4248ed6d4..0420b98ad 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_148.png and b/TMessagesProj/src/main/assets/emoji/6_148.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_149.png b/TMessagesProj/src/main/assets/emoji/6_149.png index 7b785c238..95c497230 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_149.png and b/TMessagesProj/src/main/assets/emoji/6_149.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_15.png b/TMessagesProj/src/main/assets/emoji/6_15.png index f62601d41..1b5220e79 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_15.png and b/TMessagesProj/src/main/assets/emoji/6_15.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_150.png b/TMessagesProj/src/main/assets/emoji/6_150.png index 4386c5f35..0286b1ff4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_150.png and b/TMessagesProj/src/main/assets/emoji/6_150.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_151.png b/TMessagesProj/src/main/assets/emoji/6_151.png index b9cb8f64d..4754fc72b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_151.png and b/TMessagesProj/src/main/assets/emoji/6_151.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_152.png b/TMessagesProj/src/main/assets/emoji/6_152.png index 3db377a1e..38a0398b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_152.png and b/TMessagesProj/src/main/assets/emoji/6_152.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_153.png b/TMessagesProj/src/main/assets/emoji/6_153.png index ba9be0b37..7ce7a0679 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_153.png and b/TMessagesProj/src/main/assets/emoji/6_153.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_154.png b/TMessagesProj/src/main/assets/emoji/6_154.png index e1cd17fb3..724863ab7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_154.png and b/TMessagesProj/src/main/assets/emoji/6_154.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_155.png b/TMessagesProj/src/main/assets/emoji/6_155.png index 18827a92d..0c3f15079 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_155.png and b/TMessagesProj/src/main/assets/emoji/6_155.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_156.png b/TMessagesProj/src/main/assets/emoji/6_156.png index 8275a11d3..e1d1b4b5d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_156.png and b/TMessagesProj/src/main/assets/emoji/6_156.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_157.png b/TMessagesProj/src/main/assets/emoji/6_157.png index 82273fd2b..c5ce7a8a8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_157.png and b/TMessagesProj/src/main/assets/emoji/6_157.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_158.png b/TMessagesProj/src/main/assets/emoji/6_158.png index 3e8b67961..14dbdef63 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_158.png and b/TMessagesProj/src/main/assets/emoji/6_158.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_159.png b/TMessagesProj/src/main/assets/emoji/6_159.png index a89186a15..5e6457e73 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_159.png and b/TMessagesProj/src/main/assets/emoji/6_159.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_16.png b/TMessagesProj/src/main/assets/emoji/6_16.png index a2861f44a..e9aa688eb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_16.png and b/TMessagesProj/src/main/assets/emoji/6_16.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_160.png b/TMessagesProj/src/main/assets/emoji/6_160.png index 65ab3e056..b804e51b8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_160.png and b/TMessagesProj/src/main/assets/emoji/6_160.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_161.png b/TMessagesProj/src/main/assets/emoji/6_161.png index c217a1277..530854f5d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_161.png and b/TMessagesProj/src/main/assets/emoji/6_161.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_162.png b/TMessagesProj/src/main/assets/emoji/6_162.png index d82565c81..d31d40fbe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_162.png and b/TMessagesProj/src/main/assets/emoji/6_162.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_163.png b/TMessagesProj/src/main/assets/emoji/6_163.png index b65cdcd0f..26d62af44 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_163.png and b/TMessagesProj/src/main/assets/emoji/6_163.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_164.png b/TMessagesProj/src/main/assets/emoji/6_164.png index d099e4392..ffebdd9ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_164.png and b/TMessagesProj/src/main/assets/emoji/6_164.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_165.png b/TMessagesProj/src/main/assets/emoji/6_165.png index d7fab7c26..1dadb0967 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_165.png and b/TMessagesProj/src/main/assets/emoji/6_165.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_166.png b/TMessagesProj/src/main/assets/emoji/6_166.png index 4e50599c7..58a054257 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_166.png and b/TMessagesProj/src/main/assets/emoji/6_166.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_167.png b/TMessagesProj/src/main/assets/emoji/6_167.png index b0ca7b733..12cc93ad9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_167.png and b/TMessagesProj/src/main/assets/emoji/6_167.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_168.png b/TMessagesProj/src/main/assets/emoji/6_168.png index e4d1e6aa1..b07b0c58a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_168.png and b/TMessagesProj/src/main/assets/emoji/6_168.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_169.png b/TMessagesProj/src/main/assets/emoji/6_169.png index 3ca37857a..e36a2a89a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_169.png and b/TMessagesProj/src/main/assets/emoji/6_169.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_17.png b/TMessagesProj/src/main/assets/emoji/6_17.png index 564f315ec..8c214b94d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_17.png and b/TMessagesProj/src/main/assets/emoji/6_17.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_170.png b/TMessagesProj/src/main/assets/emoji/6_170.png index ce6899750..abcd807c2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_170.png and b/TMessagesProj/src/main/assets/emoji/6_170.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_171.png b/TMessagesProj/src/main/assets/emoji/6_171.png index ab806cbdd..7c1a39ddf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_171.png and b/TMessagesProj/src/main/assets/emoji/6_171.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_172.png b/TMessagesProj/src/main/assets/emoji/6_172.png index 3289c1103..9542367c0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_172.png and b/TMessagesProj/src/main/assets/emoji/6_172.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_173.png b/TMessagesProj/src/main/assets/emoji/6_173.png index b53915db1..b45a79a97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_173.png and b/TMessagesProj/src/main/assets/emoji/6_173.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_174.png b/TMessagesProj/src/main/assets/emoji/6_174.png index c95e1b0f7..a30a3e2b3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_174.png and b/TMessagesProj/src/main/assets/emoji/6_174.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_175.png b/TMessagesProj/src/main/assets/emoji/6_175.png index be953dd00..b83d02c90 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_175.png and b/TMessagesProj/src/main/assets/emoji/6_175.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_176.png b/TMessagesProj/src/main/assets/emoji/6_176.png index 5176be242..603a6d6c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_176.png and b/TMessagesProj/src/main/assets/emoji/6_176.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_177.png b/TMessagesProj/src/main/assets/emoji/6_177.png index e58c86dd5..56e26e834 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_177.png and b/TMessagesProj/src/main/assets/emoji/6_177.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_178.png b/TMessagesProj/src/main/assets/emoji/6_178.png index 4dc675780..658149f10 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_178.png and b/TMessagesProj/src/main/assets/emoji/6_178.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_179.png b/TMessagesProj/src/main/assets/emoji/6_179.png index a90e25dfa..92ad95caf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_179.png and b/TMessagesProj/src/main/assets/emoji/6_179.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_18.png b/TMessagesProj/src/main/assets/emoji/6_18.png index f2fd6f3a1..abf255a88 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_18.png and b/TMessagesProj/src/main/assets/emoji/6_18.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_180.png b/TMessagesProj/src/main/assets/emoji/6_180.png index 90f7a17ff..098b393b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_180.png and b/TMessagesProj/src/main/assets/emoji/6_180.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_181.png b/TMessagesProj/src/main/assets/emoji/6_181.png index 7e30187ed..9b98b88d3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_181.png and b/TMessagesProj/src/main/assets/emoji/6_181.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_182.png b/TMessagesProj/src/main/assets/emoji/6_182.png index 055fe44e4..e620aa66d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_182.png and b/TMessagesProj/src/main/assets/emoji/6_182.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_183.png b/TMessagesProj/src/main/assets/emoji/6_183.png index 66c5bf79e..e308be52e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_183.png and b/TMessagesProj/src/main/assets/emoji/6_183.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_184.png b/TMessagesProj/src/main/assets/emoji/6_184.png index ea01f1ae9..33af5d40c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_184.png and b/TMessagesProj/src/main/assets/emoji/6_184.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_185.png b/TMessagesProj/src/main/assets/emoji/6_185.png index f41267b03..2e150dfea 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_185.png and b/TMessagesProj/src/main/assets/emoji/6_185.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_186.png b/TMessagesProj/src/main/assets/emoji/6_186.png index d17feae67..e99f8ed37 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_186.png and b/TMessagesProj/src/main/assets/emoji/6_186.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_187.png b/TMessagesProj/src/main/assets/emoji/6_187.png index d72fa6647..2a9df20b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_187.png and b/TMessagesProj/src/main/assets/emoji/6_187.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_188.png b/TMessagesProj/src/main/assets/emoji/6_188.png index 085409f3f..5284ca007 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_188.png and b/TMessagesProj/src/main/assets/emoji/6_188.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_189.png b/TMessagesProj/src/main/assets/emoji/6_189.png index 4f0f03ede..58c2b0c25 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_189.png and b/TMessagesProj/src/main/assets/emoji/6_189.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_19.png b/TMessagesProj/src/main/assets/emoji/6_19.png index 3c5e97dc5..c8493d15d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_19.png and b/TMessagesProj/src/main/assets/emoji/6_19.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_190.png b/TMessagesProj/src/main/assets/emoji/6_190.png index 241e2b010..4e702cf57 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_190.png and b/TMessagesProj/src/main/assets/emoji/6_190.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_191.png b/TMessagesProj/src/main/assets/emoji/6_191.png index 39dde8ea3..f6d1f4c4c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_191.png and b/TMessagesProj/src/main/assets/emoji/6_191.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_192.png b/TMessagesProj/src/main/assets/emoji/6_192.png index 010a00890..9fa3d55dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_192.png and b/TMessagesProj/src/main/assets/emoji/6_192.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_193.png b/TMessagesProj/src/main/assets/emoji/6_193.png index b738fa4dc..115c926dd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_193.png and b/TMessagesProj/src/main/assets/emoji/6_193.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_194.png b/TMessagesProj/src/main/assets/emoji/6_194.png index 169e60552..7e882d17c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_194.png and b/TMessagesProj/src/main/assets/emoji/6_194.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_195.png b/TMessagesProj/src/main/assets/emoji/6_195.png index 9030460ae..b9addb37d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_195.png and b/TMessagesProj/src/main/assets/emoji/6_195.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_196.png b/TMessagesProj/src/main/assets/emoji/6_196.png index 0f6616f7e..f1c981281 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_196.png and b/TMessagesProj/src/main/assets/emoji/6_196.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_197.png b/TMessagesProj/src/main/assets/emoji/6_197.png index c7de797b4..7e59bb889 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_197.png and b/TMessagesProj/src/main/assets/emoji/6_197.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_198.png b/TMessagesProj/src/main/assets/emoji/6_198.png index d5de71559..2d2c3d168 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_198.png and b/TMessagesProj/src/main/assets/emoji/6_198.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_199.png b/TMessagesProj/src/main/assets/emoji/6_199.png index 9a852412b..2a361459f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_199.png and b/TMessagesProj/src/main/assets/emoji/6_199.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_2.png b/TMessagesProj/src/main/assets/emoji/6_2.png index ff070624b..aa2ee1b17 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_2.png and b/TMessagesProj/src/main/assets/emoji/6_2.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_20.png b/TMessagesProj/src/main/assets/emoji/6_20.png index ee795a39a..3173d2a72 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_20.png and b/TMessagesProj/src/main/assets/emoji/6_20.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_200.png b/TMessagesProj/src/main/assets/emoji/6_200.png index a4663cc48..299c2a681 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_200.png and b/TMessagesProj/src/main/assets/emoji/6_200.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_201.png b/TMessagesProj/src/main/assets/emoji/6_201.png index 3ab1581b6..c0fbb4147 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_201.png and b/TMessagesProj/src/main/assets/emoji/6_201.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_202.png b/TMessagesProj/src/main/assets/emoji/6_202.png index e0e702339..fcaeecd16 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_202.png and b/TMessagesProj/src/main/assets/emoji/6_202.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_203.png b/TMessagesProj/src/main/assets/emoji/6_203.png index 2b1292838..13abf5e95 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_203.png and b/TMessagesProj/src/main/assets/emoji/6_203.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_204.png b/TMessagesProj/src/main/assets/emoji/6_204.png index fd3cbfe90..02818df2b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_204.png and b/TMessagesProj/src/main/assets/emoji/6_204.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_205.png b/TMessagesProj/src/main/assets/emoji/6_205.png index e6356ab98..e8b310288 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_205.png and b/TMessagesProj/src/main/assets/emoji/6_205.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_206.png b/TMessagesProj/src/main/assets/emoji/6_206.png index 7df6007d4..b3b650d29 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_206.png and b/TMessagesProj/src/main/assets/emoji/6_206.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_207.png b/TMessagesProj/src/main/assets/emoji/6_207.png index f5971dedb..d330aaacc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_207.png and b/TMessagesProj/src/main/assets/emoji/6_207.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_208.png b/TMessagesProj/src/main/assets/emoji/6_208.png index 9b6273e83..9bd5e1cfd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_208.png and b/TMessagesProj/src/main/assets/emoji/6_208.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_209.png b/TMessagesProj/src/main/assets/emoji/6_209.png index 32372b6da..a3d6e9968 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_209.png and b/TMessagesProj/src/main/assets/emoji/6_209.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_21.png b/TMessagesProj/src/main/assets/emoji/6_21.png index ab0da3db8..1f4939d40 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_21.png and b/TMessagesProj/src/main/assets/emoji/6_21.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_210.png b/TMessagesProj/src/main/assets/emoji/6_210.png index d04a7d1c4..c29f049f3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_210.png and b/TMessagesProj/src/main/assets/emoji/6_210.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_211.png b/TMessagesProj/src/main/assets/emoji/6_211.png index a250cfd0d..be0291edd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_211.png and b/TMessagesProj/src/main/assets/emoji/6_211.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_212.png b/TMessagesProj/src/main/assets/emoji/6_212.png index 5626bed5f..aa70f0041 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_212.png and b/TMessagesProj/src/main/assets/emoji/6_212.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_213.png b/TMessagesProj/src/main/assets/emoji/6_213.png index be241162e..75bf91f58 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_213.png and b/TMessagesProj/src/main/assets/emoji/6_213.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_214.png b/TMessagesProj/src/main/assets/emoji/6_214.png index 93245f51e..74a14d5dd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_214.png and b/TMessagesProj/src/main/assets/emoji/6_214.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_215.png b/TMessagesProj/src/main/assets/emoji/6_215.png index a52a404b3..70ade58bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_215.png and b/TMessagesProj/src/main/assets/emoji/6_215.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_216.png b/TMessagesProj/src/main/assets/emoji/6_216.png index ca18f16f1..898c68e85 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_216.png and b/TMessagesProj/src/main/assets/emoji/6_216.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_217.png b/TMessagesProj/src/main/assets/emoji/6_217.png index 749907f40..2c71cc79e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_217.png and b/TMessagesProj/src/main/assets/emoji/6_217.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_218.png b/TMessagesProj/src/main/assets/emoji/6_218.png index ab5443e90..49ee407d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_218.png and b/TMessagesProj/src/main/assets/emoji/6_218.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_219.png b/TMessagesProj/src/main/assets/emoji/6_219.png index 48d21fe85..f3c84918e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_219.png and b/TMessagesProj/src/main/assets/emoji/6_219.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_22.png b/TMessagesProj/src/main/assets/emoji/6_22.png index 917ce693f..f5bccc909 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_22.png and b/TMessagesProj/src/main/assets/emoji/6_22.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_220.png b/TMessagesProj/src/main/assets/emoji/6_220.png index 43b0d8b99..17a1e0fa8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_220.png and b/TMessagesProj/src/main/assets/emoji/6_220.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_221.png b/TMessagesProj/src/main/assets/emoji/6_221.png index ff9a7c746..4e76e514f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_221.png and b/TMessagesProj/src/main/assets/emoji/6_221.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_222.png b/TMessagesProj/src/main/assets/emoji/6_222.png index b213afb2e..6e2dd17c8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_222.png and b/TMessagesProj/src/main/assets/emoji/6_222.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_223.png b/TMessagesProj/src/main/assets/emoji/6_223.png index 94accbbd4..bc0e80d24 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_223.png and b/TMessagesProj/src/main/assets/emoji/6_223.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_224.png b/TMessagesProj/src/main/assets/emoji/6_224.png index 48a4ffb9f..b6a513c14 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_224.png and b/TMessagesProj/src/main/assets/emoji/6_224.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_225.png b/TMessagesProj/src/main/assets/emoji/6_225.png index d57b35b9b..b2fe3a2eb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_225.png and b/TMessagesProj/src/main/assets/emoji/6_225.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_226.png b/TMessagesProj/src/main/assets/emoji/6_226.png index 68f0e0980..6c776238a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_226.png and b/TMessagesProj/src/main/assets/emoji/6_226.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_227.png b/TMessagesProj/src/main/assets/emoji/6_227.png index e6c3f5d92..4bd55fc8e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_227.png and b/TMessagesProj/src/main/assets/emoji/6_227.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_228.png b/TMessagesProj/src/main/assets/emoji/6_228.png index 770810edd..a085c8a14 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_228.png and b/TMessagesProj/src/main/assets/emoji/6_228.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_229.png b/TMessagesProj/src/main/assets/emoji/6_229.png index 31a88dfe7..04af5fccb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_229.png and b/TMessagesProj/src/main/assets/emoji/6_229.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_23.png b/TMessagesProj/src/main/assets/emoji/6_23.png index e387ac78b..cf4dc2740 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_23.png and b/TMessagesProj/src/main/assets/emoji/6_23.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_230.png b/TMessagesProj/src/main/assets/emoji/6_230.png index 745e2c763..b9ced96fa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_230.png and b/TMessagesProj/src/main/assets/emoji/6_230.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_231.png b/TMessagesProj/src/main/assets/emoji/6_231.png index 6dd1c2611..8a7e6ff01 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_231.png and b/TMessagesProj/src/main/assets/emoji/6_231.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_232.png b/TMessagesProj/src/main/assets/emoji/6_232.png index dca46c454..cd3924499 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_232.png and b/TMessagesProj/src/main/assets/emoji/6_232.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_233.png b/TMessagesProj/src/main/assets/emoji/6_233.png index c18f2e977..c814f28be 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_233.png and b/TMessagesProj/src/main/assets/emoji/6_233.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_234.png b/TMessagesProj/src/main/assets/emoji/6_234.png index 07c79929d..0cc11bc93 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_234.png and b/TMessagesProj/src/main/assets/emoji/6_234.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_235.png b/TMessagesProj/src/main/assets/emoji/6_235.png index 13c0c28c7..8514bf18a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_235.png and b/TMessagesProj/src/main/assets/emoji/6_235.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_236.png b/TMessagesProj/src/main/assets/emoji/6_236.png index 35fb80bd4..b0c7cf215 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_236.png and b/TMessagesProj/src/main/assets/emoji/6_236.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_237.png b/TMessagesProj/src/main/assets/emoji/6_237.png index 8992bb2e8..4fdc879ca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_237.png and b/TMessagesProj/src/main/assets/emoji/6_237.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_238.png b/TMessagesProj/src/main/assets/emoji/6_238.png index 221e2b451..b4c8a0bdb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_238.png and b/TMessagesProj/src/main/assets/emoji/6_238.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_239.png b/TMessagesProj/src/main/assets/emoji/6_239.png index 1c7a0fb6d..cc295ba56 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_239.png and b/TMessagesProj/src/main/assets/emoji/6_239.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_24.png b/TMessagesProj/src/main/assets/emoji/6_24.png index a03ee6152..22165df85 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_24.png and b/TMessagesProj/src/main/assets/emoji/6_24.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_240.png b/TMessagesProj/src/main/assets/emoji/6_240.png index 49adef162..b13d89939 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_240.png and b/TMessagesProj/src/main/assets/emoji/6_240.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_241.png b/TMessagesProj/src/main/assets/emoji/6_241.png index 6ab9214ca..92cde504b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_241.png and b/TMessagesProj/src/main/assets/emoji/6_241.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_242.png b/TMessagesProj/src/main/assets/emoji/6_242.png index c3159c02f..cedb5bf70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_242.png and b/TMessagesProj/src/main/assets/emoji/6_242.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_243.png b/TMessagesProj/src/main/assets/emoji/6_243.png index de27955c3..c9aeb867f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_243.png and b/TMessagesProj/src/main/assets/emoji/6_243.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_244.png b/TMessagesProj/src/main/assets/emoji/6_244.png index 139666de4..9fc165434 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_244.png and b/TMessagesProj/src/main/assets/emoji/6_244.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_245.png b/TMessagesProj/src/main/assets/emoji/6_245.png index 8bb01037c..06dcb4875 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_245.png and b/TMessagesProj/src/main/assets/emoji/6_245.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_246.png b/TMessagesProj/src/main/assets/emoji/6_246.png index f448e651e..39531221b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_246.png and b/TMessagesProj/src/main/assets/emoji/6_246.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_247.png b/TMessagesProj/src/main/assets/emoji/6_247.png index bac06cb6b..87de8bdbd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_247.png and b/TMessagesProj/src/main/assets/emoji/6_247.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_248.png b/TMessagesProj/src/main/assets/emoji/6_248.png index bf6fc8ec7..7f293e883 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_248.png and b/TMessagesProj/src/main/assets/emoji/6_248.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_249.png b/TMessagesProj/src/main/assets/emoji/6_249.png index ba6ec3521..1d149957e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_249.png and b/TMessagesProj/src/main/assets/emoji/6_249.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_25.png b/TMessagesProj/src/main/assets/emoji/6_25.png index 9df7e59da..94db41b2d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_25.png and b/TMessagesProj/src/main/assets/emoji/6_25.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_250.png b/TMessagesProj/src/main/assets/emoji/6_250.png index 19c54daf3..db377029a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_250.png and b/TMessagesProj/src/main/assets/emoji/6_250.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_251.png b/TMessagesProj/src/main/assets/emoji/6_251.png index 8e210927b..3509abcfa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_251.png and b/TMessagesProj/src/main/assets/emoji/6_251.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_252.png b/TMessagesProj/src/main/assets/emoji/6_252.png index fcda5fa09..a912388b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_252.png and b/TMessagesProj/src/main/assets/emoji/6_252.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_253.png b/TMessagesProj/src/main/assets/emoji/6_253.png index 9ed0e1653..d37073354 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_253.png and b/TMessagesProj/src/main/assets/emoji/6_253.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_254.png b/TMessagesProj/src/main/assets/emoji/6_254.png index 91f146156..80b1c2a98 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_254.png and b/TMessagesProj/src/main/assets/emoji/6_254.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_255.png b/TMessagesProj/src/main/assets/emoji/6_255.png index c5c7df408..11bacf366 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_255.png and b/TMessagesProj/src/main/assets/emoji/6_255.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_256.png b/TMessagesProj/src/main/assets/emoji/6_256.png index bb97c6ad7..527faf5d7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_256.png and b/TMessagesProj/src/main/assets/emoji/6_256.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_257.png b/TMessagesProj/src/main/assets/emoji/6_257.png index ddae2e56f..d34684cc6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_257.png and b/TMessagesProj/src/main/assets/emoji/6_257.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_258.png b/TMessagesProj/src/main/assets/emoji/6_258.png index a28f4c357..244304e54 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_258.png and b/TMessagesProj/src/main/assets/emoji/6_258.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_259.png b/TMessagesProj/src/main/assets/emoji/6_259.png index 1d63835d8..86d3a609e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_259.png and b/TMessagesProj/src/main/assets/emoji/6_259.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_26.png b/TMessagesProj/src/main/assets/emoji/6_26.png index 2b50fb619..d4a0dd437 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_26.png and b/TMessagesProj/src/main/assets/emoji/6_26.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_260.png b/TMessagesProj/src/main/assets/emoji/6_260.png index dcb3dc2b5..33b4fdd2b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_260.png and b/TMessagesProj/src/main/assets/emoji/6_260.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_261.png b/TMessagesProj/src/main/assets/emoji/6_261.png index fbf98220f..a34ad938f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_261.png and b/TMessagesProj/src/main/assets/emoji/6_261.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_262.png b/TMessagesProj/src/main/assets/emoji/6_262.png index c461b6d25..d2eecb882 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_262.png and b/TMessagesProj/src/main/assets/emoji/6_262.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_263.png b/TMessagesProj/src/main/assets/emoji/6_263.png index 3b2887417..58c9a117d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_263.png and b/TMessagesProj/src/main/assets/emoji/6_263.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_264.png b/TMessagesProj/src/main/assets/emoji/6_264.png index f2cdb86c1..043820d3c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_264.png and b/TMessagesProj/src/main/assets/emoji/6_264.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_265.png b/TMessagesProj/src/main/assets/emoji/6_265.png index 8a49dece3..9eabcfee0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_265.png and b/TMessagesProj/src/main/assets/emoji/6_265.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_266.png b/TMessagesProj/src/main/assets/emoji/6_266.png index 0e3fc57eb..ad540db6f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_266.png and b/TMessagesProj/src/main/assets/emoji/6_266.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_267.png b/TMessagesProj/src/main/assets/emoji/6_267.png index 38c8b1344..5116b7641 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_267.png and b/TMessagesProj/src/main/assets/emoji/6_267.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_268.png b/TMessagesProj/src/main/assets/emoji/6_268.png index 859965652..8e44da982 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_268.png and b/TMessagesProj/src/main/assets/emoji/6_268.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_269.png b/TMessagesProj/src/main/assets/emoji/6_269.png index 014c4c9e6..6dd5dcc39 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_269.png and b/TMessagesProj/src/main/assets/emoji/6_269.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_27.png b/TMessagesProj/src/main/assets/emoji/6_27.png index a12a659fa..0b3026cf5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_27.png and b/TMessagesProj/src/main/assets/emoji/6_27.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_270.png b/TMessagesProj/src/main/assets/emoji/6_270.png index 424b253f8..b99d06e01 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_270.png and b/TMessagesProj/src/main/assets/emoji/6_270.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_271.png b/TMessagesProj/src/main/assets/emoji/6_271.png index dbd115d7f..051e67fe0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_271.png and b/TMessagesProj/src/main/assets/emoji/6_271.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_272.png b/TMessagesProj/src/main/assets/emoji/6_272.png index 2a52722df..8c8c543e9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_272.png and b/TMessagesProj/src/main/assets/emoji/6_272.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_273.png b/TMessagesProj/src/main/assets/emoji/6_273.png index 65030cabd..b846a8f0e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_273.png and b/TMessagesProj/src/main/assets/emoji/6_273.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_274.png b/TMessagesProj/src/main/assets/emoji/6_274.png index 266733f6a..4ef6f6546 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_274.png and b/TMessagesProj/src/main/assets/emoji/6_274.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_275.png b/TMessagesProj/src/main/assets/emoji/6_275.png index 241de4b73..22fb6fa35 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_275.png and b/TMessagesProj/src/main/assets/emoji/6_275.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_276.png b/TMessagesProj/src/main/assets/emoji/6_276.png index 10dd7e091..a8ca914c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_276.png and b/TMessagesProj/src/main/assets/emoji/6_276.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_277.png b/TMessagesProj/src/main/assets/emoji/6_277.png index c797a5c6b..efa38ea9e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_277.png and b/TMessagesProj/src/main/assets/emoji/6_277.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_278.png b/TMessagesProj/src/main/assets/emoji/6_278.png index 6d2f2feb7..4e7f73582 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_278.png and b/TMessagesProj/src/main/assets/emoji/6_278.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_279.png b/TMessagesProj/src/main/assets/emoji/6_279.png index df4288936..e914f4d79 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_279.png and b/TMessagesProj/src/main/assets/emoji/6_279.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_28.png b/TMessagesProj/src/main/assets/emoji/6_28.png index f253d9fae..a6fadad0b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_28.png and b/TMessagesProj/src/main/assets/emoji/6_28.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_280.png b/TMessagesProj/src/main/assets/emoji/6_280.png index 443cda1c8..79faffb94 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_280.png and b/TMessagesProj/src/main/assets/emoji/6_280.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_281.png b/TMessagesProj/src/main/assets/emoji/6_281.png index 5258b9793..a732cb93c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_281.png and b/TMessagesProj/src/main/assets/emoji/6_281.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_282.png b/TMessagesProj/src/main/assets/emoji/6_282.png index 9ea51debe..ee7797575 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_282.png and b/TMessagesProj/src/main/assets/emoji/6_282.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_283.png b/TMessagesProj/src/main/assets/emoji/6_283.png index 71a1bd812..ba8144c5b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_283.png and b/TMessagesProj/src/main/assets/emoji/6_283.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_284.png b/TMessagesProj/src/main/assets/emoji/6_284.png index 24790e1dd..63cee6ee7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_284.png and b/TMessagesProj/src/main/assets/emoji/6_284.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_285.png b/TMessagesProj/src/main/assets/emoji/6_285.png index 0770a8683..dcd0fb462 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_285.png and b/TMessagesProj/src/main/assets/emoji/6_285.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_286.png b/TMessagesProj/src/main/assets/emoji/6_286.png index 559ed86b5..6e93a7857 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_286.png and b/TMessagesProj/src/main/assets/emoji/6_286.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_287.png b/TMessagesProj/src/main/assets/emoji/6_287.png index 9ff047b2b..222f42be3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_287.png and b/TMessagesProj/src/main/assets/emoji/6_287.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_288.png b/TMessagesProj/src/main/assets/emoji/6_288.png index 8ca9e33ba..8c7d95009 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_288.png and b/TMessagesProj/src/main/assets/emoji/6_288.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_289.png b/TMessagesProj/src/main/assets/emoji/6_289.png index e1f9a5923..fb06b9e1d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_289.png and b/TMessagesProj/src/main/assets/emoji/6_289.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_29.png b/TMessagesProj/src/main/assets/emoji/6_29.png index 5fa82b1c6..3c7c5997c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_29.png and b/TMessagesProj/src/main/assets/emoji/6_29.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_290.png b/TMessagesProj/src/main/assets/emoji/6_290.png index fc57cf1d9..6e4061cc9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_290.png and b/TMessagesProj/src/main/assets/emoji/6_290.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_291.png b/TMessagesProj/src/main/assets/emoji/6_291.png index 0e17053b0..8c6cdaba2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_291.png and b/TMessagesProj/src/main/assets/emoji/6_291.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_292.png b/TMessagesProj/src/main/assets/emoji/6_292.png index 9abd03d63..1c09def8f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_292.png and b/TMessagesProj/src/main/assets/emoji/6_292.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_293.png b/TMessagesProj/src/main/assets/emoji/6_293.png index d105b7b86..bcf960e41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_293.png and b/TMessagesProj/src/main/assets/emoji/6_293.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_294.png b/TMessagesProj/src/main/assets/emoji/6_294.png index 5becae5d3..c31b4bc3a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_294.png and b/TMessagesProj/src/main/assets/emoji/6_294.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_295.png b/TMessagesProj/src/main/assets/emoji/6_295.png index 1a166f017..bd4ab3bbd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_295.png and b/TMessagesProj/src/main/assets/emoji/6_295.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_296.png b/TMessagesProj/src/main/assets/emoji/6_296.png index 6a916b165..a810d6a0a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_296.png and b/TMessagesProj/src/main/assets/emoji/6_296.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_297.png b/TMessagesProj/src/main/assets/emoji/6_297.png index 3e387f8c4..04e93645b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_297.png and b/TMessagesProj/src/main/assets/emoji/6_297.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_3.png b/TMessagesProj/src/main/assets/emoji/6_3.png index 2e2787c11..1e96ae1ca 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_3.png and b/TMessagesProj/src/main/assets/emoji/6_3.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_30.png b/TMessagesProj/src/main/assets/emoji/6_30.png index a4a0641be..8abadc591 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_30.png and b/TMessagesProj/src/main/assets/emoji/6_30.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_31.png b/TMessagesProj/src/main/assets/emoji/6_31.png index 5ff73fe63..0fd37f4d6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_31.png and b/TMessagesProj/src/main/assets/emoji/6_31.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_32.png b/TMessagesProj/src/main/assets/emoji/6_32.png index 80478225d..eb43c0fcc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_32.png and b/TMessagesProj/src/main/assets/emoji/6_32.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_33.png b/TMessagesProj/src/main/assets/emoji/6_33.png index f1ea5d1f8..d08215505 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_33.png and b/TMessagesProj/src/main/assets/emoji/6_33.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_34.png b/TMessagesProj/src/main/assets/emoji/6_34.png index eed5f724a..6d5dd056b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_34.png and b/TMessagesProj/src/main/assets/emoji/6_34.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_35.png b/TMessagesProj/src/main/assets/emoji/6_35.png index 0802ce357..7979f374c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_35.png and b/TMessagesProj/src/main/assets/emoji/6_35.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_36.png b/TMessagesProj/src/main/assets/emoji/6_36.png index 144f0b691..c9b6d6ed6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_36.png and b/TMessagesProj/src/main/assets/emoji/6_36.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_37.png b/TMessagesProj/src/main/assets/emoji/6_37.png index 17fbe6746..a4b804f6c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_37.png and b/TMessagesProj/src/main/assets/emoji/6_37.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_38.png b/TMessagesProj/src/main/assets/emoji/6_38.png index 6fe8a5751..1b60a4ed8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_38.png and b/TMessagesProj/src/main/assets/emoji/6_38.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_39.png b/TMessagesProj/src/main/assets/emoji/6_39.png index 8da1e0eea..7d635f1f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_39.png and b/TMessagesProj/src/main/assets/emoji/6_39.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_4.png b/TMessagesProj/src/main/assets/emoji/6_4.png index 8f192ac53..a7f39f353 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_4.png and b/TMessagesProj/src/main/assets/emoji/6_4.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_40.png b/TMessagesProj/src/main/assets/emoji/6_40.png index 958b4fc1b..5896dc460 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_40.png and b/TMessagesProj/src/main/assets/emoji/6_40.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_41.png b/TMessagesProj/src/main/assets/emoji/6_41.png index 578a43f01..1e7d05066 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_41.png and b/TMessagesProj/src/main/assets/emoji/6_41.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_42.png b/TMessagesProj/src/main/assets/emoji/6_42.png index 72dff2270..885eae863 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_42.png and b/TMessagesProj/src/main/assets/emoji/6_42.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_43.png b/TMessagesProj/src/main/assets/emoji/6_43.png index ac46a08d3..d904eacb2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_43.png and b/TMessagesProj/src/main/assets/emoji/6_43.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_44.png b/TMessagesProj/src/main/assets/emoji/6_44.png index 88f54a382..7c201f3df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_44.png and b/TMessagesProj/src/main/assets/emoji/6_44.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_45.png b/TMessagesProj/src/main/assets/emoji/6_45.png index b3bb4a0da..10492081c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_45.png and b/TMessagesProj/src/main/assets/emoji/6_45.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_46.png b/TMessagesProj/src/main/assets/emoji/6_46.png index 3482a8bc2..d9ac2454e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_46.png and b/TMessagesProj/src/main/assets/emoji/6_46.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_47.png b/TMessagesProj/src/main/assets/emoji/6_47.png index dbe10acaf..3050788bf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_47.png and b/TMessagesProj/src/main/assets/emoji/6_47.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_48.png b/TMessagesProj/src/main/assets/emoji/6_48.png index 9e4b5dcc1..fcdf2ebc8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_48.png and b/TMessagesProj/src/main/assets/emoji/6_48.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_49.png b/TMessagesProj/src/main/assets/emoji/6_49.png index 5096e871c..33631b00c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_49.png and b/TMessagesProj/src/main/assets/emoji/6_49.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_5.png b/TMessagesProj/src/main/assets/emoji/6_5.png index 765f84425..e0637c102 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_5.png and b/TMessagesProj/src/main/assets/emoji/6_5.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_50.png b/TMessagesProj/src/main/assets/emoji/6_50.png index 2a1530594..771f6603d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_50.png and b/TMessagesProj/src/main/assets/emoji/6_50.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_51.png b/TMessagesProj/src/main/assets/emoji/6_51.png index 73e525e92..36df632e9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_51.png and b/TMessagesProj/src/main/assets/emoji/6_51.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_52.png b/TMessagesProj/src/main/assets/emoji/6_52.png index 735f5df1f..660421ba9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_52.png and b/TMessagesProj/src/main/assets/emoji/6_52.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_53.png b/TMessagesProj/src/main/assets/emoji/6_53.png index 41a361831..6cd196fb4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_53.png and b/TMessagesProj/src/main/assets/emoji/6_53.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_54.png b/TMessagesProj/src/main/assets/emoji/6_54.png index 39da68864..36656c9df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_54.png and b/TMessagesProj/src/main/assets/emoji/6_54.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_55.png b/TMessagesProj/src/main/assets/emoji/6_55.png index 3d62e72d3..282c3b2b3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_55.png and b/TMessagesProj/src/main/assets/emoji/6_55.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_56.png b/TMessagesProj/src/main/assets/emoji/6_56.png index 6947d1b8b..92a35226d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_56.png and b/TMessagesProj/src/main/assets/emoji/6_56.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_57.png b/TMessagesProj/src/main/assets/emoji/6_57.png index 0d64c2050..15e37ecfe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_57.png and b/TMessagesProj/src/main/assets/emoji/6_57.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_58.png b/TMessagesProj/src/main/assets/emoji/6_58.png index 744dcc23f..15823f03b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_58.png and b/TMessagesProj/src/main/assets/emoji/6_58.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_59.png b/TMessagesProj/src/main/assets/emoji/6_59.png index 3b76efebe..2f0aa63dd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_59.png and b/TMessagesProj/src/main/assets/emoji/6_59.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_6.png b/TMessagesProj/src/main/assets/emoji/6_6.png index d22c92294..7dbf615ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_6.png and b/TMessagesProj/src/main/assets/emoji/6_6.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_60.png b/TMessagesProj/src/main/assets/emoji/6_60.png index ea383101c..4b3afc6cf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_60.png and b/TMessagesProj/src/main/assets/emoji/6_60.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_61.png b/TMessagesProj/src/main/assets/emoji/6_61.png index 669022ff3..855d37c5b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_61.png and b/TMessagesProj/src/main/assets/emoji/6_61.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_62.png b/TMessagesProj/src/main/assets/emoji/6_62.png index d8a87fc57..7ff21d95c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_62.png and b/TMessagesProj/src/main/assets/emoji/6_62.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_63.png b/TMessagesProj/src/main/assets/emoji/6_63.png index 17e4d039e..a2e0325df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_63.png and b/TMessagesProj/src/main/assets/emoji/6_63.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_64.png b/TMessagesProj/src/main/assets/emoji/6_64.png index 6a211cd43..0b89ec9f5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_64.png and b/TMessagesProj/src/main/assets/emoji/6_64.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_65.png b/TMessagesProj/src/main/assets/emoji/6_65.png index f6d91cfc3..3012bb56a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_65.png and b/TMessagesProj/src/main/assets/emoji/6_65.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_66.png b/TMessagesProj/src/main/assets/emoji/6_66.png index 8c1171443..37f948acd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_66.png and b/TMessagesProj/src/main/assets/emoji/6_66.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_67.png b/TMessagesProj/src/main/assets/emoji/6_67.png index 106a5afb1..2de16ccd4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_67.png and b/TMessagesProj/src/main/assets/emoji/6_67.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_68.png b/TMessagesProj/src/main/assets/emoji/6_68.png index f3541fc1c..43a3939a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_68.png and b/TMessagesProj/src/main/assets/emoji/6_68.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_69.png b/TMessagesProj/src/main/assets/emoji/6_69.png index 47a9fb2f6..2ffb137d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_69.png and b/TMessagesProj/src/main/assets/emoji/6_69.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_7.png b/TMessagesProj/src/main/assets/emoji/6_7.png index ebd985059..027d4f76a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_7.png and b/TMessagesProj/src/main/assets/emoji/6_7.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_70.png b/TMessagesProj/src/main/assets/emoji/6_70.png index fbf98c9e8..ac1db913e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_70.png and b/TMessagesProj/src/main/assets/emoji/6_70.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_71.png b/TMessagesProj/src/main/assets/emoji/6_71.png index 2adc4ec6e..6a18020bb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_71.png and b/TMessagesProj/src/main/assets/emoji/6_71.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_72.png b/TMessagesProj/src/main/assets/emoji/6_72.png index 45598903b..a2f94ead6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_72.png and b/TMessagesProj/src/main/assets/emoji/6_72.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_73.png b/TMessagesProj/src/main/assets/emoji/6_73.png index 2c61ff864..84ff60ec3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_73.png and b/TMessagesProj/src/main/assets/emoji/6_73.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_74.png b/TMessagesProj/src/main/assets/emoji/6_74.png index ae296009a..98a31f5d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_74.png and b/TMessagesProj/src/main/assets/emoji/6_74.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_75.png b/TMessagesProj/src/main/assets/emoji/6_75.png index 0e7880f7d..1871a1096 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_75.png and b/TMessagesProj/src/main/assets/emoji/6_75.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_76.png b/TMessagesProj/src/main/assets/emoji/6_76.png index 51ac50b6a..c3eaedafd 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_76.png and b/TMessagesProj/src/main/assets/emoji/6_76.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_77.png b/TMessagesProj/src/main/assets/emoji/6_77.png index d21c5c281..923c3b521 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_77.png and b/TMessagesProj/src/main/assets/emoji/6_77.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_78.png b/TMessagesProj/src/main/assets/emoji/6_78.png index 693821160..7306b07ec 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_78.png and b/TMessagesProj/src/main/assets/emoji/6_78.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_79.png b/TMessagesProj/src/main/assets/emoji/6_79.png index 1a8dfc93c..1724fdba0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_79.png and b/TMessagesProj/src/main/assets/emoji/6_79.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_8.png b/TMessagesProj/src/main/assets/emoji/6_8.png index cb2a61795..15929f2f0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_8.png and b/TMessagesProj/src/main/assets/emoji/6_8.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_80.png b/TMessagesProj/src/main/assets/emoji/6_80.png index 8ef2de507..50e0d4e83 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_80.png and b/TMessagesProj/src/main/assets/emoji/6_80.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_81.png b/TMessagesProj/src/main/assets/emoji/6_81.png index 42e0febf1..151f3a2ed 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_81.png and b/TMessagesProj/src/main/assets/emoji/6_81.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_82.png b/TMessagesProj/src/main/assets/emoji/6_82.png index 00d8ac6b4..bb8b3d378 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_82.png and b/TMessagesProj/src/main/assets/emoji/6_82.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_83.png b/TMessagesProj/src/main/assets/emoji/6_83.png index b85bf10b6..769dffadb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_83.png and b/TMessagesProj/src/main/assets/emoji/6_83.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_84.png b/TMessagesProj/src/main/assets/emoji/6_84.png index 002bbb3bf..95fc90aaa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_84.png and b/TMessagesProj/src/main/assets/emoji/6_84.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_85.png b/TMessagesProj/src/main/assets/emoji/6_85.png index 035f5a97b..375aecb55 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_85.png and b/TMessagesProj/src/main/assets/emoji/6_85.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_86.png b/TMessagesProj/src/main/assets/emoji/6_86.png index 5f1fa3afc..15a22ea03 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_86.png and b/TMessagesProj/src/main/assets/emoji/6_86.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_87.png b/TMessagesProj/src/main/assets/emoji/6_87.png index 48b2d2950..8f07e1047 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_87.png and b/TMessagesProj/src/main/assets/emoji/6_87.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_88.png b/TMessagesProj/src/main/assets/emoji/6_88.png index 3b5129a95..620f14797 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_88.png and b/TMessagesProj/src/main/assets/emoji/6_88.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_89.png b/TMessagesProj/src/main/assets/emoji/6_89.png index 472495314..ada731d06 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_89.png and b/TMessagesProj/src/main/assets/emoji/6_89.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_9.png b/TMessagesProj/src/main/assets/emoji/6_9.png index 54cead2ef..0299ac451 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_9.png and b/TMessagesProj/src/main/assets/emoji/6_9.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_90.png b/TMessagesProj/src/main/assets/emoji/6_90.png index bb62b720e..5a35a3b0a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_90.png and b/TMessagesProj/src/main/assets/emoji/6_90.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_91.png b/TMessagesProj/src/main/assets/emoji/6_91.png index 245964eaa..74ee5f560 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_91.png and b/TMessagesProj/src/main/assets/emoji/6_91.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_92.png b/TMessagesProj/src/main/assets/emoji/6_92.png index 7394e08d0..1d4b21d98 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_92.png and b/TMessagesProj/src/main/assets/emoji/6_92.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_93.png b/TMessagesProj/src/main/assets/emoji/6_93.png index 946c2856e..920ae1d8d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_93.png and b/TMessagesProj/src/main/assets/emoji/6_93.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_94.png b/TMessagesProj/src/main/assets/emoji/6_94.png index a9754c291..f38142de4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_94.png and b/TMessagesProj/src/main/assets/emoji/6_94.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_95.png b/TMessagesProj/src/main/assets/emoji/6_95.png index f900af999..74721f37c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_95.png and b/TMessagesProj/src/main/assets/emoji/6_95.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_96.png b/TMessagesProj/src/main/assets/emoji/6_96.png index f6be17df0..b0b842599 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_96.png and b/TMessagesProj/src/main/assets/emoji/6_96.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_97.png b/TMessagesProj/src/main/assets/emoji/6_97.png index eb23f4438..8d40f7969 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_97.png and b/TMessagesProj/src/main/assets/emoji/6_97.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_98.png b/TMessagesProj/src/main/assets/emoji/6_98.png index 898bda06e..21ed53cde 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_98.png and b/TMessagesProj/src/main/assets/emoji/6_98.png differ diff --git a/TMessagesProj/src/main/assets/emoji/6_99.png b/TMessagesProj/src/main/assets/emoji/6_99.png index 864029d3e..0692ef248 100644 Binary files a/TMessagesProj/src/main/assets/emoji/6_99.png and b/TMessagesProj/src/main/assets/emoji/6_99.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_0.png b/TMessagesProj/src/main/assets/emoji/7_0.png index 1c9fddac4..212b86fb1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_0.png and b/TMessagesProj/src/main/assets/emoji/7_0.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_1.png b/TMessagesProj/src/main/assets/emoji/7_1.png index be2410d86..fde676a8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_1.png and b/TMessagesProj/src/main/assets/emoji/7_1.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_10.png b/TMessagesProj/src/main/assets/emoji/7_10.png index 2a73368ca..5e745e41f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_10.png and b/TMessagesProj/src/main/assets/emoji/7_10.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_100.png b/TMessagesProj/src/main/assets/emoji/7_100.png index ad429eca7..a6c6d53d4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_100.png and b/TMessagesProj/src/main/assets/emoji/7_100.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_101.png b/TMessagesProj/src/main/assets/emoji/7_101.png index 3c80ea7cf..914de277e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_101.png and b/TMessagesProj/src/main/assets/emoji/7_101.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_102.png b/TMessagesProj/src/main/assets/emoji/7_102.png index cd5bf0efc..557bb23d7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_102.png and b/TMessagesProj/src/main/assets/emoji/7_102.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_103.png b/TMessagesProj/src/main/assets/emoji/7_103.png index 0a2074da0..6398d337f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_103.png and b/TMessagesProj/src/main/assets/emoji/7_103.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_104.png b/TMessagesProj/src/main/assets/emoji/7_104.png index 36cffaa2e..41b6333db 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_104.png and b/TMessagesProj/src/main/assets/emoji/7_104.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_105.png b/TMessagesProj/src/main/assets/emoji/7_105.png index c7bd00302..22ab30c46 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_105.png and b/TMessagesProj/src/main/assets/emoji/7_105.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_106.png b/TMessagesProj/src/main/assets/emoji/7_106.png index 37afa3dcb..44baad1f1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_106.png and b/TMessagesProj/src/main/assets/emoji/7_106.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_107.png b/TMessagesProj/src/main/assets/emoji/7_107.png index c9e14a490..10a7f37ba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_107.png and b/TMessagesProj/src/main/assets/emoji/7_107.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_108.png b/TMessagesProj/src/main/assets/emoji/7_108.png index 9bb4d8ead..a4f5c51b8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_108.png and b/TMessagesProj/src/main/assets/emoji/7_108.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_109.png b/TMessagesProj/src/main/assets/emoji/7_109.png index 911ee8808..4b3891da5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_109.png and b/TMessagesProj/src/main/assets/emoji/7_109.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_11.png b/TMessagesProj/src/main/assets/emoji/7_11.png index a90c40817..5fc15898c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_11.png and b/TMessagesProj/src/main/assets/emoji/7_11.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_110.png b/TMessagesProj/src/main/assets/emoji/7_110.png index ad31295a6..997350948 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_110.png and b/TMessagesProj/src/main/assets/emoji/7_110.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_111.png b/TMessagesProj/src/main/assets/emoji/7_111.png index 9af66311d..a34c2d083 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_111.png and b/TMessagesProj/src/main/assets/emoji/7_111.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_112.png b/TMessagesProj/src/main/assets/emoji/7_112.png index b5426e85b..3890411ae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_112.png and b/TMessagesProj/src/main/assets/emoji/7_112.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_113.png b/TMessagesProj/src/main/assets/emoji/7_113.png index c7781a367..41bdebd77 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_113.png and b/TMessagesProj/src/main/assets/emoji/7_113.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_114.png b/TMessagesProj/src/main/assets/emoji/7_114.png index 2e4bac122..ac2f50bf4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_114.png and b/TMessagesProj/src/main/assets/emoji/7_114.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_115.png b/TMessagesProj/src/main/assets/emoji/7_115.png index c03d19af0..859402afe 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_115.png and b/TMessagesProj/src/main/assets/emoji/7_115.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_116.png b/TMessagesProj/src/main/assets/emoji/7_116.png index b693f1c66..840393f1e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_116.png and b/TMessagesProj/src/main/assets/emoji/7_116.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_117.png b/TMessagesProj/src/main/assets/emoji/7_117.png index d7551fda5..dbd9d378a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_117.png and b/TMessagesProj/src/main/assets/emoji/7_117.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_118.png b/TMessagesProj/src/main/assets/emoji/7_118.png index 482bbaf66..6b469f1c3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_118.png and b/TMessagesProj/src/main/assets/emoji/7_118.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_119.png b/TMessagesProj/src/main/assets/emoji/7_119.png index c5b746c6c..8096e1ff4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_119.png and b/TMessagesProj/src/main/assets/emoji/7_119.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_12.png b/TMessagesProj/src/main/assets/emoji/7_12.png index 7e18e6d5c..34de193d0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_12.png and b/TMessagesProj/src/main/assets/emoji/7_12.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_120.png b/TMessagesProj/src/main/assets/emoji/7_120.png index fb035fab5..dff77d3cf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_120.png and b/TMessagesProj/src/main/assets/emoji/7_120.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_121.png b/TMessagesProj/src/main/assets/emoji/7_121.png index 465a96f89..166cfc39a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_121.png and b/TMessagesProj/src/main/assets/emoji/7_121.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_122.png b/TMessagesProj/src/main/assets/emoji/7_122.png index ef76579a9..64200db39 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_122.png and b/TMessagesProj/src/main/assets/emoji/7_122.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_123.png b/TMessagesProj/src/main/assets/emoji/7_123.png index 4bef8e53c..d9f8e8557 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_123.png and b/TMessagesProj/src/main/assets/emoji/7_123.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_124.png b/TMessagesProj/src/main/assets/emoji/7_124.png index fd0c5245b..ab0448dd1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_124.png and b/TMessagesProj/src/main/assets/emoji/7_124.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_125.png b/TMessagesProj/src/main/assets/emoji/7_125.png index a672967f0..4950cf9e6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_125.png and b/TMessagesProj/src/main/assets/emoji/7_125.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_126.png b/TMessagesProj/src/main/assets/emoji/7_126.png index 966a1ac10..41d8391b6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_126.png and b/TMessagesProj/src/main/assets/emoji/7_126.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_127.png b/TMessagesProj/src/main/assets/emoji/7_127.png index e6ef14a00..7933d8a58 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_127.png and b/TMessagesProj/src/main/assets/emoji/7_127.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_128.png b/TMessagesProj/src/main/assets/emoji/7_128.png index bd50f0b07..dd34adfb0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_128.png and b/TMessagesProj/src/main/assets/emoji/7_128.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_129.png b/TMessagesProj/src/main/assets/emoji/7_129.png index 93457942e..504615f33 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_129.png and b/TMessagesProj/src/main/assets/emoji/7_129.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_13.png b/TMessagesProj/src/main/assets/emoji/7_13.png index 392ebaa99..816a0bb0a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_13.png and b/TMessagesProj/src/main/assets/emoji/7_13.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_130.png b/TMessagesProj/src/main/assets/emoji/7_130.png index c9887c0e2..58461da5f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_130.png and b/TMessagesProj/src/main/assets/emoji/7_130.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_131.png b/TMessagesProj/src/main/assets/emoji/7_131.png index 8296d902b..ec4034886 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_131.png and b/TMessagesProj/src/main/assets/emoji/7_131.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_132.png b/TMessagesProj/src/main/assets/emoji/7_132.png index 3b85c0a37..d4686544f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_132.png and b/TMessagesProj/src/main/assets/emoji/7_132.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_133.png b/TMessagesProj/src/main/assets/emoji/7_133.png index d84f49104..447c67c8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_133.png and b/TMessagesProj/src/main/assets/emoji/7_133.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_134.png b/TMessagesProj/src/main/assets/emoji/7_134.png index 46877d0ea..d098f0551 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_134.png and b/TMessagesProj/src/main/assets/emoji/7_134.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_135.png b/TMessagesProj/src/main/assets/emoji/7_135.png index 55d7df115..def61a247 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_135.png and b/TMessagesProj/src/main/assets/emoji/7_135.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_136.png b/TMessagesProj/src/main/assets/emoji/7_136.png index b6cbe88ed..d209b38c7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_136.png and b/TMessagesProj/src/main/assets/emoji/7_136.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_137.png b/TMessagesProj/src/main/assets/emoji/7_137.png index d978085b2..b70e056ba 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_137.png and b/TMessagesProj/src/main/assets/emoji/7_137.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_138.png b/TMessagesProj/src/main/assets/emoji/7_138.png index d40b04576..8ccabe50f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_138.png and b/TMessagesProj/src/main/assets/emoji/7_138.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_139.png b/TMessagesProj/src/main/assets/emoji/7_139.png index 4835078b2..6bad04222 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_139.png and b/TMessagesProj/src/main/assets/emoji/7_139.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_14.png b/TMessagesProj/src/main/assets/emoji/7_14.png index 2125603ab..31dcbbf3a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_14.png and b/TMessagesProj/src/main/assets/emoji/7_14.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_140.png b/TMessagesProj/src/main/assets/emoji/7_140.png index 79c48666e..25f0778f4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_140.png and b/TMessagesProj/src/main/assets/emoji/7_140.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_141.png b/TMessagesProj/src/main/assets/emoji/7_141.png index 5bbd71774..36c4d7850 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_141.png and b/TMessagesProj/src/main/assets/emoji/7_141.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_142.png b/TMessagesProj/src/main/assets/emoji/7_142.png index 3267afb9e..fc59e86a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_142.png and b/TMessagesProj/src/main/assets/emoji/7_142.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_143.png b/TMessagesProj/src/main/assets/emoji/7_143.png index 17d0c58d5..bb1d7ebcf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_143.png and b/TMessagesProj/src/main/assets/emoji/7_143.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_144.png b/TMessagesProj/src/main/assets/emoji/7_144.png index 9919357eb..3391a90f5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_144.png and b/TMessagesProj/src/main/assets/emoji/7_144.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_145.png b/TMessagesProj/src/main/assets/emoji/7_145.png index af5b8bd84..07f2807c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_145.png and b/TMessagesProj/src/main/assets/emoji/7_145.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_146.png b/TMessagesProj/src/main/assets/emoji/7_146.png index 2444a431a..c948e24eb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_146.png and b/TMessagesProj/src/main/assets/emoji/7_146.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_147.png b/TMessagesProj/src/main/assets/emoji/7_147.png index 91d62d98e..c5d6e373b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_147.png and b/TMessagesProj/src/main/assets/emoji/7_147.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_148.png b/TMessagesProj/src/main/assets/emoji/7_148.png index 30c484908..669b27b9b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_148.png and b/TMessagesProj/src/main/assets/emoji/7_148.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_149.png b/TMessagesProj/src/main/assets/emoji/7_149.png index 30b74067c..4c9f5292a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_149.png and b/TMessagesProj/src/main/assets/emoji/7_149.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_15.png b/TMessagesProj/src/main/assets/emoji/7_15.png index 1cd0eabf0..eac43f307 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_15.png and b/TMessagesProj/src/main/assets/emoji/7_15.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_150.png b/TMessagesProj/src/main/assets/emoji/7_150.png index 872c5d97c..9ad64d6f6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_150.png and b/TMessagesProj/src/main/assets/emoji/7_150.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_151.png b/TMessagesProj/src/main/assets/emoji/7_151.png index 77708c2b9..402d6d305 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_151.png and b/TMessagesProj/src/main/assets/emoji/7_151.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_152.png b/TMessagesProj/src/main/assets/emoji/7_152.png index c096ca320..7e9ae9136 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_152.png and b/TMessagesProj/src/main/assets/emoji/7_152.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_153.png b/TMessagesProj/src/main/assets/emoji/7_153.png index 049781a17..5ddce5a53 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_153.png and b/TMessagesProj/src/main/assets/emoji/7_153.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_154.png b/TMessagesProj/src/main/assets/emoji/7_154.png index 161aa5bd7..5fe1cfd55 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_154.png and b/TMessagesProj/src/main/assets/emoji/7_154.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_155.png b/TMessagesProj/src/main/assets/emoji/7_155.png index d26db47bd..237fd69b0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_155.png and b/TMessagesProj/src/main/assets/emoji/7_155.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_156.png b/TMessagesProj/src/main/assets/emoji/7_156.png index ec7f2dfb3..2ec5dde2b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_156.png and b/TMessagesProj/src/main/assets/emoji/7_156.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_157.png b/TMessagesProj/src/main/assets/emoji/7_157.png index fec0fea2c..6420ccbcc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_157.png and b/TMessagesProj/src/main/assets/emoji/7_157.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_158.png b/TMessagesProj/src/main/assets/emoji/7_158.png index 2628e4d36..7dacecf16 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_158.png and b/TMessagesProj/src/main/assets/emoji/7_158.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_159.png b/TMessagesProj/src/main/assets/emoji/7_159.png index 7d9f32cef..9ea4542e0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_159.png and b/TMessagesProj/src/main/assets/emoji/7_159.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_16.png b/TMessagesProj/src/main/assets/emoji/7_16.png index 9b84a7797..e9d823d0f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_16.png and b/TMessagesProj/src/main/assets/emoji/7_16.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_160.png b/TMessagesProj/src/main/assets/emoji/7_160.png index d445d6c6c..e082abec5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_160.png and b/TMessagesProj/src/main/assets/emoji/7_160.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_161.png b/TMessagesProj/src/main/assets/emoji/7_161.png index cdc699d43..a6304db3c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_161.png and b/TMessagesProj/src/main/assets/emoji/7_161.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_162.png b/TMessagesProj/src/main/assets/emoji/7_162.png index 4268fcc7d..03d6b9e56 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_162.png and b/TMessagesProj/src/main/assets/emoji/7_162.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_163.png b/TMessagesProj/src/main/assets/emoji/7_163.png index 07fdb1833..6c7fb57a2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_163.png and b/TMessagesProj/src/main/assets/emoji/7_163.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_164.png b/TMessagesProj/src/main/assets/emoji/7_164.png index 4983e4655..78048d3b2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_164.png and b/TMessagesProj/src/main/assets/emoji/7_164.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_165.png b/TMessagesProj/src/main/assets/emoji/7_165.png index ed07beed5..014ce32c1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_165.png and b/TMessagesProj/src/main/assets/emoji/7_165.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_166.png b/TMessagesProj/src/main/assets/emoji/7_166.png index a6cfedd3d..83c45a4f2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_166.png and b/TMessagesProj/src/main/assets/emoji/7_166.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_167.png b/TMessagesProj/src/main/assets/emoji/7_167.png index aaa7ffad0..7b00eaa70 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_167.png and b/TMessagesProj/src/main/assets/emoji/7_167.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_168.png b/TMessagesProj/src/main/assets/emoji/7_168.png index 52776c204..3d4b49a4a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_168.png and b/TMessagesProj/src/main/assets/emoji/7_168.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_169.png b/TMessagesProj/src/main/assets/emoji/7_169.png index 4b2bb564f..549e662ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_169.png and b/TMessagesProj/src/main/assets/emoji/7_169.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_17.png b/TMessagesProj/src/main/assets/emoji/7_17.png index de7826cc3..b45b2a449 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_17.png and b/TMessagesProj/src/main/assets/emoji/7_17.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_170.png b/TMessagesProj/src/main/assets/emoji/7_170.png index 66d252839..000621758 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_170.png and b/TMessagesProj/src/main/assets/emoji/7_170.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_171.png b/TMessagesProj/src/main/assets/emoji/7_171.png index e4ba30656..92f06dc05 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_171.png and b/TMessagesProj/src/main/assets/emoji/7_171.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_172.png b/TMessagesProj/src/main/assets/emoji/7_172.png index 362964215..2936fa29d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_172.png and b/TMessagesProj/src/main/assets/emoji/7_172.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_173.png b/TMessagesProj/src/main/assets/emoji/7_173.png index 0aa06180e..260f2440d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_173.png and b/TMessagesProj/src/main/assets/emoji/7_173.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_174.png b/TMessagesProj/src/main/assets/emoji/7_174.png index a08fd2d1c..379178952 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_174.png and b/TMessagesProj/src/main/assets/emoji/7_174.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_175.png b/TMessagesProj/src/main/assets/emoji/7_175.png index 290cd60b9..92b31106c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_175.png and b/TMessagesProj/src/main/assets/emoji/7_175.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_176.png b/TMessagesProj/src/main/assets/emoji/7_176.png index 9126fe924..04a65af43 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_176.png and b/TMessagesProj/src/main/assets/emoji/7_176.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_177.png b/TMessagesProj/src/main/assets/emoji/7_177.png index 7546d5898..59825c05b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_177.png and b/TMessagesProj/src/main/assets/emoji/7_177.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_178.png b/TMessagesProj/src/main/assets/emoji/7_178.png index 8bffae27c..0b1540b4c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_178.png and b/TMessagesProj/src/main/assets/emoji/7_178.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_179.png b/TMessagesProj/src/main/assets/emoji/7_179.png index f1a26b44e..2eeebeb97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_179.png and b/TMessagesProj/src/main/assets/emoji/7_179.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_18.png b/TMessagesProj/src/main/assets/emoji/7_18.png index 2b2c0b097..749831bb4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_18.png and b/TMessagesProj/src/main/assets/emoji/7_18.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_180.png b/TMessagesProj/src/main/assets/emoji/7_180.png index b37e6c0fa..62e7c7f35 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_180.png and b/TMessagesProj/src/main/assets/emoji/7_180.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_181.png b/TMessagesProj/src/main/assets/emoji/7_181.png index bec6f39ce..11ad19df8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_181.png and b/TMessagesProj/src/main/assets/emoji/7_181.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_182.png b/TMessagesProj/src/main/assets/emoji/7_182.png index b1a537cb4..cebc10098 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_182.png and b/TMessagesProj/src/main/assets/emoji/7_182.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_183.png b/TMessagesProj/src/main/assets/emoji/7_183.png index b71a7310a..1e17e2221 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_183.png and b/TMessagesProj/src/main/assets/emoji/7_183.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_184.png b/TMessagesProj/src/main/assets/emoji/7_184.png index d93771142..fd9fe91d9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_184.png and b/TMessagesProj/src/main/assets/emoji/7_184.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_185.png b/TMessagesProj/src/main/assets/emoji/7_185.png index a4ce3d571..fa20d3662 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_185.png and b/TMessagesProj/src/main/assets/emoji/7_185.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_186.png b/TMessagesProj/src/main/assets/emoji/7_186.png index 7640d12e9..7d2e2361e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_186.png and b/TMessagesProj/src/main/assets/emoji/7_186.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_187.png b/TMessagesProj/src/main/assets/emoji/7_187.png index 16e67b264..c07bc27a6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_187.png and b/TMessagesProj/src/main/assets/emoji/7_187.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_188.png b/TMessagesProj/src/main/assets/emoji/7_188.png index da72c877b..03bfd8b64 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_188.png and b/TMessagesProj/src/main/assets/emoji/7_188.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_189.png b/TMessagesProj/src/main/assets/emoji/7_189.png index 0a236fb6d..bf9fd2f79 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_189.png and b/TMessagesProj/src/main/assets/emoji/7_189.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_19.png b/TMessagesProj/src/main/assets/emoji/7_19.png index 1898e4537..43a964a1c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_19.png and b/TMessagesProj/src/main/assets/emoji/7_19.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_190.png b/TMessagesProj/src/main/assets/emoji/7_190.png index 14bd7518f..38b6f6169 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_190.png and b/TMessagesProj/src/main/assets/emoji/7_190.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_191.png b/TMessagesProj/src/main/assets/emoji/7_191.png index 858884aaf..52a427849 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_191.png and b/TMessagesProj/src/main/assets/emoji/7_191.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_192.png b/TMessagesProj/src/main/assets/emoji/7_192.png index 819b1b37b..04efd7165 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_192.png and b/TMessagesProj/src/main/assets/emoji/7_192.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_193.png b/TMessagesProj/src/main/assets/emoji/7_193.png index 306e8c371..1588f800a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_193.png and b/TMessagesProj/src/main/assets/emoji/7_193.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_194.png b/TMessagesProj/src/main/assets/emoji/7_194.png index 7c3a56cc1..cf6b16e2d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_194.png and b/TMessagesProj/src/main/assets/emoji/7_194.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_195.png b/TMessagesProj/src/main/assets/emoji/7_195.png index 0bcf3f054..6898ac0e7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_195.png and b/TMessagesProj/src/main/assets/emoji/7_195.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_196.png b/TMessagesProj/src/main/assets/emoji/7_196.png index 9cbea6778..19aea02c4 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_196.png and b/TMessagesProj/src/main/assets/emoji/7_196.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_197.png b/TMessagesProj/src/main/assets/emoji/7_197.png index cc477362d..4f8b1f6bb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_197.png and b/TMessagesProj/src/main/assets/emoji/7_197.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_198.png b/TMessagesProj/src/main/assets/emoji/7_198.png index 33cbbf205..2ed241947 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_198.png and b/TMessagesProj/src/main/assets/emoji/7_198.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_199.png b/TMessagesProj/src/main/assets/emoji/7_199.png index 340a92855..621b07964 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_199.png and b/TMessagesProj/src/main/assets/emoji/7_199.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_2.png b/TMessagesProj/src/main/assets/emoji/7_2.png index 4295efaa6..315c81080 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_2.png and b/TMessagesProj/src/main/assets/emoji/7_2.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_20.png b/TMessagesProj/src/main/assets/emoji/7_20.png index 28f84f4de..430ac4812 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_20.png and b/TMessagesProj/src/main/assets/emoji/7_20.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_200.png b/TMessagesProj/src/main/assets/emoji/7_200.png index 48cdf7ba6..0d661eb7e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_200.png and b/TMessagesProj/src/main/assets/emoji/7_200.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_201.png b/TMessagesProj/src/main/assets/emoji/7_201.png index 498414569..88a342f4d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_201.png and b/TMessagesProj/src/main/assets/emoji/7_201.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_202.png b/TMessagesProj/src/main/assets/emoji/7_202.png index b5d7231a6..84f6d3fd9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_202.png and b/TMessagesProj/src/main/assets/emoji/7_202.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_203.png b/TMessagesProj/src/main/assets/emoji/7_203.png index 51e738d00..6e9d049c5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_203.png and b/TMessagesProj/src/main/assets/emoji/7_203.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_204.png b/TMessagesProj/src/main/assets/emoji/7_204.png index 98a18903e..31d257b81 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_204.png and b/TMessagesProj/src/main/assets/emoji/7_204.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_205.png b/TMessagesProj/src/main/assets/emoji/7_205.png index 072f69648..0ef5aeddf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_205.png and b/TMessagesProj/src/main/assets/emoji/7_205.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_206.png b/TMessagesProj/src/main/assets/emoji/7_206.png index a75128262..b282638f8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_206.png and b/TMessagesProj/src/main/assets/emoji/7_206.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_207.png b/TMessagesProj/src/main/assets/emoji/7_207.png index f19d6c987..89b0768ac 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_207.png and b/TMessagesProj/src/main/assets/emoji/7_207.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_208.png b/TMessagesProj/src/main/assets/emoji/7_208.png index 92b9347ef..0aad03a6e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_208.png and b/TMessagesProj/src/main/assets/emoji/7_208.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_209.png b/TMessagesProj/src/main/assets/emoji/7_209.png index 79d949f2a..e0f90d3d5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_209.png and b/TMessagesProj/src/main/assets/emoji/7_209.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_21.png b/TMessagesProj/src/main/assets/emoji/7_21.png index 8067895c7..09ff5c12d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_21.png and b/TMessagesProj/src/main/assets/emoji/7_21.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_210.png b/TMessagesProj/src/main/assets/emoji/7_210.png index 6ef769c9a..bba4bf822 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_210.png and b/TMessagesProj/src/main/assets/emoji/7_210.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_211.png b/TMessagesProj/src/main/assets/emoji/7_211.png index 823d1b22f..f7b2414e7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_211.png and b/TMessagesProj/src/main/assets/emoji/7_211.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_212.png b/TMessagesProj/src/main/assets/emoji/7_212.png index 81b61b311..d246fc3f7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_212.png and b/TMessagesProj/src/main/assets/emoji/7_212.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_213.png b/TMessagesProj/src/main/assets/emoji/7_213.png index 0ad245076..210d20f09 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_213.png and b/TMessagesProj/src/main/assets/emoji/7_213.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_214.png b/TMessagesProj/src/main/assets/emoji/7_214.png index 48e6c5edf..639f103a3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_214.png and b/TMessagesProj/src/main/assets/emoji/7_214.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_215.png b/TMessagesProj/src/main/assets/emoji/7_215.png index 3ced8b9d4..8770c0908 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_215.png and b/TMessagesProj/src/main/assets/emoji/7_215.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_216.png b/TMessagesProj/src/main/assets/emoji/7_216.png index 5ad9cc2a9..1161527e1 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_216.png and b/TMessagesProj/src/main/assets/emoji/7_216.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_217.png b/TMessagesProj/src/main/assets/emoji/7_217.png index f6c652617..ae5cb276e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_217.png and b/TMessagesProj/src/main/assets/emoji/7_217.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_218.png b/TMessagesProj/src/main/assets/emoji/7_218.png index e11f309e6..587ee0bc6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_218.png and b/TMessagesProj/src/main/assets/emoji/7_218.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_219.png b/TMessagesProj/src/main/assets/emoji/7_219.png index 569030be0..21e6a023e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_219.png and b/TMessagesProj/src/main/assets/emoji/7_219.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_22.png b/TMessagesProj/src/main/assets/emoji/7_22.png index f7bdb5010..ac462a3e6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_22.png and b/TMessagesProj/src/main/assets/emoji/7_22.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_220.png b/TMessagesProj/src/main/assets/emoji/7_220.png index eac75c1be..66735f6fb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_220.png and b/TMessagesProj/src/main/assets/emoji/7_220.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_221.png b/TMessagesProj/src/main/assets/emoji/7_221.png index 17f1f9401..3075e56ae 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_221.png and b/TMessagesProj/src/main/assets/emoji/7_221.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_222.png b/TMessagesProj/src/main/assets/emoji/7_222.png index 8f8f6930d..9b56b4a59 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_222.png and b/TMessagesProj/src/main/assets/emoji/7_222.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_223.png b/TMessagesProj/src/main/assets/emoji/7_223.png index 14f032299..d73b0963b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_223.png and b/TMessagesProj/src/main/assets/emoji/7_223.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_224.png b/TMessagesProj/src/main/assets/emoji/7_224.png index 2e1ff69bc..0a4f8faff 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_224.png and b/TMessagesProj/src/main/assets/emoji/7_224.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_225.png b/TMessagesProj/src/main/assets/emoji/7_225.png index f29b8f7e3..b9dd49272 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_225.png and b/TMessagesProj/src/main/assets/emoji/7_225.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_226.png b/TMessagesProj/src/main/assets/emoji/7_226.png index 6dcbd03c8..ecb646f3e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_226.png and b/TMessagesProj/src/main/assets/emoji/7_226.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_227.png b/TMessagesProj/src/main/assets/emoji/7_227.png index 26b6d9ae2..4a4100c72 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_227.png and b/TMessagesProj/src/main/assets/emoji/7_227.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_228.png b/TMessagesProj/src/main/assets/emoji/7_228.png index 22a294906..c9c8e87bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_228.png and b/TMessagesProj/src/main/assets/emoji/7_228.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_229.png b/TMessagesProj/src/main/assets/emoji/7_229.png index ddb796107..63261d743 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_229.png and b/TMessagesProj/src/main/assets/emoji/7_229.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_23.png b/TMessagesProj/src/main/assets/emoji/7_23.png index 53cbbad97..2e142fcc0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_23.png and b/TMessagesProj/src/main/assets/emoji/7_23.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_230.png b/TMessagesProj/src/main/assets/emoji/7_230.png index 10c6e4168..b6a641de5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_230.png and b/TMessagesProj/src/main/assets/emoji/7_230.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_231.png b/TMessagesProj/src/main/assets/emoji/7_231.png index 614b151e9..2347dcce0 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_231.png and b/TMessagesProj/src/main/assets/emoji/7_231.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_232.png b/TMessagesProj/src/main/assets/emoji/7_232.png index 1e279264a..c442d5819 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_232.png and b/TMessagesProj/src/main/assets/emoji/7_232.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_233.png b/TMessagesProj/src/main/assets/emoji/7_233.png index 5945403da..6587f5d54 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_233.png and b/TMessagesProj/src/main/assets/emoji/7_233.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_234.png b/TMessagesProj/src/main/assets/emoji/7_234.png index 62f7c7358..9e9631e0a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_234.png and b/TMessagesProj/src/main/assets/emoji/7_234.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_235.png b/TMessagesProj/src/main/assets/emoji/7_235.png index 1866a8f74..f8ef93c7a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_235.png and b/TMessagesProj/src/main/assets/emoji/7_235.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_236.png b/TMessagesProj/src/main/assets/emoji/7_236.png index 23466b4d4..ec4792125 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_236.png and b/TMessagesProj/src/main/assets/emoji/7_236.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_237.png b/TMessagesProj/src/main/assets/emoji/7_237.png index 1485154e6..6a3ff655a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_237.png and b/TMessagesProj/src/main/assets/emoji/7_237.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_238.png b/TMessagesProj/src/main/assets/emoji/7_238.png index 1fceb1276..5ee9713da 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_238.png and b/TMessagesProj/src/main/assets/emoji/7_238.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_239.png b/TMessagesProj/src/main/assets/emoji/7_239.png index 156283fe0..80e3d7095 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_239.png and b/TMessagesProj/src/main/assets/emoji/7_239.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_24.png b/TMessagesProj/src/main/assets/emoji/7_24.png index 481468ec8..9325182e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_24.png and b/TMessagesProj/src/main/assets/emoji/7_24.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_240.png b/TMessagesProj/src/main/assets/emoji/7_240.png index a58db21b2..292932323 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_240.png and b/TMessagesProj/src/main/assets/emoji/7_240.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_241.png b/TMessagesProj/src/main/assets/emoji/7_241.png index c36111bdf..a402e13e3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_241.png and b/TMessagesProj/src/main/assets/emoji/7_241.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_242.png b/TMessagesProj/src/main/assets/emoji/7_242.png index f178d8cfb..6f1afc20a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_242.png and b/TMessagesProj/src/main/assets/emoji/7_242.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_243.png b/TMessagesProj/src/main/assets/emoji/7_243.png index 1b453f204..963b0727f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_243.png and b/TMessagesProj/src/main/assets/emoji/7_243.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_244.png b/TMessagesProj/src/main/assets/emoji/7_244.png index e4b172bcc..7acb9947b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_244.png and b/TMessagesProj/src/main/assets/emoji/7_244.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_245.png b/TMessagesProj/src/main/assets/emoji/7_245.png index 4b5ca52bd..c26be3ee2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_245.png and b/TMessagesProj/src/main/assets/emoji/7_245.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_246.png b/TMessagesProj/src/main/assets/emoji/7_246.png index ce44511d7..86c5c8f7d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_246.png and b/TMessagesProj/src/main/assets/emoji/7_246.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_247.png b/TMessagesProj/src/main/assets/emoji/7_247.png index a5aa7f50e..ac31a9e99 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_247.png and b/TMessagesProj/src/main/assets/emoji/7_247.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_248.png b/TMessagesProj/src/main/assets/emoji/7_248.png index 65e7ef59a..6d2a0faf3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_248.png and b/TMessagesProj/src/main/assets/emoji/7_248.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_249.png b/TMessagesProj/src/main/assets/emoji/7_249.png index ce3b032f6..7f065eeab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_249.png and b/TMessagesProj/src/main/assets/emoji/7_249.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_25.png b/TMessagesProj/src/main/assets/emoji/7_25.png index 4c9656bc3..4a12897b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_25.png and b/TMessagesProj/src/main/assets/emoji/7_25.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_250.png b/TMessagesProj/src/main/assets/emoji/7_250.png index 348c8ef5f..208f1819f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_250.png and b/TMessagesProj/src/main/assets/emoji/7_250.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_251.png b/TMessagesProj/src/main/assets/emoji/7_251.png index d28aa8048..f116e0e41 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_251.png and b/TMessagesProj/src/main/assets/emoji/7_251.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_252.png b/TMessagesProj/src/main/assets/emoji/7_252.png index b2d8c5682..7eac9217c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_252.png and b/TMessagesProj/src/main/assets/emoji/7_252.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_253.png b/TMessagesProj/src/main/assets/emoji/7_253.png index ae6aa06cd..9382c3d3d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_253.png and b/TMessagesProj/src/main/assets/emoji/7_253.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_254.png b/TMessagesProj/src/main/assets/emoji/7_254.png index f31fece7c..9dacf3ed7 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_254.png and b/TMessagesProj/src/main/assets/emoji/7_254.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_255.png b/TMessagesProj/src/main/assets/emoji/7_255.png index b7db90657..222dc58e2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_255.png and b/TMessagesProj/src/main/assets/emoji/7_255.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_256.png b/TMessagesProj/src/main/assets/emoji/7_256.png index daf2d5221..ae1178638 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_256.png and b/TMessagesProj/src/main/assets/emoji/7_256.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_257.png b/TMessagesProj/src/main/assets/emoji/7_257.png index 819b949bf..c01245ce5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_257.png and b/TMessagesProj/src/main/assets/emoji/7_257.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_258.png b/TMessagesProj/src/main/assets/emoji/7_258.png index 91255a3d2..277b14c95 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_258.png and b/TMessagesProj/src/main/assets/emoji/7_258.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_26.png b/TMessagesProj/src/main/assets/emoji/7_26.png index 3e507adf6..12820d17a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_26.png and b/TMessagesProj/src/main/assets/emoji/7_26.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_27.png b/TMessagesProj/src/main/assets/emoji/7_27.png index e6ee274d2..17cf6544d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_27.png and b/TMessagesProj/src/main/assets/emoji/7_27.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_28.png b/TMessagesProj/src/main/assets/emoji/7_28.png index 502e0ace4..f4c5bc645 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_28.png and b/TMessagesProj/src/main/assets/emoji/7_28.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_29.png b/TMessagesProj/src/main/assets/emoji/7_29.png index 88428eb03..db80e874b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_29.png and b/TMessagesProj/src/main/assets/emoji/7_29.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_3.png b/TMessagesProj/src/main/assets/emoji/7_3.png index 65e6f4634..43d776b2c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_3.png and b/TMessagesProj/src/main/assets/emoji/7_3.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_30.png b/TMessagesProj/src/main/assets/emoji/7_30.png index 37ebfbb52..25336a9c6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_30.png and b/TMessagesProj/src/main/assets/emoji/7_30.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_31.png b/TMessagesProj/src/main/assets/emoji/7_31.png index 02a9ba512..e7920085a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_31.png and b/TMessagesProj/src/main/assets/emoji/7_31.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_32.png b/TMessagesProj/src/main/assets/emoji/7_32.png index 66ae3dae3..64490f382 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_32.png and b/TMessagesProj/src/main/assets/emoji/7_32.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_33.png b/TMessagesProj/src/main/assets/emoji/7_33.png index 55edf3413..c5eec4289 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_33.png and b/TMessagesProj/src/main/assets/emoji/7_33.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_34.png b/TMessagesProj/src/main/assets/emoji/7_34.png index 3844480c9..7da15351d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_34.png and b/TMessagesProj/src/main/assets/emoji/7_34.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_35.png b/TMessagesProj/src/main/assets/emoji/7_35.png index 1c7852afe..385498110 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_35.png and b/TMessagesProj/src/main/assets/emoji/7_35.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_36.png b/TMessagesProj/src/main/assets/emoji/7_36.png index daf93f8fa..d97ca8299 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_36.png and b/TMessagesProj/src/main/assets/emoji/7_36.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_37.png b/TMessagesProj/src/main/assets/emoji/7_37.png index 2488703a8..472644810 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_37.png and b/TMessagesProj/src/main/assets/emoji/7_37.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_38.png b/TMessagesProj/src/main/assets/emoji/7_38.png index 06c7e6c19..1a5789bdf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_38.png and b/TMessagesProj/src/main/assets/emoji/7_38.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_39.png b/TMessagesProj/src/main/assets/emoji/7_39.png index cff01d961..1295a938d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_39.png and b/TMessagesProj/src/main/assets/emoji/7_39.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_4.png b/TMessagesProj/src/main/assets/emoji/7_4.png index 9803c910f..31c38b1d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_4.png and b/TMessagesProj/src/main/assets/emoji/7_4.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_40.png b/TMessagesProj/src/main/assets/emoji/7_40.png index 8d6bdb677..09faf1ade 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_40.png and b/TMessagesProj/src/main/assets/emoji/7_40.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_41.png b/TMessagesProj/src/main/assets/emoji/7_41.png index 2fb92b565..0bdb8b27c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_41.png and b/TMessagesProj/src/main/assets/emoji/7_41.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_42.png b/TMessagesProj/src/main/assets/emoji/7_42.png index 90bf21b5e..50279a28d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_42.png and b/TMessagesProj/src/main/assets/emoji/7_42.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_43.png b/TMessagesProj/src/main/assets/emoji/7_43.png index 21ff41484..50d029042 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_43.png and b/TMessagesProj/src/main/assets/emoji/7_43.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_44.png b/TMessagesProj/src/main/assets/emoji/7_44.png index a7dc3027a..7cdfaa725 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_44.png and b/TMessagesProj/src/main/assets/emoji/7_44.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_45.png b/TMessagesProj/src/main/assets/emoji/7_45.png index 46f9afc75..cd93305fa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_45.png and b/TMessagesProj/src/main/assets/emoji/7_45.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_46.png b/TMessagesProj/src/main/assets/emoji/7_46.png index 2452abee5..07f307bc5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_46.png and b/TMessagesProj/src/main/assets/emoji/7_46.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_47.png b/TMessagesProj/src/main/assets/emoji/7_47.png index 1b9245dac..780daabd9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_47.png and b/TMessagesProj/src/main/assets/emoji/7_47.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_48.png b/TMessagesProj/src/main/assets/emoji/7_48.png index 13fcbf606..d808fec8b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_48.png and b/TMessagesProj/src/main/assets/emoji/7_48.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_49.png b/TMessagesProj/src/main/assets/emoji/7_49.png index ee9000eb7..aad709d29 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_49.png and b/TMessagesProj/src/main/assets/emoji/7_49.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_5.png b/TMessagesProj/src/main/assets/emoji/7_5.png index 223533b94..f09d1cf6b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_5.png and b/TMessagesProj/src/main/assets/emoji/7_5.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_50.png b/TMessagesProj/src/main/assets/emoji/7_50.png index 5d9820a00..6b7a0b934 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_50.png and b/TMessagesProj/src/main/assets/emoji/7_50.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_51.png b/TMessagesProj/src/main/assets/emoji/7_51.png index 334424a0f..933cf7098 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_51.png and b/TMessagesProj/src/main/assets/emoji/7_51.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_52.png b/TMessagesProj/src/main/assets/emoji/7_52.png index 96e753071..3a82fc2ab 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_52.png and b/TMessagesProj/src/main/assets/emoji/7_52.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_53.png b/TMessagesProj/src/main/assets/emoji/7_53.png index 56ab1ecfb..5d5f4af7d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_53.png and b/TMessagesProj/src/main/assets/emoji/7_53.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_54.png b/TMessagesProj/src/main/assets/emoji/7_54.png index 092ac5db4..433159efa 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_54.png and b/TMessagesProj/src/main/assets/emoji/7_54.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_55.png b/TMessagesProj/src/main/assets/emoji/7_55.png index a0de6ebda..535a9d150 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_55.png and b/TMessagesProj/src/main/assets/emoji/7_55.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_56.png b/TMessagesProj/src/main/assets/emoji/7_56.png index 056a19222..cac1c0580 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_56.png and b/TMessagesProj/src/main/assets/emoji/7_56.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_57.png b/TMessagesProj/src/main/assets/emoji/7_57.png index 75a9255ce..915cdb9df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_57.png and b/TMessagesProj/src/main/assets/emoji/7_57.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_58.png b/TMessagesProj/src/main/assets/emoji/7_58.png index f33cd77f4..edf96de13 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_58.png and b/TMessagesProj/src/main/assets/emoji/7_58.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_59.png b/TMessagesProj/src/main/assets/emoji/7_59.png index 2ddb77378..692e82472 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_59.png and b/TMessagesProj/src/main/assets/emoji/7_59.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_6.png b/TMessagesProj/src/main/assets/emoji/7_6.png index c96bdb398..19d5ae8b9 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_6.png and b/TMessagesProj/src/main/assets/emoji/7_6.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_60.png b/TMessagesProj/src/main/assets/emoji/7_60.png index 50351b640..cae9baa97 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_60.png and b/TMessagesProj/src/main/assets/emoji/7_60.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_61.png b/TMessagesProj/src/main/assets/emoji/7_61.png index 610faf541..47d13c324 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_61.png and b/TMessagesProj/src/main/assets/emoji/7_61.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_62.png b/TMessagesProj/src/main/assets/emoji/7_62.png index eb6a407a1..c750fa17c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_62.png and b/TMessagesProj/src/main/assets/emoji/7_62.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_63.png b/TMessagesProj/src/main/assets/emoji/7_63.png index 28b4d2154..29bd1e57a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_63.png and b/TMessagesProj/src/main/assets/emoji/7_63.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_64.png b/TMessagesProj/src/main/assets/emoji/7_64.png index de9c04a62..b8a0db51d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_64.png and b/TMessagesProj/src/main/assets/emoji/7_64.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_65.png b/TMessagesProj/src/main/assets/emoji/7_65.png index e196e7384..3dd5d8c75 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_65.png and b/TMessagesProj/src/main/assets/emoji/7_65.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_66.png b/TMessagesProj/src/main/assets/emoji/7_66.png index c20448344..7496d7397 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_66.png and b/TMessagesProj/src/main/assets/emoji/7_66.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_67.png b/TMessagesProj/src/main/assets/emoji/7_67.png index cd681478e..f92e47c00 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_67.png and b/TMessagesProj/src/main/assets/emoji/7_67.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_68.png b/TMessagesProj/src/main/assets/emoji/7_68.png index 623d19692..a6baa29ef 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_68.png and b/TMessagesProj/src/main/assets/emoji/7_68.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_69.png b/TMessagesProj/src/main/assets/emoji/7_69.png index 97ba2c087..76c0e4714 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_69.png and b/TMessagesProj/src/main/assets/emoji/7_69.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_7.png b/TMessagesProj/src/main/assets/emoji/7_7.png index a2f7e5e1a..c9385ac83 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_7.png and b/TMessagesProj/src/main/assets/emoji/7_7.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_70.png b/TMessagesProj/src/main/assets/emoji/7_70.png index d8a297862..edd7c2b7d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_70.png and b/TMessagesProj/src/main/assets/emoji/7_70.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_71.png b/TMessagesProj/src/main/assets/emoji/7_71.png index 3709e83a5..61a2767dc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_71.png and b/TMessagesProj/src/main/assets/emoji/7_71.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_72.png b/TMessagesProj/src/main/assets/emoji/7_72.png index 93ec29501..3f5f6a72a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_72.png and b/TMessagesProj/src/main/assets/emoji/7_72.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_73.png b/TMessagesProj/src/main/assets/emoji/7_73.png index 3ca170d76..0d5e0a239 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_73.png and b/TMessagesProj/src/main/assets/emoji/7_73.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_74.png b/TMessagesProj/src/main/assets/emoji/7_74.png index 7a681f2a2..94d532bb3 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_74.png and b/TMessagesProj/src/main/assets/emoji/7_74.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_75.png b/TMessagesProj/src/main/assets/emoji/7_75.png index feec8f745..31cdb241b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_75.png and b/TMessagesProj/src/main/assets/emoji/7_75.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_76.png b/TMessagesProj/src/main/assets/emoji/7_76.png index 8605c631d..8a7131f1c 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_76.png and b/TMessagesProj/src/main/assets/emoji/7_76.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_77.png b/TMessagesProj/src/main/assets/emoji/7_77.png index 16555baf5..672c09770 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_77.png and b/TMessagesProj/src/main/assets/emoji/7_77.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_78.png b/TMessagesProj/src/main/assets/emoji/7_78.png index 40bd16d83..475b4026b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_78.png and b/TMessagesProj/src/main/assets/emoji/7_78.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_79.png b/TMessagesProj/src/main/assets/emoji/7_79.png index f23666131..378b68f8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_79.png and b/TMessagesProj/src/main/assets/emoji/7_79.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_8.png b/TMessagesProj/src/main/assets/emoji/7_8.png index 34682fb0f..150372b8a 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_8.png and b/TMessagesProj/src/main/assets/emoji/7_8.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_80.png b/TMessagesProj/src/main/assets/emoji/7_80.png index c8feed7b9..84d1b00d2 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_80.png and b/TMessagesProj/src/main/assets/emoji/7_80.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_81.png b/TMessagesProj/src/main/assets/emoji/7_81.png index ccf51c21b..d1305f1d6 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_81.png and b/TMessagesProj/src/main/assets/emoji/7_81.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_82.png b/TMessagesProj/src/main/assets/emoji/7_82.png index e4551f849..419f4b9df 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_82.png and b/TMessagesProj/src/main/assets/emoji/7_82.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_83.png b/TMessagesProj/src/main/assets/emoji/7_83.png index 907e8953f..5260172a8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_83.png and b/TMessagesProj/src/main/assets/emoji/7_83.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_84.png b/TMessagesProj/src/main/assets/emoji/7_84.png index 6c02844c9..0ac502993 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_84.png and b/TMessagesProj/src/main/assets/emoji/7_84.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_85.png b/TMessagesProj/src/main/assets/emoji/7_85.png index a1da7d795..d5dc4f848 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_85.png and b/TMessagesProj/src/main/assets/emoji/7_85.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_86.png b/TMessagesProj/src/main/assets/emoji/7_86.png index 36fd781b5..6631dac4f 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_86.png and b/TMessagesProj/src/main/assets/emoji/7_86.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_87.png b/TMessagesProj/src/main/assets/emoji/7_87.png index 1826cdec1..dae3b6dc5 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_87.png and b/TMessagesProj/src/main/assets/emoji/7_87.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_88.png b/TMessagesProj/src/main/assets/emoji/7_88.png index b436088ca..2d0ed50c8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_88.png and b/TMessagesProj/src/main/assets/emoji/7_88.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_89.png b/TMessagesProj/src/main/assets/emoji/7_89.png index c51aad2a3..30065e0bc 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_89.png and b/TMessagesProj/src/main/assets/emoji/7_89.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_9.png b/TMessagesProj/src/main/assets/emoji/7_9.png index 760ad712d..e9bc7ee5b 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_9.png and b/TMessagesProj/src/main/assets/emoji/7_9.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_90.png b/TMessagesProj/src/main/assets/emoji/7_90.png index 7abd004d2..42c1fc75d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_90.png and b/TMessagesProj/src/main/assets/emoji/7_90.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_91.png b/TMessagesProj/src/main/assets/emoji/7_91.png index ac6720b30..27d86a92e 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_91.png and b/TMessagesProj/src/main/assets/emoji/7_91.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_92.png b/TMessagesProj/src/main/assets/emoji/7_92.png index 2d0a14895..ab9a847fb 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_92.png and b/TMessagesProj/src/main/assets/emoji/7_92.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_93.png b/TMessagesProj/src/main/assets/emoji/7_93.png index 68b1d8a06..a2316d270 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_93.png and b/TMessagesProj/src/main/assets/emoji/7_93.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_94.png b/TMessagesProj/src/main/assets/emoji/7_94.png index c871f8efa..10356ca24 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_94.png and b/TMessagesProj/src/main/assets/emoji/7_94.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_95.png b/TMessagesProj/src/main/assets/emoji/7_95.png index 5a81db051..d42b2ddaf 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_95.png and b/TMessagesProj/src/main/assets/emoji/7_95.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_96.png b/TMessagesProj/src/main/assets/emoji/7_96.png index 766373b8d..9b112d2d8 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_96.png and b/TMessagesProj/src/main/assets/emoji/7_96.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_97.png b/TMessagesProj/src/main/assets/emoji/7_97.png index 199842b0f..e843e2f90 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_97.png and b/TMessagesProj/src/main/assets/emoji/7_97.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_98.png b/TMessagesProj/src/main/assets/emoji/7_98.png index ce4bbc85b..cba615095 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_98.png and b/TMessagesProj/src/main/assets/emoji/7_98.png differ diff --git a/TMessagesProj/src/main/assets/emoji/7_99.png b/TMessagesProj/src/main/assets/emoji/7_99.png index a8f0ff8cd..bf57c995d 100644 Binary files a/TMessagesProj/src/main/assets/emoji/7_99.png and b/TMessagesProj/src/main/assets/emoji/7_99.png differ diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java index 81b297552..1901e21f3 100644 --- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java +++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java @@ -692,7 +692,11 @@ public class ItemTouchHelper extends RecyclerView.ItemDecoration mSelected = selected; if (actionState == ACTION_STATE_DRAG) { - mSelected.itemView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + try { + mSelected.itemView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception ignore) { + + } } } final ViewParent rvParent = mRecyclerView.getParent(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java index 39409bd5c..19a63c86b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java @@ -50,6 +50,7 @@ import android.os.Environment; import android.os.PowerManager; import android.os.SystemClock; import android.os.Vibrator; +import android.os.VibratorManager; import android.provider.CallLog; import android.provider.DocumentsContract; import android.provider.MediaStore; @@ -70,6 +71,7 @@ import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.text.style.CharacterStyle; import android.text.style.ClickableSpan; +import android.text.style.DynamicDrawableSpan; import android.text.style.URLSpan; import android.text.util.Linkify; import android.util.DisplayMetrics; @@ -79,6 +81,7 @@ import android.util.StateSet; import android.util.TypedValue; import android.view.Display; import android.view.Gravity; +import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.PixelCopy; import android.view.Surface; @@ -87,6 +90,7 @@ import android.view.TextureView; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; +import android.view.ViewParent; import android.view.ViewPropertyAnimator; import android.view.Window; import android.view.WindowInsets; @@ -146,6 +150,7 @@ import org.telegram.ui.ChatBackgroundDrawable; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.BackgroundGradientDrawable; import org.telegram.ui.Components.Bulletin; +import org.telegram.ui.Components.ColoredImageSpan; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EllipsizeSpanAnimator; import org.telegram.ui.Components.ForegroundColorSpanThemable; @@ -214,6 +219,7 @@ public class AndroidUtilities { public final static int REPLACING_TAG_TYPE_LINK = 0; public final static int REPLACING_TAG_TYPE_BOLD = 1; public final static int REPLACING_TAG_TYPE_LINKBOLD = 2; + public final static int REPLACING_TAG_TYPE_LINK_NBSP = 3; public final static String TYPEFACE_ROBOTO_MEDIUM = "fonts/rmedium.ttf"; public final static String TYPEFACE_ROBOTO_MEDIUM_ITALIC = "fonts/rmediumitalic.ttf"; @@ -483,7 +489,10 @@ public class AndroidUtilities { } SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(str); if (index >= 0) { - if (type == REPLACING_TAG_TYPE_LINK || type == REPLACING_TAG_TYPE_LINKBOLD) { + if (type == REPLACING_TAG_TYPE_LINK_NBSP) { + spannableStringBuilder.replace(index, index + len, AndroidUtilities.replaceMultipleCharSequence(" ", spannableStringBuilder.subSequence(index, index + len), "ย ")); + } + if (type == REPLACING_TAG_TYPE_LINK || type == REPLACING_TAG_TYPE_LINK_NBSP || type == REPLACING_TAG_TYPE_LINKBOLD) { spannableStringBuilder.setSpan(new ClickableSpan() { @Override @@ -555,6 +564,26 @@ public class AndroidUtilities { return spannableStringBuilder; } + public static CharSequence replaceArrows(CharSequence text, boolean link) { + ColoredImageSpan span = new ColoredImageSpan(R.drawable.msg_mini_forumarrow, DynamicDrawableSpan.ALIGN_BOTTOM); + span.setScale(.88f, .88f); + span.translate(-dp(8f / 3f), 0); + span.spaceScaleX = .8f; + if (link) { + span.useLinkPaintColor = link; + } + + SpannableString rightArrow = new SpannableString("ย >"); + rightArrow.setSpan(span, rightArrow.length() - 1, rightArrow.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + text = AndroidUtilities.replaceMultipleCharSequence(" >", text, rightArrow); + + rightArrow = new SpannableString(">"); + rightArrow.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + text = AndroidUtilities.replaceMultipleCharSequence(">", text, rightArrow); + + return text; + } + public static void recycleBitmaps(List bitmapToRecycle) { if (Build.VERSION.SDK_INT <= 23) { // cause to crash: @@ -5143,10 +5172,10 @@ public class AndroidUtilities { } else { spannableStringBuilder = new SpannableStringBuilder(from); } - int index = TextUtils.indexOf(from, what); + int index = TextUtils.indexOf(from, what, 0); while (index >= 0) { spannableStringBuilder.replace(index, index + what.length(), obj); - index = TextUtils.indexOf(spannableStringBuilder, what); + index = TextUtils.indexOf(spannableStringBuilder, what, index + 1); } return spannableStringBuilder; } @@ -5585,4 +5614,69 @@ public class AndroidUtilities { } return isHonor; } + + public static CharSequence withLearnMore(CharSequence text, Runnable onClick) { + SpannableString link = new SpannableString(LocaleController.getString(R.string.LearnMoreArrow)); + link.setSpan(new ClickableSpan() { + @Override + public void onClick(@NonNull View widget) { + if (onClick != null) { + onClick.run(); + } + } + + @Override + public void updateDrawState(@NonNull TextPaint ds) { + ds.setUnderlineText(false); + ds.setColor(ds.linkColor); + } + }, 0, link.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + SpannableStringBuilder result = new SpannableStringBuilder(text); + result.append(" "); + result.append(link); + + return replaceArrows(result, true); + } + + public static View findChildViewUnder(ViewGroup parent, float x, float y) { + if (parent == null) return null; + if (parent.getVisibility() != View.VISIBLE) return null; + for (int i = 0; i < parent.getChildCount(); ++i) { + View child = parent.getChildAt(i); + if (child == null) continue; + if (child.getVisibility() != View.VISIBLE) continue; + if (child instanceof ViewGroup) { + View foundChild = findChildViewUnder((ViewGroup) child, x - child.getLeft(), y - child.getTop()); + if (foundChild != null) { + return foundChild; + } + } else if ( + x >= child.getX() && x <= child.getX() + child.getWidth() && + y >= child.getY() && x <= child.getY() + child.getHeight() + ) { + return child; + } + } + return null; + } + + public static void vibrateCursor(View view) { + try { + if (view == null || view.getContext() == null) return; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; + if (!((Vibrator) view.getContext().getSystemService(Context.VIBRATOR_SERVICE)).hasAmplitudeControl()) return; + view.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + } catch (Exception ignore) {} + } + + public static void vibrate(View view) { + try { + if (view == null || view.getContext() == null) return; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; + if (!((Vibrator) view.getContext().getSystemService(Context.VIBRATOR_SERVICE)).hasAmplitudeControl()) return; + view.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + } catch (Exception ignore) {} + } + } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AuthTokensHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/AuthTokensHelper.java index 045670cba..e1a0f78a0 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/AuthTokensHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/AuthTokensHelper.java @@ -66,10 +66,14 @@ public class AuthTokensHelper { ArrayList tokens = new ArrayList<>(); for (int i = 0; i < count; i++) { String value = preferences.getString("log_in_token_" + i, ""); - SerializedData serializedData = new SerializedData(Utilities.hexToBytes(value)); - TLRPC.auth_Authorization token = TLRPC.auth_Authorization.TLdeserialize(serializedData, serializedData.readInt32(true), true); - if (token instanceof TLRPC.TL_auth_authorization) { - tokens.add((TLRPC.TL_auth_authorization) token); + try { + SerializedData serializedData = new SerializedData(Utilities.hexToBytes(value)); + TLRPC.auth_Authorization token = TLRPC.auth_Authorization.TLdeserialize(serializedData, serializedData.readInt32(true), true); + if (token instanceof TLRPC.TL_auth_authorization) { + tokens.add((TLRPC.TL_auth_authorization) token); + } + } catch (Exception e) { + FileLog.e(e); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BillingController.java b/TMessagesProj/src/main/java/org/telegram/messenger/BillingController.java index 16ea6dc17..468d60f21 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BillingController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BillingController.java @@ -5,6 +5,7 @@ import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -99,6 +100,9 @@ public class BillingController implements PurchasesUpdatedListener, BillingClien if (currency == null || currency.isEmpty()) { return String.valueOf(amount); } + if ("TON".equalsIgnoreCase(currency)) { + return "TON " + (amount / 1_000_000_000.0); + } Currency cur = Currency.getInstance(currency); if (cur != null) { NumberFormat numberFormat = NumberFormat.getCurrencyInstance(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BirthdayController.java b/TMessagesProj/src/main/java/org/telegram/messenger/BirthdayController.java new file mode 100644 index 000000000..3ae56a9c5 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BirthdayController.java @@ -0,0 +1,301 @@ +package org.telegram.messenger; + +import android.content.SharedPreferences; +import android.os.Build; + +import org.telegram.tgnet.AbstractSerializedData; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.SerializedData; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +public class BirthdayController { + + private static volatile BirthdayController[] Instance = new BirthdayController[UserConfig.MAX_ACCOUNT_COUNT]; + private static final Object[] lockObjects = new Object[UserConfig.MAX_ACCOUNT_COUNT]; + static { + for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; i++) { + lockObjects[i] = new Object(); + } + } + + public static BirthdayController getInstance(int num) { + BirthdayController localInstance = Instance[num]; + if (localInstance == null) { + synchronized (lockObjects[num]) { + localInstance = Instance[num]; + if (localInstance == null) { + Instance[num] = localInstance = new BirthdayController(num); + } + } + } + return localInstance; + } + + private final int currentAccount; + + private long lastCheckDate; + private BirthdayState state; + private final Set hiddenDays; + + private BirthdayController(int currentAccount) { + this.currentAccount = currentAccount; + + SharedPreferences prefs = MessagesController.getInstance(currentAccount).getMainSettings(); + lastCheckDate = prefs.getLong("bday_check", 0); + String contactsString = prefs.getString("bday_contacts", null); + if (contactsString != null) { + try { + final SerializedData data = new SerializedData(Utilities.hexToBytes(contactsString)); + TL_birthdays birthdays = TL_birthdays.TLdeserialize(data, data.readInt32(true), true); + if (birthdays != null && !birthdays.contacts.isEmpty()) { + final ArrayList uids = new ArrayList<>(); + for (int i = 0; i < birthdays.contacts.size(); ++i) { + uids.add(birthdays.contacts.get(i).contact_id); + } + MessagesStorage.getInstance(currentAccount).getStorageQueue().postRunnable(() -> { + final ArrayList users = MessagesStorage.getInstance(currentAccount).getUsers(uids); + AndroidUtilities.runOnUIThread(() -> { + TLRPC.TL_contacts_contactBirthdays contacts = new TLRPC.TL_contacts_contactBirthdays(); + contacts.contacts = birthdays.contacts; + contacts.users = users; + state = BirthdayState.from(contacts); + }); + }); + } + } catch (Exception e) { + FileLog.e(e); + } + } + hiddenDays = prefs.getStringSet("bday_hidden", new HashSet<>()); + } + + private boolean loading; + + public void check() { + if (loading) return; + + final long now = System.currentTimeMillis(); + boolean shouldCheck = lastCheckDate == 0; + if (!shouldCheck) { + shouldCheck = now - lastCheckDate > (BuildVars.DEBUG_PRIVATE_VERSION ? 1000 * 25 : 1000 * 60 * 60 * 12); + } + if (!shouldCheck) { + Calendar checkDate = Calendar.getInstance(); + checkDate.setTimeInMillis(lastCheckDate); + Calendar nowDate = Calendar.getInstance(); + nowDate.setTimeInMillis(now); + + shouldCheck = ( + checkDate.get(Calendar.DAY_OF_MONTH) != nowDate.get(Calendar.DAY_OF_MONTH) || + checkDate.get(Calendar.MONTH) != nowDate.get(Calendar.MONTH) || + checkDate.get(Calendar.YEAR) != nowDate.get(Calendar.YEAR) + ); + } + + if (!shouldCheck) { + return; + } + + loading = true; + ConnectionsManager.getInstance(currentAccount).sendRequest(new TLRPC.TL_account_getBirthdays(), (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_contacts_contactBirthdays) { + lastCheckDate = System.currentTimeMillis(); + TLRPC.TL_contacts_contactBirthdays response = (TLRPC.TL_contacts_contactBirthdays) res; + state = BirthdayState.from(response); + + MessagesController.getInstance(currentAccount).putUsers(response.users, false); + MessagesStorage.getInstance(currentAccount).putUsersAndChats(response.users, null, true, true); + + SharedPreferences.Editor edit = MessagesController.getInstance(currentAccount).getMainSettings().edit(); + edit.putLong("bday_check", lastCheckDate); + TL_birthdays birthdays = new TL_birthdays(); + birthdays.contacts = response.contacts; + SerializedData data = new SerializedData(birthdays.getObjectSize()); + birthdays.serializeToStream(data); + edit.putString("bday_contacts", Utilities.bytesToHex(data.toByteArray())); + edit.apply(); + + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.premiumPromoUpdated); + + loading = false; + } + })); + } + + public boolean contains() { + final BirthdayState state = getState(); + return state != null && !state.isTodayEmpty(); + } + + public BirthdayState getState() { + if (state == null) + return null; + if (hiddenDays.contains(state.todayKey)) + return null; + return state; + } + + public void hide() { + if (state == null) return; + if (hiddenDays.contains(state.todayKey)) + return; + hiddenDays.add(state.todayKey); + + SharedPreferences.Editor edit = MessagesController.getInstance(currentAccount).getMainSettings().edit(); + edit.putStringSet("bday_hidden", hiddenDays); + edit.apply(); + + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.premiumPromoUpdated); + } + + public static class BirthdayState { + + public String yesterdayKey; + public String todayKey; + public String tomorrowKey; + + public final ArrayList yesterday = new ArrayList<>(); + public final ArrayList today = new ArrayList<>(); + public final ArrayList tomorrow = new ArrayList<>(); + + private BirthdayState(String yesterdayKey, String todayKey, String tomorrowKey) { + this.yesterdayKey = yesterdayKey; + this.todayKey = todayKey; + this.tomorrowKey = tomorrowKey; + } + + public static BirthdayState from(TLRPC.TL_contacts_contactBirthdays tl) { + Calendar calendar = Calendar.getInstance(); + int todayDay = calendar.get(Calendar.DAY_OF_MONTH); + int todayMonth = 1 + calendar.get(Calendar.MONTH); + int todayYear = calendar.get(Calendar.YEAR); + + calendar.add(Calendar.DATE, -1); + int yesterdayDay = calendar.get(Calendar.DAY_OF_MONTH); + int yesterdayMonth = 1 + calendar.get(Calendar.MONTH); + int yesterdayYear = calendar.get(Calendar.YEAR); + + calendar = Calendar.getInstance(); + calendar.add(Calendar.DATE, +1); + int tomorrowDay = calendar.get(Calendar.DAY_OF_MONTH); + int tomorrowMonth = 1 + calendar.get(Calendar.MONTH); + int tomorrowYear = calendar.get(Calendar.YEAR); + + BirthdayState state = new BirthdayState( + yesterdayDay + "_" + yesterdayMonth + "_" + yesterdayYear, + todayDay + "_" + todayMonth + "_" + todayYear, + tomorrowDay + "_" + tomorrowMonth + "_" + tomorrowYear + ); + + for (TLRPC.TL_contactBirthday contact : tl.contacts) { + ArrayList array = null; + if (contact.birthday.day == todayDay && contact.birthday.month == todayMonth) { + array = state.today; + } else if (contact.birthday.day == yesterdayDay && contact.birthday.month == yesterdayMonth) { + array = state.yesterday; + } else if (contact.birthday.day == tomorrowDay && contact.birthday.month == tomorrowMonth) { + array = state.tomorrow; + } + if (array != null) { + TLRPC.User user = null; + for (int i = 0; i < tl.users.size(); ++i) { + if (tl.users.get(i).id == contact.contact_id) { + user = tl.users.get(i); + break; + } + } + if (user != null && !UserObject.isUserSelf(user)) { + array.add(user); + } + } + } + + return state; + } + + public boolean isTodayEmpty() { + return today.isEmpty(); + } + + public boolean contains(long did) { + for (TLRPC.User user : yesterday) { + if (user.id == did) + return true; + } + for (TLRPC.User user : today) { + if (user.id == did) + return true; + } + for (TLRPC.User user : tomorrow) { + if (user.id == did) + return true; + } + return false; + } + } + + private static class TL_birthdays extends TLObject { + public static final int constructor = 0x114ff30d; + + public ArrayList contacts = new ArrayList<>(); + + public static TL_birthdays TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_birthdays.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_birthdays", constructor)); + } + return null; + } + TL_birthdays result = new TL_birthdays(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean 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 i = 0; i < count; ++i) { + contacts.add(TLRPC.TL_contactBirthday.TLdeserialize(stream, stream.readInt32(exception), exception)); + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(0x1cb5c415); + int count = contacts.size(); + stream.writeInt32(count); + for (int i = 0; i < count; ++i) { + contacts.get(i).serializeToStream(stream); + } + } + } + + public static boolean isToday(TLRPC.UserFull userFull) { + if (userFull == null) return false; + return isToday(userFull.birthday); + } + + public static boolean isToday(TLRPC.TL_birthday birthday) { + if (birthday == null) return false; + Calendar calendar = Calendar.getInstance(); + int todayDay = calendar.get(Calendar.DAY_OF_MONTH); + int todayMonth = 1 + calendar.get(Calendar.MONTH); + return birthday.day == todayDay && birthday.month == todayMonth; + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java index bc9e83e61..7520893dc 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ContactsController.java @@ -83,6 +83,7 @@ public class ContactsController extends BaseController { private ArrayList phonePrivacyRules; private ArrayList addedByPhonePrivacyRules; private ArrayList voiceMessagesRules; + private ArrayList birthdayPrivacyRules; private TLRPC.TL_globalPrivacySettings globalPrivacySettings; public final static int PRIVACY_RULES_TYPE_LASTSEEN = 0; @@ -96,8 +97,9 @@ public class ContactsController extends BaseController { public final static int PRIVACY_RULES_TYPE_VOICE_MESSAGES = 8; public final static int PRIVACY_RULES_TYPE_BIO = 9; public final static int PRIVACY_RULES_TYPE_MESSAGES = 10; + public final static int PRIVACY_RULES_TYPE_BIRTHDAY = 11; - public final static int PRIVACY_RULES_TYPE_COUNT = 10; + public final static int PRIVACY_RULES_TYPE_COUNT = 12; private class MyContentObserver extends ContentObserver { @@ -328,6 +330,7 @@ public class ContactsController extends BaseController { p2pPrivacyRules = null; profilePhotoPrivacyRules = null; bioPrivacyRules = null; + birthdayPrivacyRules = null; forwardsPrivacyRules = null; phonePrivacyRules = null; @@ -2682,10 +2685,14 @@ public class ContactsController extends BaseController { case PRIVACY_RULES_TYPE_VOICE_MESSAGES: req.key = new TLRPC.TL_inputPrivacyKeyVoiceMessages(); break; + case PRIVACY_RULES_TYPE_BIRTHDAY: + req.key = new TLRPC.TL_inputPrivacyKeyBirthday(); + break; case PRIVACY_RULES_TYPE_ADDED_BY_PHONE: - default: req.key = new TLRPC.TL_inputPrivacyKeyAddedByPhone(); break; + default: + continue; } getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { @@ -2713,6 +2720,9 @@ public class ContactsController extends BaseController { case PRIVACY_RULES_TYPE_BIO: bioPrivacyRules = rules.rules; break; + case PRIVACY_RULES_TYPE_BIRTHDAY: + birthdayPrivacyRules = rules.rules; + break; case PRIVACY_RULES_TYPE_FORWARDS: forwardsPrivacyRules = rules.rules; break; @@ -2775,6 +2785,8 @@ public class ContactsController extends BaseController { return profilePhotoPrivacyRules; case PRIVACY_RULES_TYPE_BIO: return bioPrivacyRules; + case PRIVACY_RULES_TYPE_BIRTHDAY: + return birthdayPrivacyRules; case PRIVACY_RULES_TYPE_FORWARDS: return forwardsPrivacyRules; case PRIVACY_RULES_TYPE_PHONE: @@ -2807,6 +2819,9 @@ public class ContactsController extends BaseController { case PRIVACY_RULES_TYPE_BIO: bioPrivacyRules = rules; break; + case PRIVACY_RULES_TYPE_BIRTHDAY: + birthdayPrivacyRules = rules; + break; case PRIVACY_RULES_TYPE_FORWARDS: forwardsPrivacyRules = rules; break; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java index 90976a443..ddda0e101 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java @@ -1475,6 +1475,21 @@ public class DatabaseMigrationHelper { version = 149; } + if (version == 149) { + database.executeFast("ALTER TABLE stickersets2 ADD COLUMN short_name TEXT;").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS stickersets2_id_short_name ON stickersets2(id, short_name);").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 150").stepThis().dispose(); + version = 150; + } + + if (version == 150) { + database.executeFast("CREATE TABLE business_links(data BLOB, order_value INTEGER);").stepThis().dispose(); + + database.executeFast("PRAGMA user_version = 151").stepThis().dispose(); + version = 151; + } + return version; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DialogObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/DialogObject.java index 8b269fdcf..c9ad0ca35 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/DialogObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DialogObject.java @@ -8,11 +8,15 @@ package org.telegram.messenger; +import android.text.TextUtils; + import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; +import java.util.ArrayList; + public class DialogObject { public static boolean isChannel(TLRPC.Dialog dialog) { @@ -185,4 +189,24 @@ public class DialogObject { return getEmojiStatusDocumentId(a) == getEmojiStatusDocumentId(b) && getEmojiStatusUntil(a) == getEmojiStatusUntil(b); } + public static TLRPC.TL_username findUsername(String username, TLRPC.User user) { + if (user == null) return null; + return findUsername(username, user.usernames); + } + + public static TLRPC.TL_username findUsername(String username, TLRPC.Chat chat) { + if (chat == null) return null; + return findUsername(username, chat.usernames); + } + + public static TLRPC.TL_username findUsername(String username, ArrayList usernames) { + if (usernames == null) return null; + for (TLRPC.TL_username u : usernames) { + if (u != null && TextUtils.equals(u.username, username)) { + return u; + } + } + return null; + } + } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java index 5b09b9333..a09ce1f9a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Emoji.java @@ -28,6 +28,9 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import org.checkerframework.checker.units.qual.A; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AnimatedEmojiSpan; import java.io.InputStream; @@ -201,12 +204,21 @@ public class Emoji { } return null; } - EmojiDrawable ed = new SimpleEmojiDrawable(info); + EmojiDrawable ed = new SimpleEmojiDrawable(info, endsWithRightArrow(code)); ed.setBounds(0, 0, drawImgSize, drawImgSize); return ed; } + public static boolean endsWithRightArrow(CharSequence code) { + return code != null && code.length() > 2 && + code.charAt(code.length() - 2) == 'โ€' && + code.charAt(code.length() - 1) == 'โžก'; + } + private static DrawableInfo getDrawableInfo(CharSequence code) { + if (endsWithRightArrow(code)) { + code = code.subSequence(0, code.length() - 2); + } DrawableInfo info = rects.get(code); if (info == null) { CharSequence newCode = EmojiData.emojiAliasMap.get(code); @@ -269,9 +281,11 @@ public class Emoji { private DrawableInfo info; private static Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); private static Rect rect = new Rect(); + private boolean invert; - public SimpleEmojiDrawable(DrawableInfo i) { + public SimpleEmojiDrawable(DrawableInfo i, boolean invert) { info = i; + this.invert = invert; } public DrawableInfo getDrawableInfo() { @@ -306,7 +320,14 @@ public class Emoji { } if (!canvas.quickReject(b.left, b.top, b.right, b.bottom, Canvas.EdgeType.AA)) { + if (invert) { + canvas.save(); + canvas.scale(-1, 1, b.centerX(), b.centerY()); + } canvas.drawBitmap(emojiBmp[info.page][info.page2], null, b, paint); + if (invert) { + canvas.restore(); + } } } @@ -599,6 +620,79 @@ public class Emoji { return s; } + public static CharSequence replaceWithRestrictedEmoji(CharSequence cs, TextView textView, Runnable update) { + return replaceWithRestrictedEmoji(cs, textView.getPaint().getFontMetricsInt(), update); + } + + public static CharSequence replaceWithRestrictedEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, Runnable update) { + if (SharedConfig.useSystemEmoji || cs == null || cs.length() == 0) { + return cs; + } + + final int currentAccount = UserConfig.selectedAccount; + TLRPC.InputStickerSet inputStickerSet = new TLRPC.TL_inputStickerSetShortName(); + inputStickerSet.short_name = "RestrictedEmoji"; + TLRPC.TL_messages_stickerSet set = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSet, 0, false, true, update == null ? null : s -> update.run()); + + Spannable s; + if (cs instanceof Spannable) { + s = (Spannable) cs; + } else { + s = Spannable.Factory.getInstance().newSpannable(cs.toString()); + } + ArrayList emojis = parseEmojis(s, null); + if (emojis.isEmpty()) { + return cs; + } + + AnimatedEmojiSpan[] animatedEmojiSpans = s.getSpans(0, s.length(), AnimatedEmojiSpan.class); + EmojiSpan span; + Drawable drawable; + int limitCount = SharedConfig.getDevicePerformanceClass() >= SharedConfig.PERFORMANCE_CLASS_HIGH ? 100 : 50; + for (int i = 0; i < emojis.size(); ++i) { + try { + EmojiSpanRange emojiRange = emojis.get(i); + if (animatedEmojiSpans != null) { + boolean hasAnimated = false; + for (int j = 0; j < animatedEmojiSpans.length; ++j) { + AnimatedEmojiSpan animatedSpan = animatedEmojiSpans[j]; + if (animatedSpan != null && s.getSpanStart(animatedSpan) == emojiRange.start && s.getSpanEnd(animatedSpan) == emojiRange.end) { + hasAnimated = true; + break; + } + } + if (hasAnimated) { + continue; + } + } + TLRPC.Document document = null; + if (set != null) { + for (TLRPC.Document d : set.documents) { + if (MessageObject.findAnimatedEmojiEmoticon(d, null).contains(emojiRange.code)) { + document = d; + break; + } + } + } + AnimatedEmojiSpan animatedSpan; + if (document != null) { + animatedSpan = new AnimatedEmojiSpan(document, fontMetrics); + } else { + animatedSpan = new AnimatedEmojiSpan(0, fontMetrics); + } + animatedSpan.emoji = (emojiRange.code).toString(); + animatedSpan.cacheType = AnimatedEmojiDrawable.CACHE_TYPE_STANDARD_EMOJI; + s.setSpan(animatedSpan, emojiRange.start, emojiRange.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } catch (Exception e) { + FileLog.e(e); + } + if ((Build.VERSION.SDK_INT < 23 || Build.VERSION.SDK_INT >= 29)/* && !BuildVars.DEBUG_PRIVATE_VERSION*/ && (i + 1) >= limitCount) { + break; + } + } + return s; + } + public static class EmojiSpan extends ImageSpan { public Paint.FontMetricsInt fontMetrics; public float scale = 1f; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/EmojiData.java b/TMessagesProj/src/main/java/org/telegram/messenger/EmojiData.java index 29e62b20e..8ceb52cf6 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/EmojiData.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/EmojiData.java @@ -61,7 +61,7 @@ public class EmojiData { }; public static final String[] emojiColored = { - "๐Ÿซถ", "๐Ÿคฒ", "๐Ÿ‘", "๐Ÿ™Œ", "๐Ÿ‘", "๐Ÿ‘", "๐Ÿ‘Ž", "๐Ÿ‘Š", "โœŠ", "๐Ÿค›", "๐Ÿคœ", "๐Ÿซท", "๐Ÿซธ", "๐Ÿคž", "โœŒ", "๐Ÿซฐ", "๐ŸคŸ", "๐Ÿค˜", "๐Ÿ‘Œ", "๐ŸคŒ", "๐Ÿค", "๐Ÿซณ", "๐Ÿซด", "๐Ÿ‘ˆ", "๐Ÿ‘‰", "๐Ÿ‘†", "๐Ÿ‘‡", "โ˜", "โœ‹", "๐Ÿคš", "๐Ÿ–", "๐Ÿ––", "๐Ÿ‘‹", "๐Ÿค™", "๐Ÿซฒ", "๐Ÿซฑ", "๐Ÿ’ช", "๐Ÿ–•", "โœ", "๐Ÿ™", "๐Ÿซต", "๐Ÿฆถ", "๐Ÿฆต", "๐Ÿ‘‚", "๐Ÿฆป", "๐Ÿ‘ƒ", "๐Ÿ‘ถ", "๐Ÿ‘ง", "๐Ÿง’", "๐Ÿ‘ฆ", "๐Ÿ‘ฉ", "๐Ÿง‘", "๐Ÿ‘จ", "๐Ÿ‘ฉโ€๐Ÿฆฑ", "๐Ÿง‘โ€๐Ÿฆฑ", "๐Ÿ‘จโ€๐Ÿฆฑ", "๐Ÿ‘ฉโ€๐Ÿฆฐ", "๐Ÿง‘โ€๐Ÿฆฐ", "๐Ÿ‘จโ€๐Ÿฆฐ", "๐Ÿ‘ฑโ€โ™€", "๐Ÿ‘ฑ", "๐Ÿ‘ฑโ€โ™‚", "๐Ÿ‘ฉโ€๐Ÿฆณ", "๐Ÿง‘โ€๐Ÿฆณ", "๐Ÿ‘จโ€๐Ÿฆณ", "๐Ÿ‘ฉโ€๐Ÿฆฒ", "๐Ÿง‘โ€๐Ÿฆฒ", "๐Ÿ‘จโ€๐Ÿฆฒ", "๐Ÿง”โ€โ™€", "๐Ÿง”", "๐Ÿง”โ€โ™‚", "๐Ÿ‘ต", "๐Ÿง“", "๐Ÿ‘ด", "๐Ÿ‘ฒ", "๐Ÿ‘ณโ€โ™€", "๐Ÿ‘ณ", "๐Ÿ‘ณโ€โ™‚", "๐Ÿง•", "๐Ÿ‘ฎโ€โ™€", "๐Ÿ‘ฎ", "๐Ÿ‘ฎโ€โ™‚", "๐Ÿ‘ทโ€โ™€", "๐Ÿ‘ท", "๐Ÿ‘ทโ€โ™‚", "๐Ÿ’‚โ€โ™€", "๐Ÿ’‚", "๐Ÿ’‚โ€โ™‚", "๐Ÿ•ตโ€โ™€", "๐Ÿ•ต", "๐Ÿ•ตโ€โ™‚", "๐Ÿ‘ฉโ€โš•", "๐Ÿง‘โ€โš•", "๐Ÿ‘จโ€โš•", "๐Ÿ‘ฉโ€๐ŸŒพ", "๐Ÿง‘โ€๐ŸŒพ", "๐Ÿ‘จโ€๐ŸŒพ", "๐Ÿ‘ฉโ€๐Ÿณ", "๐Ÿง‘โ€๐Ÿณ", "๐Ÿ‘จโ€๐Ÿณ", "๐Ÿ‘ฉโ€๐ŸŽ“", "๐Ÿง‘โ€๐ŸŽ“", "๐Ÿ‘จโ€๐ŸŽ“", "๐Ÿ‘ฉโ€๐ŸŽค", "๐Ÿง‘โ€๐ŸŽค", "๐Ÿ‘จโ€๐ŸŽค", "๐Ÿ‘ฉโ€๐Ÿซ", "๐Ÿง‘โ€๐Ÿซ", "๐Ÿ‘จโ€๐Ÿซ", "๐Ÿ‘ฉโ€๐Ÿญ", "๐Ÿง‘โ€๐Ÿญ", "๐Ÿ‘จโ€๐Ÿญ", "๐Ÿ‘ฉโ€๐Ÿ’ป", "๐Ÿง‘โ€๐Ÿ’ป", "๐Ÿ‘จโ€๐Ÿ’ป", "๐Ÿ‘ฉโ€๐Ÿ’ผ", "๐Ÿง‘โ€๐Ÿ’ผ", "๐Ÿ‘จโ€๐Ÿ’ผ", "๐Ÿ‘ฉโ€๐Ÿ”ง", "๐Ÿง‘โ€๐Ÿ”ง", "๐Ÿ‘จโ€๐Ÿ”ง", "๐Ÿ‘ฉโ€๐Ÿ”ฌ", "๐Ÿง‘โ€๐Ÿ”ฌ", "๐Ÿ‘จโ€๐Ÿ”ฌ", "๐Ÿ‘ฉโ€๐ŸŽจ", "๐Ÿง‘โ€๐ŸŽจ", "๐Ÿ‘จโ€๐ŸŽจ", "๐Ÿ‘ฉโ€๐Ÿš’", "๐Ÿง‘โ€๐Ÿš’", "๐Ÿ‘จโ€๐Ÿš’", "๐Ÿ‘ฉโ€โœˆ", "๐Ÿง‘โ€โœˆ", "๐Ÿ‘จโ€โœˆ", "๐Ÿ‘ฉโ€๐Ÿš€", "๐Ÿง‘โ€๐Ÿš€", "๐Ÿ‘จโ€๐Ÿš€", "๐Ÿ‘ฉโ€โš–", "๐Ÿง‘โ€โš–", "๐Ÿ‘จโ€โš–", "๐Ÿ‘ฐโ€โ™€", "๐Ÿ‘ฐ", "๐Ÿ‘ฐโ€โ™‚", "๐Ÿคตโ€โ™€", "๐Ÿคต", "๐Ÿคตโ€โ™‚", "๐Ÿ‘ธ", "๐Ÿคด", "๐Ÿฅท", "๐Ÿฆธโ€โ™€", "๐Ÿฆธ", "๐Ÿฆธโ€โ™‚", "๐Ÿฆนโ€โ™€", "๐Ÿฆน", "๐Ÿฆนโ€โ™‚", "๐Ÿคถ", "๐Ÿง‘โ€๐ŸŽ„", "๐ŸŽ…", "๐Ÿง™โ€โ™€", "๐Ÿง™", "๐Ÿง™โ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง", "๐Ÿงโ€โ™‚", "๐Ÿง›โ€โ™€", "๐Ÿง›", "๐Ÿง›โ€โ™‚", "๐Ÿงœโ€โ™€", "๐Ÿงœ", "๐Ÿงœโ€โ™‚", "๐Ÿงšโ€โ™€", "๐Ÿงš", "๐Ÿงšโ€โ™‚", "๐Ÿ‘ผ", "๐Ÿคฐ", "๐Ÿซ„", "๐Ÿซƒ", "๐Ÿคฑ", "๐Ÿ‘ฉโ€๐Ÿผ", "๐Ÿง‘โ€๐Ÿผ", "๐Ÿ‘จโ€๐Ÿผ", "๐Ÿ™‡โ€โ™€", "๐Ÿ™‡", "๐Ÿ™‡โ€โ™‚", "๐Ÿ’โ€โ™€", "๐Ÿ’", "๐Ÿ’โ€โ™‚", "๐Ÿ™…โ€โ™€", "๐Ÿ™…", "๐Ÿ™…โ€โ™‚", "๐Ÿ™†โ€โ™€", "๐Ÿ™†", "๐Ÿ™†โ€โ™‚", "๐Ÿ™‹โ€โ™€", "๐Ÿ™‹", "๐Ÿ™‹โ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง", "๐Ÿงโ€โ™‚", "๐Ÿคฆโ€โ™€", "๐Ÿคฆ", "๐Ÿคฆโ€โ™‚", "๐Ÿคทโ€โ™€", "๐Ÿคท", "๐Ÿคทโ€โ™‚", "๐Ÿ™Žโ€โ™€", "๐Ÿ™Ž", "๐Ÿ™Žโ€โ™‚", "๐Ÿ™โ€โ™€", "๐Ÿ™", "๐Ÿ™โ€โ™‚", "๐Ÿ’‡โ€โ™€", "๐Ÿ’‡", "๐Ÿ’‡โ€โ™‚", "๐Ÿ’†โ€โ™€", "๐Ÿ’†", "๐Ÿ’†โ€โ™‚", "๐Ÿง–โ€โ™€", "๐Ÿง–", "๐Ÿง–โ€โ™‚", "๐Ÿ’…", "๐Ÿคณ", "๐Ÿ’ƒ", "๐Ÿ•บ", "๐Ÿ•ด", "๐Ÿ‘ฉโ€๐Ÿฆฝ", "๐Ÿง‘โ€๐Ÿฆฝ", "๐Ÿ‘จโ€๐Ÿฆฝ", "๐Ÿ‘ฉโ€๐Ÿฆผ", "๐Ÿง‘โ€๐Ÿฆผ", "๐Ÿ‘จโ€๐Ÿฆผ", "๐Ÿšถโ€โ™€", "๐Ÿšถ", "๐Ÿšถโ€โ™‚", "๐Ÿ‘ฉโ€๐Ÿฆฏ", "๐Ÿง‘โ€๐Ÿฆฏ", "๐Ÿ‘จโ€๐Ÿฆฏ", "๐ŸงŽโ€โ™€", "๐ŸงŽ", "๐ŸงŽโ€โ™‚", "๐Ÿƒโ€โ™€", "๐Ÿƒ", "๐Ÿƒโ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง", "๐Ÿงโ€โ™‚", "๐Ÿ‹โ€โ™€", "๐Ÿ‹", "๐Ÿ‹โ€โ™‚", "๐Ÿคธโ€โ™€", "๐Ÿคธ", "๐Ÿคธโ€โ™‚", "โ›นโ€โ™€", "โ›น", "โ›นโ€โ™‚", "๐Ÿคพโ€โ™€", "๐Ÿคพ", "๐Ÿคพโ€โ™‚", "๐ŸŒโ€โ™€", "๐ŸŒ", "๐ŸŒโ€โ™‚", "๐Ÿ‡", "๐Ÿง˜โ€โ™€", "๐Ÿง˜", "๐Ÿง˜โ€โ™‚", "๐Ÿ„โ€โ™€", "๐Ÿ„", "๐Ÿ„โ€โ™‚", "๐ŸŠโ€โ™€", "๐ŸŠ", "๐ŸŠโ€โ™‚", "๐Ÿคฝโ€โ™€", "๐Ÿคฝ", "๐Ÿคฝโ€โ™‚", "๐Ÿšฃโ€โ™€", "๐Ÿšฃ", "๐Ÿšฃโ€โ™‚", "๐Ÿง—โ€โ™€", "๐Ÿง—", "๐Ÿง—โ€โ™‚", "๐Ÿšตโ€โ™€", "๐Ÿšต", "๐Ÿšตโ€โ™‚", "๐Ÿšดโ€โ™€", "๐Ÿšด", "๐Ÿšดโ€โ™‚", "๐Ÿคนโ€โ™€", "๐Ÿคน", "๐Ÿคนโ€โ™‚", "๐Ÿ›€" + "๐Ÿซถ", "๐Ÿคฒ", "๐Ÿ‘", "๐Ÿ™Œ", "๐Ÿ‘", "๐Ÿ‘", "๐Ÿ‘Ž", "๐Ÿ‘Š", "โœŠ", "๐Ÿค›", "๐Ÿคœ", "๐Ÿซท", "๐Ÿซธ", "๐Ÿคž", "โœŒ", "๐Ÿซฐ", "๐ŸคŸ", "๐Ÿค˜", "๐Ÿ‘Œ", "๐ŸคŒ", "๐Ÿค", "๐Ÿซณ", "๐Ÿซด", "๐Ÿ‘ˆ", "๐Ÿ‘‰", "๐Ÿ‘†", "๐Ÿ‘‡", "โ˜", "โœ‹", "๐Ÿคš", "๐Ÿ–", "๐Ÿ––", "๐Ÿ‘‹", "๐Ÿค™", "๐Ÿซฒ", "๐Ÿซฑ", "๐Ÿ’ช", "๐Ÿ–•", "โœ", "๐Ÿ™", "๐Ÿซต", "๐Ÿฆถ", "๐Ÿฆต", "๐Ÿ‘‚", "๐Ÿฆป", "๐Ÿ‘ƒ", "๐Ÿ‘ถ", "๐Ÿ‘ง", "๐Ÿง’", "๐Ÿ‘ฆ", "๐Ÿ‘ฉ", "๐Ÿง‘", "๐Ÿ‘จ", "๐Ÿ‘ฉโ€๐Ÿฆฑ", "๐Ÿง‘โ€๐Ÿฆฑ", "๐Ÿ‘จโ€๐Ÿฆฑ", "๐Ÿ‘ฉโ€๐Ÿฆฐ", "๐Ÿง‘โ€๐Ÿฆฐ", "๐Ÿ‘จโ€๐Ÿฆฐ", "๐Ÿ‘ฑโ€โ™€", "๐Ÿ‘ฑ", "๐Ÿ‘ฑโ€โ™‚", "๐Ÿ‘ฉโ€๐Ÿฆณ", "๐Ÿง‘โ€๐Ÿฆณ", "๐Ÿ‘จโ€๐Ÿฆณ", "๐Ÿ‘ฉโ€๐Ÿฆฒ", "๐Ÿง‘โ€๐Ÿฆฒ", "๐Ÿ‘จโ€๐Ÿฆฒ", "๐Ÿง”โ€โ™€", "๐Ÿง”", "๐Ÿง”โ€โ™‚", "๐Ÿ‘ต", "๐Ÿง“", "๐Ÿ‘ด", "๐Ÿ‘ฒ", "๐Ÿ‘ณโ€โ™€", "๐Ÿ‘ณ", "๐Ÿ‘ณโ€โ™‚", "๐Ÿง•", "๐Ÿ‘ฎโ€โ™€", "๐Ÿ‘ฎ", "๐Ÿ‘ฎโ€โ™‚", "๐Ÿ‘ทโ€โ™€", "๐Ÿ‘ท", "๐Ÿ‘ทโ€โ™‚", "๐Ÿ’‚โ€โ™€", "๐Ÿ’‚", "๐Ÿ’‚โ€โ™‚", "๐Ÿ•ตโ€โ™€", "๐Ÿ•ต", "๐Ÿ•ตโ€โ™‚", "๐Ÿ‘ฉโ€โš•", "๐Ÿง‘โ€โš•", "๐Ÿ‘จโ€โš•", "๐Ÿ‘ฉโ€๐ŸŒพ", "๐Ÿง‘โ€๐ŸŒพ", "๐Ÿ‘จโ€๐ŸŒพ", "๐Ÿ‘ฉโ€๐Ÿณ", "๐Ÿง‘โ€๐Ÿณ", "๐Ÿ‘จโ€๐Ÿณ", "๐Ÿ‘ฉโ€๐ŸŽ“", "๐Ÿง‘โ€๐ŸŽ“", "๐Ÿ‘จโ€๐ŸŽ“", "๐Ÿ‘ฉโ€๐ŸŽค", "๐Ÿง‘โ€๐ŸŽค", "๐Ÿ‘จโ€๐ŸŽค", "๐Ÿ‘ฉโ€๐Ÿซ", "๐Ÿง‘โ€๐Ÿซ", "๐Ÿ‘จโ€๐Ÿซ", "๐Ÿ‘ฉโ€๐Ÿญ", "๐Ÿง‘โ€๐Ÿญ", "๐Ÿ‘จโ€๐Ÿญ", "๐Ÿ‘ฉโ€๐Ÿ’ป", "๐Ÿง‘โ€๐Ÿ’ป", "๐Ÿ‘จโ€๐Ÿ’ป", "๐Ÿ‘ฉโ€๐Ÿ’ผ", "๐Ÿง‘โ€๐Ÿ’ผ", "๐Ÿ‘จโ€๐Ÿ’ผ", "๐Ÿ‘ฉโ€๐Ÿ”ง", "๐Ÿง‘โ€๐Ÿ”ง", "๐Ÿ‘จโ€๐Ÿ”ง", "๐Ÿ‘ฉโ€๐Ÿ”ฌ", "๐Ÿง‘โ€๐Ÿ”ฌ", "๐Ÿ‘จโ€๐Ÿ”ฌ", "๐Ÿ‘ฉโ€๐ŸŽจ", "๐Ÿง‘โ€๐ŸŽจ", "๐Ÿ‘จโ€๐ŸŽจ", "๐Ÿ‘ฉโ€๐Ÿš’", "๐Ÿง‘โ€๐Ÿš’", "๐Ÿ‘จโ€๐Ÿš’", "๐Ÿ‘ฉโ€โœˆ", "๐Ÿง‘โ€โœˆ", "๐Ÿ‘จโ€โœˆ", "๐Ÿ‘ฉโ€๐Ÿš€", "๐Ÿง‘โ€๐Ÿš€", "๐Ÿ‘จโ€๐Ÿš€", "๐Ÿ‘ฉโ€โš–", "๐Ÿง‘โ€โš–", "๐Ÿ‘จโ€โš–", "๐Ÿ‘ฐโ€โ™€", "๐Ÿ‘ฐ", "๐Ÿ‘ฐโ€โ™‚", "๐Ÿคตโ€โ™€", "๐Ÿคต", "๐Ÿคตโ€โ™‚", "๐Ÿ‘ธ", "๐Ÿคด", "๐Ÿฅท", "๐Ÿฆธโ€โ™€", "๐Ÿฆธ", "๐Ÿฆธโ€โ™‚", "๐Ÿฆนโ€โ™€", "๐Ÿฆน", "๐Ÿฆนโ€โ™‚", "๐Ÿคถ", "๐Ÿง‘โ€๐ŸŽ„", "๐ŸŽ…", "๐Ÿง™โ€โ™€", "๐Ÿง™", "๐Ÿง™โ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง", "๐Ÿงโ€โ™‚", "๐Ÿง›โ€โ™€", "๐Ÿง›", "๐Ÿง›โ€โ™‚", "๐Ÿงœโ€โ™€", "๐Ÿงœ", "๐Ÿงœโ€โ™‚", "๐Ÿงšโ€โ™€", "๐Ÿงš", "๐Ÿงšโ€โ™‚", "๐Ÿ‘ผ", "๐Ÿคฐ", "๐Ÿซ„", "๐Ÿซƒ", "๐Ÿคฑ", "๐Ÿ‘ฉโ€๐Ÿผ", "๐Ÿง‘โ€๐Ÿผ", "๐Ÿ‘จโ€๐Ÿผ", "๐Ÿ™‡โ€โ™€", "๐Ÿ™‡", "๐Ÿ™‡โ€โ™‚", "๐Ÿ’โ€โ™€", "๐Ÿ’", "๐Ÿ’โ€โ™‚", "๐Ÿ™…โ€โ™€", "๐Ÿ™…", "๐Ÿ™…โ€โ™‚", "๐Ÿ™†โ€โ™€", "๐Ÿ™†", "๐Ÿ™†โ€โ™‚", "๐Ÿ™‹โ€โ™€", "๐Ÿ™‹", "๐Ÿ™‹โ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง", "๐Ÿงโ€โ™‚", "๐Ÿคฆโ€โ™€", "๐Ÿคฆ", "๐Ÿคฆโ€โ™‚", "๐Ÿคทโ€โ™€", "๐Ÿคท", "๐Ÿคทโ€โ™‚", "๐Ÿ™Žโ€โ™€", "๐Ÿ™Ž", "๐Ÿ™Žโ€โ™‚", "๐Ÿ™โ€โ™€", "๐Ÿ™", "๐Ÿ™โ€โ™‚", "๐Ÿ’‡โ€โ™€", "๐Ÿ’‡", "๐Ÿ’‡โ€โ™‚", "๐Ÿ’†โ€โ™€", "๐Ÿ’†", "๐Ÿ’†โ€โ™‚", "๐Ÿง–โ€โ™€", "๐Ÿง–", "๐Ÿง–โ€โ™‚", "๐Ÿ’…", "๐Ÿคณ", "๐Ÿ’ƒ", "๐Ÿ•บ", "๐Ÿ•ด", "๐Ÿ‘ฉโ€๐Ÿฆฝ","๐Ÿง‘โ€๐Ÿฆฝ","๐Ÿ‘จโ€๐Ÿฆฝ","๐Ÿ‘ฉโ€๐Ÿฆฝโ€โžก","๐Ÿง‘โ€๐Ÿฆฝโ€โžก","๐Ÿ‘จโ€๐Ÿฆฝโ€โžก","๐Ÿ‘ฉโ€๐Ÿฆผ","๐Ÿง‘โ€๐Ÿฆผ","๐Ÿ‘จโ€๐Ÿฆผ","๐Ÿ‘ฉโ€๐Ÿฆผโ€โžก","๐Ÿง‘โ€๐Ÿฆผโ€โžก","๐Ÿ‘จโ€๐Ÿฆผโ€โžก","๐Ÿšถโ€โ™€","๐Ÿšถ","๐Ÿšถโ€โ™‚","๐Ÿšถโ€โ™€โ€โžก","๐Ÿšถโ€โžก","๐Ÿšถโ€โ™‚โ€โžก","๐Ÿ‘ฉโ€๐Ÿฆฏ","๐Ÿง‘โ€๐Ÿฆฏ","๐Ÿ‘จโ€๐Ÿฆฏ","๐Ÿ‘ฉโ€๐Ÿฆฏโ€โžก","๐Ÿง‘โ€๐Ÿฆฏโ€โžก","๐Ÿ‘จโ€๐Ÿฆฏโ€โžก","๐ŸงŽโ€โ™€","๐ŸงŽ","๐ŸงŽโ€โ™‚","๐Ÿƒโ€โ™€","๐Ÿƒ","๐Ÿƒโ€โ™‚","๐Ÿƒโ€โ™€โ€โžก","๐Ÿƒโ€โžก","๐Ÿƒโ€โ™‚โ€โžก","๐ŸงŽโ€โ™€โ€โžก","๐ŸงŽโ€โžก","๐ŸงŽโ€โ™‚โ€โžก", "๐Ÿงโ€โ™€", "๐Ÿง", "๐Ÿงโ€โ™‚", "๐Ÿ‹โ€โ™€", "๐Ÿ‹", "๐Ÿ‹โ€โ™‚", "๐Ÿคธโ€โ™€", "๐Ÿคธ", "๐Ÿคธโ€โ™‚", "โ›นโ€โ™€", "โ›น", "โ›นโ€โ™‚", "๐Ÿคพโ€โ™€", "๐Ÿคพ", "๐Ÿคพโ€โ™‚", "๐ŸŒโ€โ™€", "๐ŸŒ", "๐ŸŒโ€โ™‚", "๐Ÿ‡", "๐Ÿง˜โ€โ™€", "๐Ÿง˜", "๐Ÿง˜โ€โ™‚", "๐Ÿ„โ€โ™€", "๐Ÿ„", "๐Ÿ„โ€โ™‚", "๐ŸŠโ€โ™€", "๐ŸŠ", "๐ŸŠโ€โ™‚", "๐Ÿคฝโ€โ™€", "๐Ÿคฝ", "๐Ÿคฝโ€โ™‚", "๐Ÿšฃโ€โ™€", "๐Ÿšฃ", "๐Ÿšฃโ€โ™‚", "๐Ÿง—โ€โ™€", "๐Ÿง—", "๐Ÿง—โ€โ™‚", "๐Ÿšตโ€โ™€", "๐Ÿšต", "๐Ÿšตโ€โ™‚", "๐Ÿšดโ€โ™€", "๐Ÿšด", "๐Ÿšดโ€โ™‚", "๐Ÿคนโ€โ™€", "๐Ÿคน", "๐Ÿคนโ€โ™‚", "๐Ÿ›€" }; public static final String[] emojiBigColored = { @@ -70,7 +70,7 @@ public class EmojiData { public static final String[][] dataColored = { new String[]{ - "๐Ÿ˜€", "๐Ÿ˜ƒ", "๐Ÿ˜„", "๐Ÿ˜", "๐Ÿ˜†", "๐Ÿฅน", "๐Ÿ˜…", "๐Ÿ˜‚", "๐Ÿคฃ", "๐Ÿฅฒ", "โ˜บ", "๐Ÿ˜Š", "๐Ÿ˜‡", "๐Ÿ™‚", "๐Ÿ™ƒ", "๐Ÿ˜‰", "๐Ÿ˜Œ", "๐Ÿ˜", "๐Ÿฅฐ", "๐Ÿ˜˜", "๐Ÿ˜—", "๐Ÿ˜™", "๐Ÿ˜š", "๐Ÿ˜‹", "๐Ÿ˜›", "๐Ÿ˜", "๐Ÿ˜œ", "๐Ÿคช", "๐Ÿคจ", "๐Ÿง", "๐Ÿค“", "๐Ÿ˜Ž", "๐Ÿฅธ", "๐Ÿคฉ", "๐Ÿฅณ", "๐Ÿ˜", "๐Ÿ˜’", "๐Ÿ˜ž", "๐Ÿ˜”", "๐Ÿ˜Ÿ", "๐Ÿ˜•", "๐Ÿ™", "โ˜น", "๐Ÿ˜ฃ", "๐Ÿ˜–", "๐Ÿ˜ซ", "๐Ÿ˜ฉ", "๐Ÿฅบ", "๐Ÿ˜ข", "๐Ÿ˜ญ", "๐Ÿ˜ค", "๐Ÿ˜ ", "๐Ÿ˜ก", "๐Ÿคฌ", "๐Ÿคฏ", "๐Ÿ˜ณ", "๐Ÿฅต", "๐Ÿฅถ", "๐Ÿ˜ถโ€๐ŸŒซ", "๐Ÿ˜ฑ", "๐Ÿ˜จ", "๐Ÿ˜ฐ", "๐Ÿ˜ฅ", "๐Ÿ˜“", "๐Ÿค—", "๐Ÿค”", "๐Ÿซฃ", "๐Ÿคญ", "๐Ÿซข", "๐Ÿซก", "๐Ÿคซ", "๐Ÿซ ", "๐Ÿคฅ", "๐Ÿ˜ถ", "๐Ÿซฅ", "๐Ÿ˜", "๐Ÿซค", "๐Ÿ˜‘", "๐Ÿซจ", "๐Ÿ˜ฌ", "๐Ÿ™„", "๐Ÿ˜ฏ", "๐Ÿ˜ฆ", "๐Ÿ˜ง", "๐Ÿ˜ฎ", "๐Ÿ˜ฒ", "๐Ÿฅฑ", "๐Ÿ˜ด", "๐Ÿคค", "๐Ÿ˜ช", "๐Ÿ˜ฎโ€๐Ÿ’จ", "๐Ÿ˜ต", "๐Ÿ˜ตโ€๐Ÿ’ซ", "๐Ÿค", "๐Ÿฅด", "๐Ÿคข", "๐Ÿคฎ", "๐Ÿคง", "๐Ÿ˜ท", "๐Ÿค’", "๐Ÿค•", "๐Ÿค‘", "๐Ÿค ", "๐Ÿ˜ˆ", "๐Ÿ‘ฟ", "๐Ÿ‘น", "๐Ÿ‘บ", "๐Ÿคก", "๐Ÿ’ฉ", "๐Ÿ‘ป", "๐Ÿ’€", "โ˜ ", "๐Ÿ‘ฝ", "๐Ÿ‘พ", "๐Ÿค–", "๐ŸŽƒ", "๐Ÿ˜บ", "๐Ÿ˜ธ", "๐Ÿ˜น", "๐Ÿ˜ป", "๐Ÿ˜ผ", "๐Ÿ˜ฝ", "๐Ÿ™€", "๐Ÿ˜ฟ", "๐Ÿ˜พ", + "๐Ÿ˜€", "๐Ÿ˜ƒ", "๐Ÿ˜„", "๐Ÿ˜", "๐Ÿ˜†", "๐Ÿฅน", "๐Ÿ˜…", "๐Ÿ˜‚", "๐Ÿคฃ", "๐Ÿฅฒ", "โ˜บ", "๐Ÿ˜Š", "๐Ÿ˜‡", "๐Ÿ™‚", "๐Ÿ™ƒ", "๐Ÿ˜‰", "๐Ÿ˜Œ", "๐Ÿ˜", "๐Ÿฅฐ", "๐Ÿ˜˜", "๐Ÿ˜—", "๐Ÿ˜™", "๐Ÿ˜š", "๐Ÿ˜‹", "๐Ÿ˜›", "๐Ÿ˜", "๐Ÿ˜œ", "๐Ÿคช", "๐Ÿคจ", "๐Ÿง", "๐Ÿค“", "๐Ÿ˜Ž", "๐Ÿฅธ", "๐Ÿคฉ", "๐Ÿฅณ", "๐Ÿ™‚โ€โ†•", "๐Ÿ˜", "๐Ÿ˜’", "๐Ÿ™‚โ€โ†”", "๐Ÿ˜ž", "๐Ÿ˜”", "๐Ÿ˜Ÿ", "๐Ÿ˜•", "๐Ÿ™", "โ˜น", "๐Ÿ˜ฃ", "๐Ÿ˜–", "๐Ÿ˜ซ", "๐Ÿ˜ฉ", "๐Ÿฅบ", "๐Ÿ˜ข", "๐Ÿ˜ญ", "๐Ÿ˜ค", "๐Ÿ˜ ", "๐Ÿ˜ก", "๐Ÿคฌ", "๐Ÿคฏ", "๐Ÿ˜ณ", "๐Ÿฅต", "๐Ÿฅถ", "๐Ÿ˜ถโ€๐ŸŒซ", "๐Ÿ˜ฑ", "๐Ÿ˜จ", "๐Ÿ˜ฐ", "๐Ÿ˜ฅ", "๐Ÿ˜“", "๐Ÿค—", "๐Ÿค”", "๐Ÿซฃ", "๐Ÿคญ", "๐Ÿซข", "๐Ÿซก", "๐Ÿคซ", "๐Ÿซ ", "๐Ÿคฅ", "๐Ÿ˜ถ", "๐Ÿซฅ", "๐Ÿ˜", "๐Ÿซค", "๐Ÿ˜‘", "๐Ÿซจ", "๐Ÿ˜ฌ", "๐Ÿ™„", "๐Ÿ˜ฏ", "๐Ÿ˜ฆ", "๐Ÿ˜ง", "๐Ÿ˜ฎ", "๐Ÿ˜ฒ", "๐Ÿฅฑ", "๐Ÿ˜ด", "๐Ÿคค", "๐Ÿ˜ช", "๐Ÿ˜ฎโ€๐Ÿ’จ", "๐Ÿ˜ต", "๐Ÿ˜ตโ€๐Ÿ’ซ", "๐Ÿค", "๐Ÿฅด", "๐Ÿคข", "๐Ÿคฎ", "๐Ÿคง", "๐Ÿ˜ท", "๐Ÿค’", "๐Ÿค•", "๐Ÿค‘", "๐Ÿค ", "๐Ÿ˜ˆ", "๐Ÿ‘ฟ", "๐Ÿ‘น", "๐Ÿ‘บ", "๐Ÿคก", "๐Ÿ’ฉ", "๐Ÿ‘ป", "๐Ÿ’€", "โ˜ ", "๐Ÿ‘ฝ", "๐Ÿ‘พ", "๐Ÿค–", "๐ŸŽƒ", "๐Ÿ˜บ", "๐Ÿ˜ธ", "๐Ÿ˜น", "๐Ÿ˜ป", "๐Ÿ˜ผ", "๐Ÿ˜ฝ", "๐Ÿ™€", "๐Ÿ˜ฟ", "๐Ÿ˜พ", "๐Ÿซถ", "๐Ÿคฒ", "๐Ÿ‘", @@ -303,24 +303,7 @@ public class EmojiData { "๐Ÿ•บ", "๐Ÿ‘ฏโ€โ™€", "๐Ÿ‘ฏ", "๐Ÿ‘ฏโ€โ™‚", "๐Ÿ•ด", - "๐Ÿ‘ฉโ€๐Ÿฆฝ", - "๐Ÿง‘โ€๐Ÿฆฝ", - "๐Ÿ‘จโ€๐Ÿฆฝ", - "๐Ÿ‘ฉโ€๐Ÿฆผ", - "๐Ÿง‘โ€๐Ÿฆผ", - "๐Ÿ‘จโ€๐Ÿฆผ", - "๐Ÿšถโ€โ™€", - "๐Ÿšถ", - "๐Ÿšถโ€โ™‚", - "๐Ÿ‘ฉโ€๐Ÿฆฏ", - "๐Ÿง‘โ€๐Ÿฆฏ", - "๐Ÿ‘จโ€๐Ÿฆฏ", - "๐ŸงŽโ€โ™€", - "๐ŸงŽ", - "๐ŸงŽโ€โ™‚", - "๐Ÿƒโ€โ™€", - "๐Ÿƒ", - "๐Ÿƒโ€โ™‚", + "๐Ÿ‘ฉโ€๐Ÿฆฝ","๐Ÿง‘โ€๐Ÿฆฝ","๐Ÿ‘จโ€๐Ÿฆฝ","๐Ÿ‘ฉโ€๐Ÿฆฝโ€โžก","๐Ÿง‘โ€๐Ÿฆฝโ€โžก","๐Ÿ‘จโ€๐Ÿฆฝโ€โžก","๐Ÿ‘ฉโ€๐Ÿฆผ","๐Ÿง‘โ€๐Ÿฆผ","๐Ÿ‘จโ€๐Ÿฆผ","๐Ÿ‘ฉโ€๐Ÿฆผโ€โžก","๐Ÿง‘โ€๐Ÿฆผโ€โžก","๐Ÿ‘จโ€๐Ÿฆผโ€โžก","๐Ÿšถโ€โ™€","๐Ÿšถ","๐Ÿšถโ€โ™‚","๐Ÿšถโ€โ™€โ€โžก","๐Ÿšถโ€โžก","๐Ÿšถโ€โ™‚โ€โžก","๐Ÿ‘ฉโ€๐Ÿฆฏ","๐Ÿง‘โ€๐Ÿฆฏ","๐Ÿ‘จโ€๐Ÿฆฏ","๐Ÿ‘ฉโ€๐Ÿฆฏโ€โžก","๐Ÿง‘โ€๐Ÿฆฏโ€โžก","๐Ÿ‘จโ€๐Ÿฆฏโ€โžก","๐ŸงŽโ€โ™€","๐ŸงŽ","๐ŸงŽโ€โ™‚","๐Ÿƒโ€โ™€","๐Ÿƒ","๐Ÿƒโ€โ™‚","๐Ÿƒโ€โ™€โ€โžก","๐Ÿƒโ€โžก","๐Ÿƒโ€โ™‚โ€โžก","๐ŸงŽโ€โ™€โ€โžก","๐ŸงŽโ€โžก","๐ŸงŽโ€โ™‚โ€โžก", "๐Ÿงโ€โ™€", "๐Ÿง", "๐Ÿงโ€โ™‚", @@ -335,7 +318,7 @@ public class EmojiData { "๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ", "๐Ÿ’", "๐Ÿ‘จโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ", - "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿชข", "๐Ÿงถ", "๐Ÿงต", "๐Ÿชก", "๐Ÿงฅ", "๐Ÿฅผ", "๐Ÿฆบ", "๐Ÿ‘š", "๐Ÿ‘•", "๐Ÿ‘–", "๐Ÿฉฒ", "๐Ÿฉณ", "๐Ÿ‘”", "๐Ÿ‘—", "๐Ÿ‘™", "๐Ÿฉฑ", "๐Ÿ‘˜", "๐Ÿฅป", "๐Ÿฉด", "๐Ÿฅฟ", "๐Ÿ‘ ", "๐Ÿ‘ก", "๐Ÿ‘ข", "๐Ÿ‘ž", "๐Ÿ‘Ÿ", "๐Ÿฅพ", "๐Ÿงฆ", "๐Ÿงค", "๐Ÿงฃ", "๐ŸŽฉ", "๐Ÿงข", "๐Ÿ‘’", "๐ŸŽ“", "โ›‘", "๐Ÿช–", "๐Ÿ‘‘", "๐Ÿ’", "๐Ÿ‘", "๐Ÿ‘›", "๐Ÿ‘œ", "๐Ÿ’ผ", "๐ŸŽ’", "๐Ÿงณ", "๐Ÿ‘“", "๐Ÿ•ถ", "๐Ÿฅฝ", "๐ŸŒ‚" + "๐Ÿชข", "๐Ÿงถ", "๐Ÿงต", "๐Ÿชก", "๐Ÿงฅ", "๐Ÿฅผ", "๐Ÿฆบ", "๐Ÿ‘š", "๐Ÿ‘•", "๐Ÿ‘–", "๐Ÿฉฒ", "๐Ÿฉณ", "๐Ÿ‘”", "๐Ÿ‘—", "๐Ÿ‘™", "๐Ÿฉฑ", "๐Ÿ‘˜", "๐Ÿฅป", "๐Ÿฉด", "๐Ÿฅฟ", "๐Ÿ‘ ", "๐Ÿ‘ก", "๐Ÿ‘ข", "๐Ÿ‘ž", "๐Ÿ‘Ÿ", "๐Ÿฅพ", "๐Ÿงฆ", "๐Ÿงค", "๐Ÿงฃ", "๐ŸŽฉ", "๐Ÿงข", "๐Ÿ‘’", "๐ŸŽ“", "โ›‘", "๐Ÿช–", "๐Ÿ‘‘", "๐Ÿ’", "๐Ÿ‘", "๐Ÿ‘›", "๐Ÿ‘œ", "๐Ÿ’ผ", "๐ŸŽ’", "๐Ÿงณ", "๐Ÿ‘“", "๐Ÿ•ถ", "๐Ÿฅฝ", "๐ŸŒ‚" }, null, null, @@ -391,11 +374,13 @@ public class EmojiData { }, null, new String[]{ - "โŒš", "๐Ÿ“ฑ", "๐Ÿ“ฒ", "๐Ÿ’ป", "โŒจ", "๐Ÿ–ฅ", "๐Ÿ–จ", "๐Ÿ–ฑ", "๐Ÿ–ฒ", "๐Ÿ•น", "๐Ÿ—œ", "๐Ÿ’ฝ", "๐Ÿ’พ", "๐Ÿ’ฟ", "๐Ÿ“€", "๐Ÿ“ผ", "๐Ÿ“ท", "๐Ÿ“ธ", "๐Ÿ“น", "๐ŸŽฅ", "๐Ÿ“ฝ", "๐ŸŽž", "๐Ÿ“ž", "โ˜Ž", "๐Ÿ“Ÿ", "๐Ÿ“ ", "๐Ÿ“บ", "๐Ÿ“ป", "๐ŸŽ™", "๐ŸŽš", "๐ŸŽ›", "๐Ÿงญ", "โฑ", "โฒ", "โฐ", "๐Ÿ•ฐ", "โŒ›", "โณ", "๐Ÿ“ก", "๐Ÿ”‹", "๐Ÿชซ", "๐Ÿ”Œ", "๐Ÿ’ก", "๐Ÿ”ฆ", "๐Ÿ•ฏ", "๐Ÿช”", "๐Ÿงฏ", "๐Ÿ›ข", "๐Ÿ’ธ", "๐Ÿ’ต", "๐Ÿ’ด", "๐Ÿ’ถ", "๐Ÿ’ท", "๐Ÿช™", "๐Ÿ’ฐ", "๐Ÿ’ณ", "๐Ÿชช", "๐Ÿ’Ž", "โš–", "๐Ÿชœ", "๐Ÿงฐ", "๐Ÿช›", "๐Ÿ”ง", "๐Ÿ”จ", "โš’", "๐Ÿ› ", "โ›", "๐Ÿชš", "๐Ÿ”ฉ", "โš™", "๐Ÿชค", "๐Ÿงฑ", "โ›“", "๐Ÿงฒ", "๐Ÿ”ซ", "๐Ÿ’ฃ", "๐Ÿงจ", "๐Ÿช“", "๐Ÿ”ช", "๐Ÿ—ก", "โš”", "๐Ÿ›ก", "๐Ÿšฌ", "โšฐ", "๐Ÿชฆ", "โšฑ", "๐Ÿบ", "๐Ÿ”ฎ", "๐Ÿ“ฟ", "๐Ÿงฟ", "๐Ÿชฌ", "๐Ÿ’ˆ", "โš—", "๐Ÿ”ญ", "๐Ÿ”ฌ", "๐Ÿ•ณ", "๐Ÿฉป", "๐Ÿฉน", "๐Ÿฉบ", "๐Ÿ’Š", "๐Ÿ’‰", "๐Ÿฉธ", "๐Ÿงฌ", "๐Ÿฆ ", "๐Ÿงซ", "๐Ÿงช", "๐ŸŒก", "๐Ÿงน", "๐Ÿช ", "๐Ÿงบ", "๐Ÿงป", "๐Ÿšฝ", "๐Ÿšฐ", "๐Ÿšฟ", "๐Ÿ›", + "โŒš", "๐Ÿ“ฑ", "๐Ÿ“ฒ", "๐Ÿ’ป", "โŒจ", "๐Ÿ–ฅ", "๐Ÿ–จ", "๐Ÿ–ฑ", "๐Ÿ–ฒ", "๐Ÿ•น", "๐Ÿ—œ", "๐Ÿ’ฝ", "๐Ÿ’พ", "๐Ÿ’ฟ", "๐Ÿ“€", "๐Ÿ“ผ", "๐Ÿ“ท", "๐Ÿ“ธ", "๐Ÿ“น", "๐ŸŽฅ", "๐Ÿ“ฝ", "๐ŸŽž", "๐Ÿ“ž", "โ˜Ž", "๐Ÿ“Ÿ", "๐Ÿ“ ", "๐Ÿ“บ", "๐Ÿ“ป", "๐ŸŽ™", "๐ŸŽš", "๐ŸŽ›", "๐Ÿงญ", "โฑ", "โฒ", "โฐ", "๐Ÿ•ฐ", "โŒ›", "โณ", "๐Ÿ“ก", "๐Ÿ”‹", "๐Ÿชซ", "๐Ÿ”Œ", "๐Ÿ’ก", "๐Ÿ”ฆ", "๐Ÿ•ฏ", "๐Ÿช”", "๐Ÿงฏ", "๐Ÿ›ข", "๐Ÿ’ธ", "๐Ÿ’ต", "๐Ÿ’ด", "๐Ÿ’ถ", "๐Ÿ’ท", "๐Ÿช™", "๐Ÿ’ฐ", "๐Ÿ’ณ", "๐Ÿชช", "๐Ÿ’Ž", "โš–", "๐Ÿชœ", "๐Ÿงฐ", "๐Ÿช›", "๐Ÿ”ง", "๐Ÿ”จ", "โš’", "๐Ÿ› ", "โ›", "๐Ÿชš", "๐Ÿ”ฉ", "โš™", "๐Ÿชค", "๐Ÿงฑ", "โ›“", "โ›“โ€๐Ÿ’ฅ", "๐Ÿงฒ", "๐Ÿ”ซ", "๐Ÿ’ฃ", "๐Ÿงจ", "๐Ÿช“", "๐Ÿ”ช", "๐Ÿ—ก", "โš”", "๐Ÿ›ก", "๐Ÿšฌ", "โšฐ", "๐Ÿชฆ", "โšฑ", "๐Ÿบ", "๐Ÿ”ฎ", "๐Ÿ“ฟ", "๐Ÿงฟ", "๐Ÿชฌ", "๐Ÿ’ˆ", "โš—", "๐Ÿ”ญ", "๐Ÿ”ฌ", "๐Ÿ•ณ", "๐Ÿฉป", "๐Ÿฉน", "๐Ÿฉบ", "๐Ÿ’Š", "๐Ÿ’‰", "๐Ÿฉธ", "๐Ÿงฌ", "๐Ÿฆ ", "๐Ÿงซ", "๐Ÿงช", "๐ŸŒก", "๐Ÿงน", "๐Ÿช ", "๐Ÿงบ", "๐Ÿงป", "๐Ÿšฝ", "๐Ÿšฐ", "๐Ÿšฟ", "๐Ÿ›", "๐Ÿ›€", "๐Ÿงผ", "๐Ÿชฅ", "๐Ÿช’", "๐Ÿชฎ", "๐Ÿงฝ", "๐Ÿชฃ", "๐Ÿงด", "๐Ÿ›Ž", "๐Ÿ”‘", "๐Ÿ—", "๐Ÿšช", "๐Ÿช‘", "๐Ÿ›‹", "๐Ÿ›", "๐Ÿ›Œ", "๐Ÿงธ", "๐Ÿช†", "๐Ÿ–ผ", "๐Ÿชž", "๐ŸชŸ", "๐Ÿ›", "๐Ÿ›’", "๐ŸŽ", "๐ŸŽˆ", "๐ŸŽ", "๐ŸŽ€", "๐Ÿช„", "๐Ÿช…", "๐ŸŽŠ", "๐ŸŽ‰", "๐ŸŽŽ", "๐Ÿชญ", "๐Ÿฎ", "๐ŸŽ", "๐Ÿชฉ", "๐Ÿงง", "โœ‰", "๐Ÿ“ฉ", "๐Ÿ“จ", "๐Ÿ“ง", "๐Ÿ’Œ", "๐Ÿ“ฅ", "๐Ÿ“ค", "๐Ÿ“ฆ", "๐Ÿท", "๐Ÿชง", "๐Ÿ“ช", "๐Ÿ“ซ", "๐Ÿ“ฌ", "๐Ÿ“ญ", "๐Ÿ“ฎ", "๐Ÿ“ฏ", "๐Ÿ“œ", "๐Ÿ“ƒ", "๐Ÿ“„", "๐Ÿ“‘", "๐Ÿงพ", "๐Ÿ“Š", "๐Ÿ“ˆ", "๐Ÿ“‰", "๐Ÿ—’", "๐Ÿ—“", "๐Ÿ“†", "๐Ÿ“…", "๐Ÿ—‘", "๐Ÿ“‡", "๐Ÿ—ƒ", "๐Ÿ—ณ", "๐Ÿ—„", "๐Ÿ“‹", "๐Ÿ“", "๐Ÿ“‚", "๐Ÿ—‚", "๐Ÿ—ž", "๐Ÿ“ฐ", "๐Ÿ““", "๐Ÿ“”", "๐Ÿ“’", "๐Ÿ“•", "๐Ÿ“—", "๐Ÿ“˜", "๐Ÿ“™", "๐Ÿ“š", "๐Ÿ“–", "๐Ÿ”–", "๐Ÿงท", "๐Ÿ”—", "๐Ÿ“Ž", "๐Ÿ–‡", "๐Ÿ“", "๐Ÿ“", "๐Ÿงฎ", "๐Ÿ“Œ", "๐Ÿ“", "โœ‚", "๐Ÿ–Š", "๐Ÿ–‹", "โœ’", "๐Ÿ–Œ", "๐Ÿ–", "๐Ÿ“", "โœ", "๐Ÿ”", "๐Ÿ”Ž", "๐Ÿ”", "๐Ÿ”", "๐Ÿ”’", "๐Ÿ”“" }, - null, + new String[]{ + "๐Ÿฉท", "โค", "๐Ÿงก", "๐Ÿ’›", "๐Ÿ’š", "๐Ÿฉต", "๐Ÿ’™", "๐Ÿ’œ", "๐Ÿ–ค", "๐Ÿฉถ", "๐Ÿค", "๐ŸคŽ", "๐Ÿ’”", "โคโ€๐Ÿ”ฅ", "โคโ€๐Ÿฉน", "โฃ", "๐Ÿ’•", "๐Ÿ’ž", "๐Ÿ’“", "๐Ÿ’—", "๐Ÿ’–", "๐Ÿ’˜", "๐Ÿ’", "๐Ÿ’Ÿ", "โ˜ฎ", "โœ", "โ˜ช", "๐Ÿ•‰", "โ˜ธ", "๐Ÿชฏ", "โœก", "๐Ÿ”ฏ", "๐Ÿ•Ž", "โ˜ฏ", "โ˜ฆ", "๐Ÿ›", "โ›Ž", "โ™ˆ", "โ™‰", "โ™Š", "โ™‹", "โ™Œ", "โ™", "โ™Ž", "โ™", "โ™", "โ™‘", "โ™’", "โ™“", "๐Ÿ†”", "โš›", "๐Ÿ‰‘", "โ˜ข", "โ˜ฃ", "๐Ÿ“ด", "๐Ÿ“ณ", "๐Ÿˆถ", "๐Ÿˆš", "๐Ÿˆธ", "๐Ÿˆบ", "๐Ÿˆท", "โœด", "๐Ÿ†š", "๐Ÿ’ฎ", "๐Ÿ‰", "ใŠ™", "ใŠ—", "๐Ÿˆด", "๐Ÿˆต", "๐Ÿˆน", "๐Ÿˆฒ", "๐Ÿ…ฐ", "๐Ÿ…ฑ", "๐Ÿ†Ž", "๐Ÿ†‘", "๐Ÿ…พ", "๐Ÿ†˜", "โŒ", "โญ•", "๐Ÿ›‘", "โ›”", "๐Ÿ“›", "๐Ÿšซ", "๐Ÿ’ฏ", "๐Ÿ’ข", "โ™จ", "๐Ÿšท", "๐Ÿšฏ", "๐Ÿšณ", "๐Ÿšฑ", "๐Ÿ”ž", "๐Ÿ“ต", "๐Ÿšญ", "โ—", "โ•", "โ“", "โ”", "โ€ผ", "โ‰", "๐Ÿ”…", "๐Ÿ”†", "ใ€ฝ", "โš ", "๐Ÿšธ", "๐Ÿ”ฑ", "โšœ", "๐Ÿ”ฐ", "โ™ป", "โœ…", "๐Ÿˆฏ", "๐Ÿ’น", "โ‡", "โœณ", "โŽ", "๐ŸŒ", "๐Ÿ’ ", "โ“‚", "๐ŸŒ€", "๐Ÿ’ค", "๐Ÿง", "๐Ÿšพ", "โ™ฟ", "๐Ÿ…ฟ", "๐Ÿ›—", "๐Ÿˆณ", "๐Ÿˆ‚", "๐Ÿ›‚", "๐Ÿ›ƒ", "๐Ÿ›„", "๐Ÿ›…", "๐Ÿ›œ", "๐Ÿšน", "๐Ÿšบ", "๐Ÿšผ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "โšง", "๐Ÿšป", "๐Ÿšฎ", "๐ŸŽฆ", "๐Ÿ“ถ", "๐Ÿˆ", "๐Ÿ”ฃ", "โ„น", "๐Ÿ”ค", "๐Ÿ”ก", "๐Ÿ” ", "๐Ÿ†–", "๐Ÿ†—", "๐Ÿ†™", "๐Ÿ†’", "๐Ÿ†•", "๐Ÿ†“", "0โƒฃ", "1โƒฃ", "2โƒฃ", "3โƒฃ", "4โƒฃ", "5โƒฃ", "6โƒฃ", "7โƒฃ", "8โƒฃ", "9โƒฃ", "๐Ÿ”Ÿ", "๐Ÿ”ข", "#โƒฃ", "*โƒฃ", "โ", "โ–ถ", "โธ", "โฏ", "โน", "โบ", "โญ", "โฎ", "โฉ", "โช", "โซ", "โฌ", "โ—€", "๐Ÿ”ผ", "๐Ÿ”ฝ", "โžก", "โฌ…", "โฌ†", "โฌ‡", "โ†—", "โ†˜", "โ†™", "โ†–", "โ†•", "โ†”", "โ†ช", "โ†ฉ", "โคด", "โคต", "๐Ÿ”€", "๐Ÿ”", "๐Ÿ”‚", "๐Ÿ”„", "๐Ÿ”ƒ", "๐ŸŽต", "๐ŸŽถ", "โž•", "โž–", "โž—", "โœ–", "๐ŸŸฐ", "โ™พ", "๐Ÿ’ฒ", "๐Ÿ’ฑ", "โ„ข๏ธ", "ยฉ", "ยฎ", "๐Ÿ‘โ€๐Ÿ—จ", "๐Ÿ”š", "๐Ÿ”™", "๐Ÿ”›", "๐Ÿ”", "๐Ÿ”œ", "ใ€ฐ", "โžฐ", "โžฟ", "โœ”", "โ˜‘", "๐Ÿ”˜", "๐Ÿ”ด", "๐ŸŸ ", "๐ŸŸก", "๐ŸŸข", "๐Ÿ”ต", "๐ŸŸฃ", "โšซ", "โšช", "๐ŸŸค", "๐Ÿ”บ", "๐Ÿ”ป", "๐Ÿ”ธ", "๐Ÿ”น", "๐Ÿ”ถ", "๐Ÿ”ท", "๐Ÿ”ณ", "๐Ÿ”ฒ", "โ–ช", "โ–ซ", "โ—พ", "โ—ฝ", "โ—ผ", "โ—ป", "๐ŸŸฅ", "๐ŸŸง", "๐ŸŸจ", "๐ŸŸฉ", "๐ŸŸฆ", "๐ŸŸช", "โฌ›", "โฌœ", "๐ŸŸซ", "๐Ÿ”ˆ", "๐Ÿ”‡", "๐Ÿ”‰", "๐Ÿ”Š", "๐Ÿ””", "๐Ÿ”•", "๐Ÿ“ฃ", "๐Ÿ“ข", "๐Ÿ’ฌ", "๐Ÿ’ญ", "๐Ÿ—ฏ", "โ™ ", "โ™ฃ", "โ™ฅ", "โ™ฆ", "๐Ÿƒ", "๐ŸŽด", "๐Ÿ€„", "๐Ÿ•", "๐Ÿ•‘", "๐Ÿ•’", "๐Ÿ•“", "๐Ÿ•”", "๐Ÿ••", "๐Ÿ•–", "๐Ÿ•—", "๐Ÿ•˜", "๐Ÿ•™", "๐Ÿ•š", "๐Ÿ•›", "๐Ÿ•œ", "๐Ÿ•", "๐Ÿ•ž", "๐Ÿ•Ÿ", "๐Ÿ• ", "๐Ÿ•ก", "๐Ÿ•ข", "๐Ÿ•ฃ", "๐Ÿ•ค", "๐Ÿ•ฅ", "๐Ÿ•ฆ", "๐Ÿ•ง" + }, null }; @@ -503,13 +488,13 @@ public class EmojiData { public static final String[][] data = { new String[]{ - "๐Ÿ˜€", "๐Ÿ˜ƒ", "๐Ÿ˜„", "๐Ÿ˜", "๐Ÿ˜†", "๐Ÿฅน", "๐Ÿ˜…", "๐Ÿ˜‚", "๐Ÿคฃ", "๐Ÿฅฒ", "โ˜บ", "๐Ÿ˜Š", "๐Ÿ˜‡", "๐Ÿ™‚", "๐Ÿ™ƒ", "๐Ÿ˜‰", "๐Ÿ˜Œ", "๐Ÿ˜", "๐Ÿฅฐ", "๐Ÿ˜˜", "๐Ÿ˜—", "๐Ÿ˜™", "๐Ÿ˜š", "๐Ÿ˜‹", "๐Ÿ˜›", "๐Ÿ˜", "๐Ÿ˜œ", "๐Ÿคช", "๐Ÿคจ", "๐Ÿง", "๐Ÿค“", "๐Ÿ˜Ž", "๐Ÿฅธ", "๐Ÿคฉ", "๐Ÿฅณ", "๐Ÿ˜", "๐Ÿ˜’", "๐Ÿ˜ž", "๐Ÿ˜”", "๐Ÿ˜Ÿ", "๐Ÿ˜•", "๐Ÿ™", "โ˜น", "๐Ÿ˜ฃ", "๐Ÿ˜–", "๐Ÿ˜ซ", "๐Ÿ˜ฉ", "๐Ÿฅบ", "๐Ÿ˜ข", "๐Ÿ˜ญ", "๐Ÿ˜ค", "๐Ÿ˜ ", "๐Ÿ˜ก", "๐Ÿคฌ", "๐Ÿคฏ", "๐Ÿ˜ณ", "๐Ÿฅต", "๐Ÿฅถ", "๐Ÿ˜ถโ€๐ŸŒซ", "๐Ÿ˜ฑ", "๐Ÿ˜จ", "๐Ÿ˜ฐ", "๐Ÿ˜ฅ", "๐Ÿ˜“", "๐Ÿค—", "๐Ÿค”", "๐Ÿซฃ", "๐Ÿคญ", "๐Ÿซข", "๐Ÿซก", "๐Ÿคซ", "๐Ÿซ ", "๐Ÿคฅ", "๐Ÿ˜ถ", "๐Ÿซฅ", "๐Ÿ˜", "๐Ÿซค", "๐Ÿ˜‘", "๐Ÿซจ", "๐Ÿ˜ฌ", "๐Ÿ™„", "๐Ÿ˜ฏ", "๐Ÿ˜ฆ", "๐Ÿ˜ง", "๐Ÿ˜ฎ", "๐Ÿ˜ฒ", "๐Ÿฅฑ", "๐Ÿ˜ด", "๐Ÿคค", "๐Ÿ˜ช", "๐Ÿ˜ฎโ€๐Ÿ’จ", "๐Ÿ˜ต", "๐Ÿ˜ตโ€๐Ÿ’ซ", "๐Ÿค", "๐Ÿฅด", "๐Ÿคข", "๐Ÿคฎ", "๐Ÿคง", "๐Ÿ˜ท", "๐Ÿค’", "๐Ÿค•", "๐Ÿค‘", "๐Ÿค ", "๐Ÿ˜ˆ", "๐Ÿ‘ฟ", "๐Ÿ‘น", "๐Ÿ‘บ", "๐Ÿคก", "๐Ÿ’ฉ", "๐Ÿ‘ป", "๐Ÿ’€", "โ˜ ", "๐Ÿ‘ฝ", "๐Ÿ‘พ", "๐Ÿค–", "๐ŸŽƒ", "๐Ÿ˜บ", "๐Ÿ˜ธ", "๐Ÿ˜น", "๐Ÿ˜ป", "๐Ÿ˜ผ", "๐Ÿ˜ฝ", "๐Ÿ™€", "๐Ÿ˜ฟ", "๐Ÿ˜พ", "๐Ÿซถ", "๐Ÿซถ๐Ÿป", "๐Ÿซถ๐Ÿผ", "๐Ÿซถ๐Ÿฝ", "๐Ÿซถ๐Ÿพ", "๐Ÿซถ๐Ÿฟ", "๐Ÿคฒ", "๐Ÿคฒ๐Ÿป", "๐Ÿคฒ๐Ÿผ", "๐Ÿคฒ๐Ÿฝ", "๐Ÿคฒ๐Ÿพ", "๐Ÿคฒ๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿ™Œ", "๐Ÿ™Œ๐Ÿป", "๐Ÿ™Œ๐Ÿผ", "๐Ÿ™Œ๐Ÿฝ", "๐Ÿ™Œ๐Ÿพ", "๐Ÿ™Œ๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿค", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿ‘Ž", "๐Ÿ‘Ž๐Ÿป", "๐Ÿ‘Ž๐Ÿผ", "๐Ÿ‘Ž๐Ÿฝ", "๐Ÿ‘Ž๐Ÿพ", "๐Ÿ‘Ž๐Ÿฟ", "๐Ÿ‘Š", "๐Ÿ‘Š๐Ÿป", "๐Ÿ‘Š๐Ÿผ", "๐Ÿ‘Š๐Ÿฝ", "๐Ÿ‘Š๐Ÿพ", "๐Ÿ‘Š๐Ÿฟ", "โœŠ", "โœŠ๐Ÿป", "โœŠ๐Ÿผ", "โœŠ๐Ÿฝ", "โœŠ๐Ÿพ", "โœŠ๐Ÿฟ", "๐Ÿค›", "๐Ÿค›๐Ÿป", "๐Ÿค›๐Ÿผ", "๐Ÿค›๐Ÿฝ", "๐Ÿค›๐Ÿพ", "๐Ÿค›๐Ÿฟ", "๐Ÿคœ", "๐Ÿคœ๐Ÿป", "๐Ÿคœ๐Ÿผ", "๐Ÿคœ๐Ÿฝ", "๐Ÿคœ๐Ÿพ", "๐Ÿคœ๐Ÿฟ", "๐Ÿซท", "๐Ÿซท๐Ÿป", "๐Ÿซท๐Ÿผ", "๐Ÿซท๐Ÿฝ", "๐Ÿซท๐Ÿพ", "๐Ÿซท๐Ÿฟ", "๐Ÿซธ", "๐Ÿซธ๐Ÿป", "๐Ÿซธ๐Ÿผ", "๐Ÿซธ๐Ÿฝ", "๐Ÿซธ๐Ÿพ", "๐Ÿซธ๐Ÿฟ", "๐Ÿคž", "๐Ÿคž๐Ÿป", "๐Ÿคž๐Ÿผ", "๐Ÿคž๐Ÿฝ", "๐Ÿคž๐Ÿพ", "๐Ÿคž๐Ÿฟ", "โœŒ", "โœŒ๐Ÿป", "โœŒ๐Ÿผ", "โœŒ๐Ÿฝ", "โœŒ๐Ÿพ", "โœŒ๐Ÿฟ", "๐Ÿซฐ", "๐Ÿซฐ๐Ÿป", "๐Ÿซฐ๐Ÿผ", "๐Ÿซฐ๐Ÿฝ", "๐Ÿซฐ๐Ÿพ", "๐Ÿซฐ๐Ÿฟ", "๐ŸคŸ", "๐ŸคŸ๐Ÿป", "๐ŸคŸ๐Ÿผ", "๐ŸคŸ๐Ÿฝ", "๐ŸคŸ๐Ÿพ", "๐ŸคŸ๐Ÿฟ", "๐Ÿค˜", "๐Ÿค˜๐Ÿป", "๐Ÿค˜๐Ÿผ", "๐Ÿค˜๐Ÿฝ", "๐Ÿค˜๐Ÿพ", "๐Ÿค˜๐Ÿฟ", "๐Ÿ‘Œ", "๐Ÿ‘Œ๐Ÿป", "๐Ÿ‘Œ๐Ÿผ", "๐Ÿ‘Œ๐Ÿฝ", "๐Ÿ‘Œ๐Ÿพ", "๐Ÿ‘Œ๐Ÿฟ", "๐ŸคŒ", "๐ŸคŒ๐Ÿป", "๐ŸคŒ๐Ÿผ", "๐ŸคŒ๐Ÿฝ", "๐ŸคŒ๐Ÿพ", "๐ŸคŒ๐Ÿฟ", "๐Ÿค", "๐Ÿค๐Ÿป", "๐Ÿค๐Ÿผ", "๐Ÿค๐Ÿฝ", "๐Ÿค๐Ÿพ", "๐Ÿค๐Ÿฟ", "๐Ÿซณ", "๐Ÿซณ๐Ÿป", "๐Ÿซณ๐Ÿผ", "๐Ÿซณ๐Ÿฝ", "๐Ÿซณ๐Ÿพ", "๐Ÿซณ๐Ÿฟ", "๐Ÿซด", "๐Ÿซด๐Ÿป", "๐Ÿซด๐Ÿผ", "๐Ÿซด๐Ÿฝ", "๐Ÿซด๐Ÿพ", "๐Ÿซด๐Ÿฟ", "๐Ÿ‘ˆ", "๐Ÿ‘ˆ๐Ÿป", "๐Ÿ‘ˆ๐Ÿผ", "๐Ÿ‘ˆ๐Ÿฝ", "๐Ÿ‘ˆ๐Ÿพ", "๐Ÿ‘ˆ๐Ÿฟ", "๐Ÿ‘‰", "๐Ÿ‘‰๐Ÿป", "๐Ÿ‘‰๐Ÿผ", "๐Ÿ‘‰๐Ÿฝ", "๐Ÿ‘‰๐Ÿพ", "๐Ÿ‘‰๐Ÿฟ", "๐Ÿ‘†", "๐Ÿ‘†๐Ÿป", "๐Ÿ‘†๐Ÿผ", "๐Ÿ‘†๐Ÿฝ", "๐Ÿ‘†๐Ÿพ", "๐Ÿ‘†๐Ÿฟ", "๐Ÿ‘‡", "๐Ÿ‘‡๐Ÿป", "๐Ÿ‘‡๐Ÿผ", "๐Ÿ‘‡๐Ÿฝ", "๐Ÿ‘‡๐Ÿพ", "๐Ÿ‘‡๐Ÿฟ", "โ˜", "โ˜๐Ÿป", "โ˜๐Ÿผ", "โ˜๐Ÿฝ", "โ˜๐Ÿพ", "โ˜๐Ÿฟ", "โœ‹", "โœ‹๐Ÿป", "โœ‹๐Ÿผ", "โœ‹๐Ÿฝ", "โœ‹๐Ÿพ", "โœ‹๐Ÿฟ", "๐Ÿคš", "๐Ÿคš๐Ÿป", "๐Ÿคš๐Ÿผ", "๐Ÿคš๐Ÿฝ", "๐Ÿคš๐Ÿพ", "๐Ÿคš๐Ÿฟ", "๐Ÿ–", "๐Ÿ–๐Ÿป", "๐Ÿ–๐Ÿผ", "๐Ÿ–๐Ÿฝ", "๐Ÿ–๐Ÿพ", "๐Ÿ–๐Ÿฟ", "๐Ÿ––", "๐Ÿ––๐Ÿป", "๐Ÿ––๐Ÿผ", "๐Ÿ––๐Ÿฝ", "๐Ÿ––๐Ÿพ", "๐Ÿ––๐Ÿฟ", "๐Ÿ‘‹", "๐Ÿ‘‹๐Ÿป", "๐Ÿ‘‹๐Ÿผ", "๐Ÿ‘‹๐Ÿฝ", "๐Ÿ‘‹๐Ÿพ", "๐Ÿ‘‹๐Ÿฟ", "๐Ÿค™", "๐Ÿค™๐Ÿป", "๐Ÿค™๐Ÿผ", "๐Ÿค™๐Ÿฝ", "๐Ÿค™๐Ÿพ", "๐Ÿค™๐Ÿฟ", "๐Ÿซฒ", "๐Ÿซฒ๐Ÿป", "๐Ÿซฒ๐Ÿผ", "๐Ÿซฒ๐Ÿฝ", "๐Ÿซฒ๐Ÿพ", "๐Ÿซฒ๐Ÿฟ", "๐Ÿซฑ", "๐Ÿซฑ๐Ÿป", "๐Ÿซฑ๐Ÿผ", "๐Ÿซฑ๐Ÿฝ", "๐Ÿซฑ๐Ÿพ", "๐Ÿซฑ๐Ÿฟ", "๐Ÿ’ช", "๐Ÿ’ช๐Ÿป", "๐Ÿ’ช๐Ÿผ", "๐Ÿ’ช๐Ÿฝ", "๐Ÿ’ช๐Ÿพ", "๐Ÿ’ช๐Ÿฟ", "๐Ÿฆพ", "๐Ÿ–•", "๐Ÿ–•๐Ÿป", "๐Ÿ–•๐Ÿผ", "๐Ÿ–•๐Ÿฝ", "๐Ÿ–•๐Ÿพ", "๐Ÿ–•๐Ÿฟ", "โœ", "โœ๐Ÿป", "โœ๐Ÿผ", "โœ๐Ÿฝ", "โœ๐Ÿพ", "โœ๐Ÿฟ", "๐Ÿ™", "๐Ÿ™๐Ÿป", "๐Ÿ™๐Ÿผ", "๐Ÿ™๐Ÿฝ", "๐Ÿ™๐Ÿพ", "๐Ÿ™๐Ÿฟ", "๐Ÿซต", "๐Ÿซต๐Ÿป", "๐Ÿซต๐Ÿผ", "๐Ÿซต๐Ÿฝ", "๐Ÿซต๐Ÿพ", "๐Ÿซต๐Ÿฟ", "๐Ÿฆถ", "๐Ÿฆถ๐Ÿป", "๐Ÿฆถ๐Ÿผ", "๐Ÿฆถ๐Ÿฝ", "๐Ÿฆถ๐Ÿพ", "๐Ÿฆถ๐Ÿฟ", "๐Ÿฆต", "๐Ÿฆต๐Ÿป", "๐Ÿฆต๐Ÿผ", "๐Ÿฆต๐Ÿฝ", "๐Ÿฆต๐Ÿพ", "๐Ÿฆต๐Ÿฟ", "๐Ÿฆฟ", "๐Ÿ’„", "๐Ÿ’‹", "๐Ÿ‘„", "๐Ÿซฆ", "๐Ÿฆท", "๐Ÿ‘…", "๐Ÿ‘‚", "๐Ÿ‘‚๐Ÿป", "๐Ÿ‘‚๐Ÿผ", "๐Ÿ‘‚๐Ÿฝ", "๐Ÿ‘‚๐Ÿพ", "๐Ÿ‘‚๐Ÿฟ", "๐Ÿฆป", "๐Ÿฆป๐Ÿป", "๐Ÿฆป๐Ÿผ", "๐Ÿฆป๐Ÿฝ", "๐Ÿฆป๐Ÿพ", "๐Ÿฆป๐Ÿฟ", "๐Ÿ‘ƒ", "๐Ÿ‘ƒ๐Ÿป", "๐Ÿ‘ƒ๐Ÿผ", "๐Ÿ‘ƒ๐Ÿฝ", "๐Ÿ‘ƒ๐Ÿพ", "๐Ÿ‘ƒ๐Ÿฟ", "๐Ÿ‘ฃ", "๐Ÿ‘", "๐Ÿ‘€", "๐Ÿซ€", "๐Ÿซ", "๐Ÿง ", "๐Ÿ—ฃ", "๐Ÿ‘ค", "๐Ÿ‘ฅ", "๐Ÿซ‚", "๐Ÿ‘ถ", "๐Ÿ‘ถ๐Ÿป", "๐Ÿ‘ถ๐Ÿผ", "๐Ÿ‘ถ๐Ÿฝ", "๐Ÿ‘ถ๐Ÿพ", "๐Ÿ‘ถ๐Ÿฟ", "๐Ÿ‘ง", "๐Ÿ‘ง๐Ÿป", "๐Ÿ‘ง๐Ÿผ", "๐Ÿ‘ง๐Ÿฝ", "๐Ÿ‘ง๐Ÿพ", "๐Ÿ‘ง๐Ÿฟ", "๐Ÿง’", "๐Ÿง’๐Ÿป", "๐Ÿง’๐Ÿผ", "๐Ÿง’๐Ÿฝ", "๐Ÿง’๐Ÿพ", "๐Ÿง’๐Ÿฟ", "๐Ÿ‘ฆ", "๐Ÿ‘ฆ๐Ÿป", "๐Ÿ‘ฆ๐Ÿผ", "๐Ÿ‘ฆ๐Ÿฝ", "๐Ÿ‘ฆ๐Ÿพ", "๐Ÿ‘ฆ๐Ÿฟ", "๐Ÿ‘ฉ", "๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿง‘", "๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฟ", "๐Ÿ‘จ", "๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฑ", "๐Ÿง‘โ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฑ", "๐Ÿ‘จโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฑ", "๐Ÿ‘ฉโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฐ", "๐Ÿง‘โ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฐ", "๐Ÿ‘จโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฐ", "๐Ÿ‘ฑโ€โ™€", "๐Ÿ‘ฑ๐Ÿปโ€โ™€", "๐Ÿ‘ฑ๐Ÿผโ€โ™€", "๐Ÿ‘ฑ๐Ÿฝโ€โ™€", "๐Ÿ‘ฑ๐Ÿพโ€โ™€", "๐Ÿ‘ฑ๐Ÿฟโ€โ™€", "๐Ÿ‘ฑ", "๐Ÿ‘ฑ๐Ÿป", "๐Ÿ‘ฑ๐Ÿผ", "๐Ÿ‘ฑ๐Ÿฝ", "๐Ÿ‘ฑ๐Ÿพ", "๐Ÿ‘ฑ๐Ÿฟ", "๐Ÿ‘ฑโ€โ™‚", "๐Ÿ‘ฑ๐Ÿปโ€โ™‚", "๐Ÿ‘ฑ๐Ÿผโ€โ™‚", "๐Ÿ‘ฑ๐Ÿฝโ€โ™‚", "๐Ÿ‘ฑ๐Ÿพโ€โ™‚", "๐Ÿ‘ฑ๐Ÿฟโ€โ™‚", "๐Ÿ‘ฉโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆณ", "๐Ÿง‘โ€๐Ÿฆณ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆณ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆณ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆณ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆณ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆณ", "๐Ÿ‘จโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆณ", "๐Ÿ‘ฉโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฒ", "๐Ÿง‘โ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฒ", "๐Ÿ‘จโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฒ", "๐Ÿง”โ€โ™€", "๐Ÿง”๐Ÿปโ€โ™€", "๐Ÿง”๐Ÿผโ€โ™€", "๐Ÿง”๐Ÿฝโ€โ™€", "๐Ÿง”๐Ÿพโ€โ™€", "๐Ÿง”๐Ÿฟโ€โ™€", "๐Ÿง”", "๐Ÿง”๐Ÿป", "๐Ÿง”๐Ÿผ", "๐Ÿง”๐Ÿฝ", "๐Ÿง”๐Ÿพ", "๐Ÿง”๐Ÿฟ", "๐Ÿง”โ€โ™‚", "๐Ÿง”๐Ÿปโ€โ™‚", "๐Ÿง”๐Ÿผโ€โ™‚", "๐Ÿง”๐Ÿฝโ€โ™‚", "๐Ÿง”๐Ÿพโ€โ™‚", "๐Ÿง”๐Ÿฟโ€โ™‚", "๐Ÿ‘ต", "๐Ÿ‘ต๐Ÿป", "๐Ÿ‘ต๐Ÿผ", "๐Ÿ‘ต๐Ÿฝ", "๐Ÿ‘ต๐Ÿพ", "๐Ÿ‘ต๐Ÿฟ", "๐Ÿง“", "๐Ÿง“๐Ÿป", "๐Ÿง“๐Ÿผ", "๐Ÿง“๐Ÿฝ", "๐Ÿง“๐Ÿพ", "๐Ÿง“๐Ÿฟ", "๐Ÿ‘ด", "๐Ÿ‘ด๐Ÿป", "๐Ÿ‘ด๐Ÿผ", "๐Ÿ‘ด๐Ÿฝ", "๐Ÿ‘ด๐Ÿพ", "๐Ÿ‘ด๐Ÿฟ", "๐Ÿ‘ฒ", "๐Ÿ‘ฒ๐Ÿป", "๐Ÿ‘ฒ๐Ÿผ", "๐Ÿ‘ฒ๐Ÿฝ", "๐Ÿ‘ฒ๐Ÿพ", "๐Ÿ‘ฒ๐Ÿฟ", "๐Ÿ‘ณโ€โ™€", "๐Ÿ‘ณ๐Ÿปโ€โ™€", "๐Ÿ‘ณ๐Ÿผโ€โ™€", "๐Ÿ‘ณ๐Ÿฝโ€โ™€", "๐Ÿ‘ณ๐Ÿพโ€โ™€", "๐Ÿ‘ณ๐Ÿฟโ€โ™€", "๐Ÿ‘ณ", "๐Ÿ‘ณ๐Ÿป", "๐Ÿ‘ณ๐Ÿผ", "๐Ÿ‘ณ๐Ÿฝ", "๐Ÿ‘ณ๐Ÿพ", "๐Ÿ‘ณ๐Ÿฟ", "๐Ÿ‘ณโ€โ™‚", "๐Ÿ‘ณ๐Ÿปโ€โ™‚", "๐Ÿ‘ณ๐Ÿผโ€โ™‚", "๐Ÿ‘ณ๐Ÿฝโ€โ™‚", "๐Ÿ‘ณ๐Ÿพโ€โ™‚", "๐Ÿ‘ณ๐Ÿฟโ€โ™‚", "๐Ÿง•", "๐Ÿง•๐Ÿป", "๐Ÿง•๐Ÿผ", "๐Ÿง•๐Ÿฝ", "๐Ÿง•๐Ÿพ", "๐Ÿง•๐Ÿฟ", "๐Ÿ‘ฎโ€โ™€", "๐Ÿ‘ฎ๐Ÿปโ€โ™€", "๐Ÿ‘ฎ๐Ÿผโ€โ™€", "๐Ÿ‘ฎ๐Ÿฝโ€โ™€", "๐Ÿ‘ฎ๐Ÿพโ€โ™€", "๐Ÿ‘ฎ๐Ÿฟโ€โ™€", "๐Ÿ‘ฎ", "๐Ÿ‘ฎ๐Ÿป", "๐Ÿ‘ฎ๐Ÿผ", "๐Ÿ‘ฎ๐Ÿฝ", "๐Ÿ‘ฎ๐Ÿพ", "๐Ÿ‘ฎ๐Ÿฟ", "๐Ÿ‘ฎโ€โ™‚", "๐Ÿ‘ฎ๐Ÿปโ€โ™‚", "๐Ÿ‘ฎ๐Ÿผโ€โ™‚", "๐Ÿ‘ฎ๐Ÿฝโ€โ™‚", "๐Ÿ‘ฎ๐Ÿพโ€โ™‚", "๐Ÿ‘ฎ๐Ÿฟโ€โ™‚", "๐Ÿ‘ทโ€โ™€", "๐Ÿ‘ท๐Ÿปโ€โ™€", "๐Ÿ‘ท๐Ÿผโ€โ™€", "๐Ÿ‘ท๐Ÿฝโ€โ™€", "๐Ÿ‘ท๐Ÿพโ€โ™€", "๐Ÿ‘ท๐Ÿฟโ€โ™€", "๐Ÿ‘ท", "๐Ÿ‘ท๐Ÿป", "๐Ÿ‘ท๐Ÿผ", "๐Ÿ‘ท๐Ÿฝ", "๐Ÿ‘ท๐Ÿพ", "๐Ÿ‘ท๐Ÿฟ", "๐Ÿ‘ทโ€โ™‚", "๐Ÿ‘ท๐Ÿปโ€โ™‚", "๐Ÿ‘ท๐Ÿผโ€โ™‚", "๐Ÿ‘ท๐Ÿฝโ€โ™‚", "๐Ÿ‘ท๐Ÿพโ€โ™‚", "๐Ÿ‘ท๐Ÿฟโ€โ™‚", "๐Ÿ’‚โ€โ™€", "๐Ÿ’‚๐Ÿปโ€โ™€", "๐Ÿ’‚๐Ÿผโ€โ™€", "๐Ÿ’‚๐Ÿฝโ€โ™€", "๐Ÿ’‚๐Ÿพโ€โ™€", "๐Ÿ’‚๐Ÿฟโ€โ™€", "๐Ÿ’‚", "๐Ÿ’‚๐Ÿป", "๐Ÿ’‚๐Ÿผ", "๐Ÿ’‚๐Ÿฝ", "๐Ÿ’‚๐Ÿพ", "๐Ÿ’‚๐Ÿฟ", "๐Ÿ’‚โ€โ™‚", "๐Ÿ’‚๐Ÿปโ€โ™‚", "๐Ÿ’‚๐Ÿผโ€โ™‚", "๐Ÿ’‚๐Ÿฝโ€โ™‚", "๐Ÿ’‚๐Ÿพโ€โ™‚", "๐Ÿ’‚๐Ÿฟโ€โ™‚", "๐Ÿ•ตโ€โ™€", "๐Ÿ•ต๐Ÿปโ€โ™€", "๐Ÿ•ต๐Ÿผโ€โ™€", "๐Ÿ•ต๐Ÿฝโ€โ™€", "๐Ÿ•ต๐Ÿพโ€โ™€", "๐Ÿ•ต๐Ÿฟโ€โ™€", "๐Ÿ•ต", "๐Ÿ•ต๐Ÿป", "๐Ÿ•ต๐Ÿผ", "๐Ÿ•ต๐Ÿฝ", "๐Ÿ•ต๐Ÿพ", "๐Ÿ•ต๐Ÿฟ", "๐Ÿ•ตโ€โ™‚", "๐Ÿ•ต๐Ÿปโ€โ™‚", "๐Ÿ•ต๐Ÿผโ€โ™‚", "๐Ÿ•ต๐Ÿฝโ€โ™‚", "๐Ÿ•ต๐Ÿพโ€โ™‚", "๐Ÿ•ต๐Ÿฟโ€โ™‚", "๐Ÿ‘ฉโ€โš•", "๐Ÿ‘ฉ๐Ÿปโ€โš•", "๐Ÿ‘ฉ๐Ÿผโ€โš•", "๐Ÿ‘ฉ๐Ÿฝโ€โš•", "๐Ÿ‘ฉ๐Ÿพโ€โš•", "๐Ÿ‘ฉ๐Ÿฟโ€โš•", "๐Ÿง‘โ€โš•", "๐Ÿง‘๐Ÿปโ€โš•", "๐Ÿง‘๐Ÿผโ€โš•", "๐Ÿง‘๐Ÿฝโ€โš•", "๐Ÿง‘๐Ÿพโ€โš•", "๐Ÿง‘๐Ÿฟโ€โš•", "๐Ÿ‘จโ€โš•", "๐Ÿ‘จ๐Ÿปโ€โš•", "๐Ÿ‘จ๐Ÿผโ€โš•", "๐Ÿ‘จ๐Ÿฝโ€โš•", "๐Ÿ‘จ๐Ÿพโ€โš•", "๐Ÿ‘จ๐Ÿฟโ€โš•", "๐Ÿ‘ฉโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŒพ", "๐Ÿง‘โ€๐ŸŒพ", "๐Ÿง‘๐Ÿปโ€๐ŸŒพ", "๐Ÿง‘๐Ÿผโ€๐ŸŒพ", "๐Ÿง‘๐Ÿฝโ€๐ŸŒพ", "๐Ÿง‘๐Ÿพโ€๐ŸŒพ", "๐Ÿง‘๐Ÿฟโ€๐ŸŒพ", "๐Ÿ‘จโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿปโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿผโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿฝโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿพโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿฟโ€๐ŸŒพ", "๐Ÿ‘ฉโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿณ", "๐Ÿง‘โ€๐Ÿณ", "๐Ÿง‘๐Ÿปโ€๐Ÿณ", "๐Ÿง‘๐Ÿผโ€๐Ÿณ", "๐Ÿง‘๐Ÿฝโ€๐Ÿณ", "๐Ÿง‘๐Ÿพโ€๐Ÿณ", "๐Ÿง‘๐Ÿฟโ€๐Ÿณ", "๐Ÿ‘จโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿณ", "๐Ÿ‘ฉโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽ“", "๐Ÿง‘โ€๐ŸŽ“", "๐Ÿง‘๐Ÿปโ€๐ŸŽ“", "๐Ÿง‘๐Ÿผโ€๐ŸŽ“", "๐Ÿง‘๐Ÿฝโ€๐ŸŽ“", "๐Ÿง‘๐Ÿพโ€๐ŸŽ“", "๐Ÿง‘๐Ÿฟโ€๐ŸŽ“", "๐Ÿ‘จโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿปโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿผโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿฝโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿพโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿฟโ€๐ŸŽ“", "๐Ÿ‘ฉโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽค", "๐Ÿง‘โ€๐ŸŽค", "๐Ÿง‘๐Ÿปโ€๐ŸŽค", "๐Ÿง‘๐Ÿผโ€๐ŸŽค", "๐Ÿง‘๐Ÿฝโ€๐ŸŽค", "๐Ÿง‘๐Ÿพโ€๐ŸŽค", "๐Ÿง‘๐Ÿฟโ€๐ŸŽค", "๐Ÿ‘จโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿปโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿผโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿฝโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿพโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿฟโ€๐ŸŽค", "๐Ÿ‘ฉโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿซ", "๐Ÿง‘โ€๐Ÿซ", "๐Ÿง‘๐Ÿปโ€๐Ÿซ", "๐Ÿง‘๐Ÿผโ€๐Ÿซ", "๐Ÿง‘๐Ÿฝโ€๐Ÿซ", "๐Ÿง‘๐Ÿพโ€๐Ÿซ", "๐Ÿง‘๐Ÿฟโ€๐Ÿซ", "๐Ÿ‘จโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿซ", "๐Ÿ‘ฉโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿญ", "๐Ÿง‘โ€๐Ÿญ", "๐Ÿง‘๐Ÿปโ€๐Ÿญ", "๐Ÿง‘๐Ÿผโ€๐Ÿญ", "๐Ÿง‘๐Ÿฝโ€๐Ÿญ", "๐Ÿง‘๐Ÿพโ€๐Ÿญ", "๐Ÿง‘๐Ÿฟโ€๐Ÿญ", "๐Ÿ‘จโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿญ", "๐Ÿ‘ฉโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ป", "๐Ÿง‘โ€๐Ÿ’ป", "๐Ÿง‘๐Ÿปโ€๐Ÿ’ป", "๐Ÿง‘๐Ÿผโ€๐Ÿ’ป", "๐Ÿง‘๐Ÿฝโ€๐Ÿ’ป", "๐Ÿง‘๐Ÿพโ€๐Ÿ’ป", "๐Ÿง‘๐Ÿฟโ€๐Ÿ’ป", "๐Ÿ‘จโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ป", "๐Ÿ‘ฉโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ผ", "๐Ÿง‘โ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿปโ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿผโ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿฝโ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿพโ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿฟโ€๐Ÿ’ผ", "๐Ÿ‘จโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ผ", "๐Ÿ‘ฉโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ง", "๐Ÿง‘โ€๐Ÿ”ง", "๐Ÿง‘๐Ÿปโ€๐Ÿ”ง", "๐Ÿง‘๐Ÿผโ€๐Ÿ”ง", "๐Ÿง‘๐Ÿฝโ€๐Ÿ”ง", "๐Ÿง‘๐Ÿพโ€๐Ÿ”ง", "๐Ÿง‘๐Ÿฟโ€๐Ÿ”ง", "๐Ÿ‘จโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ง", "๐Ÿ‘ฉโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ฌ", "๐Ÿง‘โ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿปโ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿผโ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿฝโ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿพโ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿฟโ€๐Ÿ”ฌ", "๐Ÿ‘จโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ฌ", "๐Ÿ‘ฉโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽจ", "๐Ÿง‘โ€๐ŸŽจ", "๐Ÿง‘๐Ÿปโ€๐ŸŽจ", "๐Ÿง‘๐Ÿผโ€๐ŸŽจ", "๐Ÿง‘๐Ÿฝโ€๐ŸŽจ", "๐Ÿง‘๐Ÿพโ€๐ŸŽจ", "๐Ÿง‘๐Ÿฟโ€๐ŸŽจ", "๐Ÿ‘จโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿผโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿฝโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿพโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿฟโ€๐ŸŽจ", "๐Ÿ‘ฉโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš’", "๐Ÿง‘โ€๐Ÿš’", "๐Ÿง‘๐Ÿปโ€๐Ÿš’", "๐Ÿง‘๐Ÿผโ€๐Ÿš’", "๐Ÿง‘๐Ÿฝโ€๐Ÿš’", "๐Ÿง‘๐Ÿพโ€๐Ÿš’", "๐Ÿง‘๐Ÿฟโ€๐Ÿš’", "๐Ÿ‘จโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿปโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿผโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿพโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿš’", "๐Ÿ‘ฉโ€โœˆ", "๐Ÿ‘ฉ๐Ÿปโ€โœˆ", "๐Ÿ‘ฉ๐Ÿผโ€โœˆ", "๐Ÿ‘ฉ๐Ÿฝโ€โœˆ", "๐Ÿ‘ฉ๐Ÿพโ€โœˆ", "๐Ÿ‘ฉ๐Ÿฟโ€โœˆ", "๐Ÿง‘โ€โœˆ", "๐Ÿง‘๐Ÿปโ€โœˆ", "๐Ÿง‘๐Ÿผโ€โœˆ", "๐Ÿง‘๐Ÿฝโ€โœˆ", "๐Ÿง‘๐Ÿพโ€โœˆ", "๐Ÿง‘๐Ÿฟโ€โœˆ", "๐Ÿ‘จโ€โœˆ", "๐Ÿ‘จ๐Ÿปโ€โœˆ", "๐Ÿ‘จ๐Ÿผโ€โœˆ", "๐Ÿ‘จ๐Ÿฝโ€โœˆ", "๐Ÿ‘จ๐Ÿพโ€โœˆ", "๐Ÿ‘จ๐Ÿฟโ€โœˆ", "๐Ÿ‘ฉโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš€", "๐Ÿง‘โ€๐Ÿš€", "๐Ÿง‘๐Ÿปโ€๐Ÿš€", "๐Ÿง‘๐Ÿผโ€๐Ÿš€", "๐Ÿง‘๐Ÿฝโ€๐Ÿš€", "๐Ÿง‘๐Ÿพโ€๐Ÿš€", "๐Ÿง‘๐Ÿฟโ€๐Ÿš€", "๐Ÿ‘จโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿปโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿผโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿพโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿš€", "๐Ÿ‘ฉโ€โš–", "๐Ÿ‘ฉ๐Ÿปโ€โš–", "๐Ÿ‘ฉ๐Ÿผโ€โš–", "๐Ÿ‘ฉ๐Ÿฝโ€โš–", "๐Ÿ‘ฉ๐Ÿพโ€โš–", "๐Ÿ‘ฉ๐Ÿฟโ€โš–", "๐Ÿง‘โ€โš–", "๐Ÿง‘๐Ÿปโ€โš–", "๐Ÿง‘๐Ÿผโ€โš–", "๐Ÿง‘๐Ÿฝโ€โš–", "๐Ÿง‘๐Ÿพโ€โš–", "๐Ÿง‘๐Ÿฟโ€โš–", "๐Ÿ‘จโ€โš–", "๐Ÿ‘จ๐Ÿปโ€โš–", "๐Ÿ‘จ๐Ÿผโ€โš–", "๐Ÿ‘จ๐Ÿฝโ€โš–", "๐Ÿ‘จ๐Ÿพโ€โš–", "๐Ÿ‘จ๐Ÿฟโ€โš–", "๐Ÿ‘ฐโ€โ™€", "๐Ÿ‘ฐ๐Ÿปโ€โ™€", "๐Ÿ‘ฐ๐Ÿผโ€โ™€", "๐Ÿ‘ฐ๐Ÿฝโ€โ™€", "๐Ÿ‘ฐ๐Ÿพโ€โ™€", "๐Ÿ‘ฐ๐Ÿฟโ€โ™€", "๐Ÿ‘ฐ", "๐Ÿ‘ฐ๐Ÿป", "๐Ÿ‘ฐ๐Ÿผ", "๐Ÿ‘ฐ๐Ÿฝ", "๐Ÿ‘ฐ๐Ÿพ", "๐Ÿ‘ฐ๐Ÿฟ", "๐Ÿ‘ฐโ€โ™‚", "๐Ÿ‘ฐ๐Ÿปโ€โ™‚", "๐Ÿ‘ฐ๐Ÿผโ€โ™‚", "๐Ÿ‘ฐ๐Ÿฝโ€โ™‚", "๐Ÿ‘ฐ๐Ÿพโ€โ™‚", "๐Ÿ‘ฐ๐Ÿฟโ€โ™‚", "๐Ÿคตโ€โ™€", "๐Ÿคต๐Ÿปโ€โ™€", "๐Ÿคต๐Ÿผโ€โ™€", "๐Ÿคต๐Ÿฝโ€โ™€", "๐Ÿคต๐Ÿพโ€โ™€", "๐Ÿคต๐Ÿฟโ€โ™€", "๐Ÿคต", "๐Ÿคต๐Ÿป", "๐Ÿคต๐Ÿผ", "๐Ÿคต๐Ÿฝ", "๐Ÿคต๐Ÿพ", "๐Ÿคต๐Ÿฟ", "๐Ÿคตโ€โ™‚", "๐Ÿคต๐Ÿปโ€โ™‚", "๐Ÿคต๐Ÿผโ€โ™‚", "๐Ÿคต๐Ÿฝโ€โ™‚", "๐Ÿคต๐Ÿพโ€โ™‚", "๐Ÿคต๐Ÿฟโ€โ™‚", "๐Ÿ‘ธ", "๐Ÿ‘ธ๐Ÿป", "๐Ÿ‘ธ๐Ÿผ", "๐Ÿ‘ธ๐Ÿฝ", "๐Ÿ‘ธ๐Ÿพ", "๐Ÿ‘ธ๐Ÿฟ", "๐Ÿซ…", "๐Ÿซ…๐Ÿป", "๐Ÿซ…๐Ÿผ", "๐Ÿซ…๐Ÿฝ", "๐Ÿซ…๐Ÿพ", "๐Ÿซ…๐Ÿฟ", "๐Ÿคด", "๐Ÿคด๐Ÿป", "๐Ÿคด๐Ÿผ", "๐Ÿคด๐Ÿฝ", "๐Ÿคด๐Ÿพ", "๐Ÿคด๐Ÿฟ", "๐Ÿฅท", "๐Ÿฅท๐Ÿป", "๐Ÿฅท๐Ÿผ", "๐Ÿฅท๐Ÿฝ", "๐Ÿฅท๐Ÿพ", "๐Ÿฅท๐Ÿฟ", "๐Ÿฆธโ€โ™€", "๐Ÿฆธ๐Ÿปโ€โ™€", "๐Ÿฆธ๐Ÿผโ€โ™€", "๐Ÿฆธ๐Ÿฝโ€โ™€", "๐Ÿฆธ๐Ÿพโ€โ™€", "๐Ÿฆธ๐Ÿฟโ€โ™€", "๐Ÿฆธ", "๐Ÿฆธ๐Ÿป", "๐Ÿฆธ๐Ÿผ", "๐Ÿฆธ๐Ÿฝ", "๐Ÿฆธ๐Ÿพ", "๐Ÿฆธ๐Ÿฟ", "๐Ÿฆธโ€โ™‚", "๐Ÿฆธ๐Ÿปโ€โ™‚", "๐Ÿฆธ๐Ÿผโ€โ™‚", "๐Ÿฆธ๐Ÿฝโ€โ™‚", "๐Ÿฆธ๐Ÿพโ€โ™‚", "๐Ÿฆธ๐Ÿฟโ€โ™‚", "๐Ÿฆนโ€โ™€", "๐Ÿฆน๐Ÿปโ€โ™€", "๐Ÿฆน๐Ÿผโ€โ™€", "๐Ÿฆน๐Ÿฝโ€โ™€", "๐Ÿฆน๐Ÿพโ€โ™€", "๐Ÿฆน๐Ÿฟโ€โ™€", "๐Ÿฆน", "๐Ÿฆน๐Ÿป", "๐Ÿฆน๐Ÿผ", "๐Ÿฆน๐Ÿฝ", "๐Ÿฆน๐Ÿพ", "๐Ÿฆน๐Ÿฟ", "๐Ÿฆนโ€โ™‚", "๐Ÿฆน๐Ÿปโ€โ™‚", "๐Ÿฆน๐Ÿผโ€โ™‚", "๐Ÿฆน๐Ÿฝโ€โ™‚", "๐Ÿฆน๐Ÿพโ€โ™‚", "๐Ÿฆน๐Ÿฟโ€โ™‚", "๐Ÿคถ", "๐Ÿคถ๐Ÿป", "๐Ÿคถ๐Ÿผ", "๐Ÿคถ๐Ÿฝ", "๐Ÿคถ๐Ÿพ", "๐Ÿคถ๐Ÿฟ", "๐Ÿง‘โ€๐ŸŽ„", "๐Ÿง‘๐Ÿปโ€๐ŸŽ„", "๐Ÿง‘๐Ÿผโ€๐ŸŽ„", "๐Ÿง‘๐Ÿฝโ€๐ŸŽ„", "๐Ÿง‘๐Ÿพโ€๐ŸŽ„", "๐Ÿง‘๐Ÿฟโ€๐ŸŽ„", "๐ŸŽ…", "๐ŸŽ…๐Ÿป", "๐ŸŽ…๐Ÿผ", "๐ŸŽ…๐Ÿฝ", "๐ŸŽ…๐Ÿพ", "๐ŸŽ…๐Ÿฟ", "๐Ÿง™โ€โ™€", "๐Ÿง™๐Ÿปโ€โ™€", "๐Ÿง™๐Ÿผโ€โ™€", "๐Ÿง™๐Ÿฝโ€โ™€", "๐Ÿง™๐Ÿพโ€โ™€", "๐Ÿง™๐Ÿฟโ€โ™€", "๐Ÿง™", "๐Ÿง™๐Ÿป", "๐Ÿง™๐Ÿผ", "๐Ÿง™๐Ÿฝ", "๐Ÿง™๐Ÿพ", "๐Ÿง™๐Ÿฟ", "๐Ÿง™โ€โ™‚", "๐Ÿง™๐Ÿปโ€โ™‚", "๐Ÿง™๐Ÿผโ€โ™‚", "๐Ÿง™๐Ÿฝโ€โ™‚", "๐Ÿง™๐Ÿพโ€โ™‚", "๐Ÿง™๐Ÿฟโ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง๐Ÿปโ€โ™€", "๐Ÿง๐Ÿผโ€โ™€", "๐Ÿง๐Ÿฝโ€โ™€", "๐Ÿง๐Ÿพโ€โ™€", "๐Ÿง๐Ÿฟโ€โ™€", "๐Ÿง", "๐Ÿง๐Ÿป", "๐Ÿง๐Ÿผ", "๐Ÿง๐Ÿฝ", "๐Ÿง๐Ÿพ", "๐Ÿง๐Ÿฟ", "๐Ÿงโ€โ™‚", "๐Ÿง๐Ÿปโ€โ™‚", "๐Ÿง๐Ÿผโ€โ™‚", "๐Ÿง๐Ÿฝโ€โ™‚", "๐Ÿง๐Ÿพโ€โ™‚", "๐Ÿง๐Ÿฟโ€โ™‚", "๐ŸงŒ", "๐Ÿง›โ€โ™€", "๐Ÿง›๐Ÿปโ€โ™€", "๐Ÿง›๐Ÿผโ€โ™€", "๐Ÿง›๐Ÿฝโ€โ™€", "๐Ÿง›๐Ÿพโ€โ™€", "๐Ÿง›๐Ÿฟโ€โ™€", "๐Ÿง›", "๐Ÿง›๐Ÿป", "๐Ÿง›๐Ÿผ", "๐Ÿง›๐Ÿฝ", "๐Ÿง›๐Ÿพ", "๐Ÿง›๐Ÿฟ", "๐Ÿง›โ€โ™‚", "๐Ÿง›๐Ÿปโ€โ™‚", "๐Ÿง›๐Ÿผโ€โ™‚", "๐Ÿง›๐Ÿฝโ€โ™‚", "๐Ÿง›๐Ÿพโ€โ™‚", "๐Ÿง›๐Ÿฟโ€โ™‚", "๐ŸงŸโ€โ™€", "๐ŸงŸ", "๐ŸงŸโ€โ™‚", "๐Ÿงžโ€โ™€", "๐Ÿงž", "๐Ÿงžโ€โ™‚", "๐Ÿงœโ€โ™€", "๐Ÿงœ๐Ÿปโ€โ™€", "๐Ÿงœ๐Ÿผโ€โ™€", "๐Ÿงœ๐Ÿฝโ€โ™€", "๐Ÿงœ๐Ÿพโ€โ™€", "๐Ÿงœ๐Ÿฟโ€โ™€", "๐Ÿงœ", "๐Ÿงœ๐Ÿป", "๐Ÿงœ๐Ÿผ", "๐Ÿงœ๐Ÿฝ", "๐Ÿงœ๐Ÿพ", "๐Ÿงœ๐Ÿฟ", "๐Ÿงœโ€โ™‚", "๐Ÿงœ๐Ÿปโ€โ™‚", "๐Ÿงœ๐Ÿผโ€โ™‚", "๐Ÿงœ๐Ÿฝโ€โ™‚", "๐Ÿงœ๐Ÿพโ€โ™‚", "๐Ÿงœ๐Ÿฟโ€โ™‚", "๐Ÿงšโ€โ™€", "๐Ÿงš๐Ÿปโ€โ™€", "๐Ÿงš๐Ÿผโ€โ™€", "๐Ÿงš๐Ÿฝโ€โ™€", "๐Ÿงš๐Ÿพโ€โ™€", "๐Ÿงš๐Ÿฟโ€โ™€", "๐Ÿงš", "๐Ÿงš๐Ÿป", "๐Ÿงš๐Ÿผ", "๐Ÿงš๐Ÿฝ", "๐Ÿงš๐Ÿพ", "๐Ÿงš๐Ÿฟ", "๐Ÿงšโ€โ™‚", "๐Ÿงš๐Ÿปโ€โ™‚", "๐Ÿงš๐Ÿผโ€โ™‚", "๐Ÿงš๐Ÿฝโ€โ™‚", "๐Ÿงš๐Ÿพโ€โ™‚", "๐Ÿงš๐Ÿฟโ€โ™‚", "๐Ÿ‘ผ", "๐Ÿ‘ผ๐Ÿป", "๐Ÿ‘ผ๐Ÿผ", "๐Ÿ‘ผ๐Ÿฝ", "๐Ÿ‘ผ๐Ÿพ", "๐Ÿ‘ผ๐Ÿฟ", "๐Ÿคฐ", "๐Ÿคฐ๐Ÿป", "๐Ÿคฐ๐Ÿผ", "๐Ÿคฐ๐Ÿฝ", "๐Ÿคฐ๐Ÿพ", "๐Ÿคฐ๐Ÿฟ", "๐Ÿซ„", "๐Ÿซ„๐Ÿป", "๐Ÿซ„๐Ÿผ", "๐Ÿซ„๐Ÿฝ", "๐Ÿซ„๐Ÿพ", "๐Ÿซ„๐Ÿฟ", "๐Ÿซƒ", "๐Ÿซƒ๐Ÿป", "๐Ÿซƒ๐Ÿผ", "๐Ÿซƒ๐Ÿฝ", "๐Ÿซƒ๐Ÿพ", "๐Ÿซƒ๐Ÿฟ", "๐Ÿคฑ", "๐Ÿคฑ๐Ÿป", "๐Ÿคฑ๐Ÿผ", "๐Ÿคฑ๐Ÿฝ", "๐Ÿคฑ๐Ÿพ", "๐Ÿคฑ๐Ÿฟ", "๐Ÿ‘ฉโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿผ", "๐Ÿง‘โ€๐Ÿผ", "๐Ÿง‘๐Ÿปโ€๐Ÿผ", "๐Ÿง‘๐Ÿผโ€๐Ÿผ", "๐Ÿง‘๐Ÿฝโ€๐Ÿผ", "๐Ÿง‘๐Ÿพโ€๐Ÿผ", "๐Ÿง‘๐Ÿฟโ€๐Ÿผ", "๐Ÿ‘จโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿผ", "๐Ÿ™‡โ€โ™€", "๐Ÿ™‡๐Ÿปโ€โ™€", "๐Ÿ™‡๐Ÿผโ€โ™€", "๐Ÿ™‡๐Ÿฝโ€โ™€", "๐Ÿ™‡๐Ÿพโ€โ™€", "๐Ÿ™‡๐Ÿฟโ€โ™€", "๐Ÿ™‡", "๐Ÿ™‡๐Ÿป", "๐Ÿ™‡๐Ÿผ", "๐Ÿ™‡๐Ÿฝ", "๐Ÿ™‡๐Ÿพ", "๐Ÿ™‡๐Ÿฟ", "๐Ÿ™‡โ€โ™‚", "๐Ÿ™‡๐Ÿปโ€โ™‚", "๐Ÿ™‡๐Ÿผโ€โ™‚", "๐Ÿ™‡๐Ÿฝโ€โ™‚", "๐Ÿ™‡๐Ÿพโ€โ™‚", "๐Ÿ™‡๐Ÿฟโ€โ™‚", "๐Ÿ’โ€โ™€", "๐Ÿ’๐Ÿปโ€โ™€", "๐Ÿ’๐Ÿผโ€โ™€", "๐Ÿ’๐Ÿฝโ€โ™€", "๐Ÿ’๐Ÿพโ€โ™€", "๐Ÿ’๐Ÿฟโ€โ™€", "๐Ÿ’", "๐Ÿ’๐Ÿป", "๐Ÿ’๐Ÿผ", "๐Ÿ’๐Ÿฝ", "๐Ÿ’๐Ÿพ", "๐Ÿ’๐Ÿฟ", "๐Ÿ’โ€โ™‚", "๐Ÿ’๐Ÿปโ€โ™‚", "๐Ÿ’๐Ÿผโ€โ™‚", "๐Ÿ’๐Ÿฝโ€โ™‚", "๐Ÿ’๐Ÿพโ€โ™‚", "๐Ÿ’๐Ÿฟโ€โ™‚", "๐Ÿ™…โ€โ™€", "๐Ÿ™…๐Ÿปโ€โ™€", "๐Ÿ™…๐Ÿผโ€โ™€", "๐Ÿ™…๐Ÿฝโ€โ™€", "๐Ÿ™…๐Ÿพโ€โ™€", "๐Ÿ™…๐Ÿฟโ€โ™€", "๐Ÿ™…", "๐Ÿ™…๐Ÿป", "๐Ÿ™…๐Ÿผ", "๐Ÿ™…๐Ÿฝ", "๐Ÿ™…๐Ÿพ", "๐Ÿ™…๐Ÿฟ", "๐Ÿ™…โ€โ™‚", "๐Ÿ™…๐Ÿปโ€โ™‚", "๐Ÿ™…๐Ÿผโ€โ™‚", "๐Ÿ™…๐Ÿฝโ€โ™‚", "๐Ÿ™…๐Ÿพโ€โ™‚", "๐Ÿ™…๐Ÿฟโ€โ™‚", "๐Ÿ™†โ€โ™€", "๐Ÿ™†๐Ÿปโ€โ™€", "๐Ÿ™†๐Ÿผโ€โ™€", "๐Ÿ™†๐Ÿฝโ€โ™€", "๐Ÿ™†๐Ÿพโ€โ™€", "๐Ÿ™†๐Ÿฟโ€โ™€", "๐Ÿ™†", "๐Ÿ™†๐Ÿป", "๐Ÿ™†๐Ÿผ", "๐Ÿ™†๐Ÿฝ", "๐Ÿ™†๐Ÿพ", "๐Ÿ™†๐Ÿฟ", "๐Ÿ™†โ€โ™‚", "๐Ÿ™†๐Ÿปโ€โ™‚", "๐Ÿ™†๐Ÿผโ€โ™‚", "๐Ÿ™†๐Ÿฝโ€โ™‚", "๐Ÿ™†๐Ÿพโ€โ™‚", "๐Ÿ™†๐Ÿฟโ€โ™‚", "๐Ÿ™‹โ€โ™€", "๐Ÿ™‹๐Ÿปโ€โ™€", "๐Ÿ™‹๐Ÿผโ€โ™€", "๐Ÿ™‹๐Ÿฝโ€โ™€", "๐Ÿ™‹๐Ÿพโ€โ™€", "๐Ÿ™‹๐Ÿฟโ€โ™€", "๐Ÿ™‹", "๐Ÿ™‹๐Ÿป", "๐Ÿ™‹๐Ÿผ", "๐Ÿ™‹๐Ÿฝ", "๐Ÿ™‹๐Ÿพ", "๐Ÿ™‹๐Ÿฟ", "๐Ÿ™‹โ€โ™‚", "๐Ÿ™‹๐Ÿปโ€โ™‚", "๐Ÿ™‹๐Ÿผโ€โ™‚", "๐Ÿ™‹๐Ÿฝโ€โ™‚", "๐Ÿ™‹๐Ÿพโ€โ™‚", "๐Ÿ™‹๐Ÿฟโ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง๐Ÿปโ€โ™€", "๐Ÿง๐Ÿผโ€โ™€", "๐Ÿง๐Ÿฝโ€โ™€", "๐Ÿง๐Ÿพโ€โ™€", "๐Ÿง๐Ÿฟโ€โ™€", "๐Ÿง", "๐Ÿง๐Ÿป", "๐Ÿง๐Ÿผ", "๐Ÿง๐Ÿฝ", "๐Ÿง๐Ÿพ", "๐Ÿง๐Ÿฟ", "๐Ÿงโ€โ™‚", "๐Ÿง๐Ÿปโ€โ™‚", "๐Ÿง๐Ÿผโ€โ™‚", "๐Ÿง๐Ÿฝโ€โ™‚", "๐Ÿง๐Ÿพโ€โ™‚", "๐Ÿง๐Ÿฟโ€โ™‚", "๐Ÿคฆโ€โ™€", "๐Ÿคฆ๐Ÿปโ€โ™€", "๐Ÿคฆ๐Ÿผโ€โ™€", "๐Ÿคฆ๐Ÿฝโ€โ™€", "๐Ÿคฆ๐Ÿพโ€โ™€", "๐Ÿคฆ๐Ÿฟโ€โ™€", "๐Ÿคฆ", "๐Ÿคฆ๐Ÿป", "๐Ÿคฆ๐Ÿผ", "๐Ÿคฆ๐Ÿฝ", "๐Ÿคฆ๐Ÿพ", "๐Ÿคฆ๐Ÿฟ", "๐Ÿคฆโ€โ™‚", "๐Ÿคฆ๐Ÿปโ€โ™‚", "๐Ÿคฆ๐Ÿผโ€โ™‚", "๐Ÿคฆ๐Ÿฝโ€โ™‚", "๐Ÿคฆ๐Ÿพโ€โ™‚", "๐Ÿคฆ๐Ÿฟโ€โ™‚", "๐Ÿคทโ€โ™€", "๐Ÿคท๐Ÿปโ€โ™€", "๐Ÿคท๐Ÿผโ€โ™€", "๐Ÿคท๐Ÿฝโ€โ™€", "๐Ÿคท๐Ÿพโ€โ™€", "๐Ÿคท๐Ÿฟโ€โ™€", "๐Ÿคท", "๐Ÿคท๐Ÿป", "๐Ÿคท๐Ÿผ", "๐Ÿคท๐Ÿฝ", "๐Ÿคท๐Ÿพ", "๐Ÿคท๐Ÿฟ", "๐Ÿคทโ€โ™‚", "๐Ÿคท๐Ÿปโ€โ™‚", "๐Ÿคท๐Ÿผโ€โ™‚", "๐Ÿคท๐Ÿฝโ€โ™‚", "๐Ÿคท๐Ÿพโ€โ™‚", "๐Ÿคท๐Ÿฟโ€โ™‚", "๐Ÿ™Žโ€โ™€", "๐Ÿ™Ž๐Ÿปโ€โ™€", "๐Ÿ™Ž๐Ÿผโ€โ™€", "๐Ÿ™Ž๐Ÿฝโ€โ™€", "๐Ÿ™Ž๐Ÿพโ€โ™€", "๐Ÿ™Ž๐Ÿฟโ€โ™€", "๐Ÿ™Ž", "๐Ÿ™Ž๐Ÿป", "๐Ÿ™Ž๐Ÿผ", "๐Ÿ™Ž๐Ÿฝ", "๐Ÿ™Ž๐Ÿพ", "๐Ÿ™Ž๐Ÿฟ", "๐Ÿ™Žโ€โ™‚", "๐Ÿ™Ž๐Ÿปโ€โ™‚", "๐Ÿ™Ž๐Ÿผโ€โ™‚", "๐Ÿ™Ž๐Ÿฝโ€โ™‚", "๐Ÿ™Ž๐Ÿพโ€โ™‚", "๐Ÿ™Ž๐Ÿฟโ€โ™‚", "๐Ÿ™โ€โ™€", "๐Ÿ™๐Ÿปโ€โ™€", "๐Ÿ™๐Ÿผโ€โ™€", "๐Ÿ™๐Ÿฝโ€โ™€", "๐Ÿ™๐Ÿพโ€โ™€", "๐Ÿ™๐Ÿฟโ€โ™€", "๐Ÿ™", "๐Ÿ™๐Ÿป", "๐Ÿ™๐Ÿผ", "๐Ÿ™๐Ÿฝ", "๐Ÿ™๐Ÿพ", "๐Ÿ™๐Ÿฟ", "๐Ÿ™โ€โ™‚", "๐Ÿ™๐Ÿปโ€โ™‚", "๐Ÿ™๐Ÿผโ€โ™‚", "๐Ÿ™๐Ÿฝโ€โ™‚", "๐Ÿ™๐Ÿพโ€โ™‚", "๐Ÿ™๐Ÿฟโ€โ™‚", "๐Ÿ’‡โ€โ™€", "๐Ÿ’‡๐Ÿปโ€โ™€", "๐Ÿ’‡๐Ÿผโ€โ™€", "๐Ÿ’‡๐Ÿฝโ€โ™€", "๐Ÿ’‡๐Ÿพโ€โ™€", "๐Ÿ’‡๐Ÿฟโ€โ™€", "๐Ÿ’‡", "๐Ÿ’‡๐Ÿป", "๐Ÿ’‡๐Ÿผ", "๐Ÿ’‡๐Ÿฝ", "๐Ÿ’‡๐Ÿพ", "๐Ÿ’‡๐Ÿฟ", "๐Ÿ’‡โ€โ™‚", "๐Ÿ’‡๐Ÿปโ€โ™‚", "๐Ÿ’‡๐Ÿผโ€โ™‚", "๐Ÿ’‡๐Ÿฝโ€โ™‚", "๐Ÿ’‡๐Ÿพโ€โ™‚", "๐Ÿ’‡๐Ÿฟโ€โ™‚", "๐Ÿ’†โ€โ™€", "๐Ÿ’†๐Ÿปโ€โ™€", "๐Ÿ’†๐Ÿผโ€โ™€", "๐Ÿ’†๐Ÿฝโ€โ™€", "๐Ÿ’†๐Ÿพโ€โ™€", "๐Ÿ’†๐Ÿฟโ€โ™€", "๐Ÿ’†", "๐Ÿ’†๐Ÿป", "๐Ÿ’†๐Ÿผ", "๐Ÿ’†๐Ÿฝ", "๐Ÿ’†๐Ÿพ", "๐Ÿ’†๐Ÿฟ", "๐Ÿ’†โ€โ™‚", "๐Ÿ’†๐Ÿปโ€โ™‚", "๐Ÿ’†๐Ÿผโ€โ™‚", "๐Ÿ’†๐Ÿฝโ€โ™‚", "๐Ÿ’†๐Ÿพโ€โ™‚", "๐Ÿ’†๐Ÿฟโ€โ™‚", "๐Ÿง–โ€โ™€", "๐Ÿง–๐Ÿปโ€โ™€", "๐Ÿง–๐Ÿผโ€โ™€", "๐Ÿง–๐Ÿฝโ€โ™€", "๐Ÿง–๐Ÿพโ€โ™€", "๐Ÿง–๐Ÿฟโ€โ™€", "๐Ÿง–", "๐Ÿง–๐Ÿป", "๐Ÿง–๐Ÿผ", "๐Ÿง–๐Ÿฝ", "๐Ÿง–๐Ÿพ", "๐Ÿง–๐Ÿฟ", "๐Ÿง–โ€โ™‚", "๐Ÿง–๐Ÿปโ€โ™‚", "๐Ÿง–๐Ÿผโ€โ™‚", "๐Ÿง–๐Ÿฝโ€โ™‚", "๐Ÿง–๐Ÿพโ€โ™‚", "๐Ÿง–๐Ÿฟโ€โ™‚", "๐Ÿ’…", "๐Ÿ’…๐Ÿป", "๐Ÿ’…๐Ÿผ", "๐Ÿ’…๐Ÿฝ", "๐Ÿ’…๐Ÿพ", "๐Ÿ’…๐Ÿฟ", "๐Ÿคณ", "๐Ÿคณ๐Ÿป", "๐Ÿคณ๐Ÿผ", "๐Ÿคณ๐Ÿฝ", "๐Ÿคณ๐Ÿพ", "๐Ÿคณ๐Ÿฟ", "๐Ÿ’ƒ", "๐Ÿ’ƒ๐Ÿป", "๐Ÿ’ƒ๐Ÿผ", "๐Ÿ’ƒ๐Ÿฝ", "๐Ÿ’ƒ๐Ÿพ", "๐Ÿ’ƒ๐Ÿฟ", "๐Ÿ•บ", "๐Ÿ•บ๐Ÿป", "๐Ÿ•บ๐Ÿผ", "๐Ÿ•บ๐Ÿฝ", "๐Ÿ•บ๐Ÿพ", "๐Ÿ•บ๐Ÿฟ", "๐Ÿ‘ฏโ€โ™€", "๐Ÿ‘ฏ", "๐Ÿ‘ฏโ€โ™‚", "๐Ÿ•ด", "๐Ÿ•ด๐Ÿป", "๐Ÿ•ด๐Ÿผ", "๐Ÿ•ด๐Ÿฝ", "๐Ÿ•ด๐Ÿพ", "๐Ÿ•ด๐Ÿฟ", "๐Ÿ‘ฉโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฝ", "๐Ÿง‘โ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฝ", "๐Ÿ‘จโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฝ", "๐Ÿ‘ฉโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆผ", "๐Ÿง‘โ€๐Ÿฆผ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆผ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆผ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆผ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆผ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆผ", "๐Ÿ‘จโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆผ", "๐Ÿšถโ€โ™€", "๐Ÿšถ๐Ÿปโ€โ™€", "๐Ÿšถ๐Ÿผโ€โ™€", "๐Ÿšถ๐Ÿฝโ€โ™€", "๐Ÿšถ๐Ÿพโ€โ™€", "๐Ÿšถ๐Ÿฟโ€โ™€", "๐Ÿšถ", "๐Ÿšถ๐Ÿป", "๐Ÿšถ๐Ÿผ", "๐Ÿšถ๐Ÿฝ", "๐Ÿšถ๐Ÿพ", "๐Ÿšถ๐Ÿฟ", "๐Ÿšถโ€โ™‚", "๐Ÿšถ๐Ÿปโ€โ™‚", "๐Ÿšถ๐Ÿผโ€โ™‚", "๐Ÿšถ๐Ÿฝโ€โ™‚", "๐Ÿšถ๐Ÿพโ€โ™‚", "๐Ÿšถ๐Ÿฟโ€โ™‚", "๐Ÿ‘ฉโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฏ", "๐Ÿง‘โ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฏ", "๐Ÿ‘จโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฏ", "๐ŸงŽโ€โ™€", "๐ŸงŽ๐Ÿปโ€โ™€", "๐ŸงŽ๐Ÿผโ€โ™€", "๐ŸงŽ๐Ÿฝโ€โ™€", "๐ŸงŽ๐Ÿพโ€โ™€", "๐ŸงŽ๐Ÿฟโ€โ™€", "๐ŸงŽ", "๐ŸงŽ๐Ÿป", "๐ŸงŽ๐Ÿผ", "๐ŸงŽ๐Ÿฝ", "๐ŸงŽ๐Ÿพ", "๐ŸงŽ๐Ÿฟ", "๐ŸงŽโ€โ™‚", "๐ŸงŽ๐Ÿปโ€โ™‚", "๐ŸงŽ๐Ÿผโ€โ™‚", "๐ŸงŽ๐Ÿฝโ€โ™‚", "๐ŸงŽ๐Ÿพโ€โ™‚", "๐ŸงŽ๐Ÿฟโ€โ™‚", "๐Ÿƒโ€โ™€", "๐Ÿƒ๐Ÿปโ€โ™€", "๐Ÿƒ๐Ÿผโ€โ™€", "๐Ÿƒ๐Ÿฝโ€โ™€", "๐Ÿƒ๐Ÿพโ€โ™€", "๐Ÿƒ๐Ÿฟโ€โ™€", "๐Ÿƒ", "๐Ÿƒ๐Ÿป", "๐Ÿƒ๐Ÿผ", "๐Ÿƒ๐Ÿฝ", "๐Ÿƒ๐Ÿพ", "๐Ÿƒ๐Ÿฟ", "๐Ÿƒโ€โ™‚", "๐Ÿƒ๐Ÿปโ€โ™‚", "๐Ÿƒ๐Ÿผโ€โ™‚", "๐Ÿƒ๐Ÿฝโ€โ™‚", "๐Ÿƒ๐Ÿพโ€โ™‚", "๐Ÿƒ๐Ÿฟโ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง๐Ÿปโ€โ™€", "๐Ÿง๐Ÿผโ€โ™€", "๐Ÿง๐Ÿฝโ€โ™€", "๐Ÿง๐Ÿพโ€โ™€", "๐Ÿง๐Ÿฟโ€โ™€", "๐Ÿง", "๐Ÿง๐Ÿป", "๐Ÿง๐Ÿผ", "๐Ÿง๐Ÿฝ", "๐Ÿง๐Ÿพ", "๐Ÿง๐Ÿฟ", "๐Ÿงโ€โ™‚", "๐Ÿง๐Ÿปโ€โ™‚", "๐Ÿง๐Ÿผโ€โ™‚", "๐Ÿง๐Ÿฝโ€โ™‚", "๐Ÿง๐Ÿพโ€โ™‚", "๐Ÿง๐Ÿฟโ€โ™‚", "๐Ÿ‘ซ", "๐Ÿ‘ซ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ซ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ซ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ซ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ซ๐Ÿฟ", "๐Ÿ‘ญ", "๐Ÿ‘ญ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ญ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ญ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ญ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ญ๐Ÿฟ", "๐Ÿ‘ฌ", "๐Ÿ‘ฌ๐Ÿป", "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฌ๐Ÿผ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฌ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฌ๐Ÿพ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฌ๐Ÿฟ", "๐Ÿ‘ฉโ€โคโ€๐Ÿ‘จ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉโ€โคโ€๐Ÿ‘ฉ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ’‘", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿ‘จโ€โคโ€๐Ÿ‘จ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ’", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿ‘จโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿชข", "๐Ÿงถ", "๐Ÿงต", "๐Ÿชก", "๐Ÿงฅ", "๐Ÿฅผ", "๐Ÿฆบ", "๐Ÿ‘š", "๐Ÿ‘•", "๐Ÿ‘–", "๐Ÿฉฒ", "๐Ÿฉณ", "๐Ÿ‘”", "๐Ÿ‘—", "๐Ÿ‘™", "๐Ÿฉฑ", "๐Ÿ‘˜", "๐Ÿฅป", "๐Ÿฉด", "๐Ÿฅฟ", "๐Ÿ‘ ", "๐Ÿ‘ก", "๐Ÿ‘ข", "๐Ÿ‘ž", "๐Ÿ‘Ÿ", "๐Ÿฅพ", "๐Ÿงฆ", "๐Ÿงค", "๐Ÿงฃ", "๐ŸŽฉ", "๐Ÿงข", "๐Ÿ‘’", "๐ŸŽ“", "โ›‘", "๐Ÿช–", "๐Ÿ‘‘", "๐Ÿ’", "๐Ÿ‘", "๐Ÿ‘›", "๐Ÿ‘œ", "๐Ÿ’ผ", "๐ŸŽ’", "๐Ÿงณ", "๐Ÿ‘“", "๐Ÿ•ถ", "๐Ÿฅฝ", "๐ŸŒ‚" + "๐Ÿ˜€", "๐Ÿ˜ƒ", "๐Ÿ˜„", "๐Ÿ˜", "๐Ÿ˜†", "๐Ÿฅน", "๐Ÿ˜…", "๐Ÿ˜‚", "๐Ÿคฃ", "๐Ÿฅฒ", "โ˜บ", "๐Ÿ˜Š", "๐Ÿ˜‡", "๐Ÿ™‚", "๐Ÿ™ƒ", "๐Ÿ˜‰", "๐Ÿ˜Œ", "๐Ÿ˜", "๐Ÿฅฐ", "๐Ÿ˜˜", "๐Ÿ˜—", "๐Ÿ˜™", "๐Ÿ˜š", "๐Ÿ˜‹", "๐Ÿ˜›", "๐Ÿ˜", "๐Ÿ˜œ", "๐Ÿคช", "๐Ÿคจ", "๐Ÿง", "๐Ÿค“", "๐Ÿ˜Ž", "๐Ÿฅธ", "๐Ÿคฉ", "๐Ÿฅณ", "๐Ÿ™‚โ€โ†•", "๐Ÿ˜", "๐Ÿ˜’", "๐Ÿ™‚โ€โ†”", "๐Ÿ˜ž", "๐Ÿ˜”", "๐Ÿ˜Ÿ", "๐Ÿ˜•", "๐Ÿ™", "โ˜น", "๐Ÿ˜ฃ", "๐Ÿ˜–", "๐Ÿ˜ซ", "๐Ÿ˜ฉ", "๐Ÿฅบ", "๐Ÿ˜ข", "๐Ÿ˜ญ", "๐Ÿ˜ค", "๐Ÿ˜ ", "๐Ÿ˜ก", "๐Ÿคฌ", "๐Ÿคฏ", "๐Ÿ˜ณ", "๐Ÿฅต", "๐Ÿฅถ", "๐Ÿ˜ถโ€๐ŸŒซ", "๐Ÿ˜ฑ", "๐Ÿ˜จ", "๐Ÿ˜ฐ", "๐Ÿ˜ฅ", "๐Ÿ˜“", "๐Ÿค—", "๐Ÿค”", "๐Ÿซฃ", "๐Ÿคญ", "๐Ÿซข", "๐Ÿซก", "๐Ÿคซ", "๐Ÿซ ", "๐Ÿคฅ", "๐Ÿ˜ถ", "๐Ÿซฅ", "๐Ÿ˜", "๐Ÿซค", "๐Ÿ˜‘", "๐Ÿซจ", "๐Ÿ˜ฌ", "๐Ÿ™„", "๐Ÿ˜ฏ", "๐Ÿ˜ฆ", "๐Ÿ˜ง", "๐Ÿ˜ฎ", "๐Ÿ˜ฒ", "๐Ÿฅฑ", "๐Ÿ˜ด", "๐Ÿคค", "๐Ÿ˜ช", "๐Ÿ˜ฎโ€๐Ÿ’จ", "๐Ÿ˜ต", "๐Ÿ˜ตโ€๐Ÿ’ซ", "๐Ÿค", "๐Ÿฅด", "๐Ÿคข", "๐Ÿคฎ", "๐Ÿคง", "๐Ÿ˜ท", "๐Ÿค’", "๐Ÿค•", "๐Ÿค‘", "๐Ÿค ", "๐Ÿ˜ˆ", "๐Ÿ‘ฟ", "๐Ÿ‘น", "๐Ÿ‘บ", "๐Ÿคก", "๐Ÿ’ฉ", "๐Ÿ‘ป", "๐Ÿ’€", "โ˜ ", "๐Ÿ‘ฝ", "๐Ÿ‘พ", "๐Ÿค–", "๐ŸŽƒ", "๐Ÿ˜บ", "๐Ÿ˜ธ", "๐Ÿ˜น", "๐Ÿ˜ป", "๐Ÿ˜ผ", "๐Ÿ˜ฝ", "๐Ÿ™€", "๐Ÿ˜ฟ", "๐Ÿ˜พ", "๐Ÿซถ", "๐Ÿซถ๐Ÿป", "๐Ÿซถ๐Ÿผ", "๐Ÿซถ๐Ÿฝ", "๐Ÿซถ๐Ÿพ", "๐Ÿซถ๐Ÿฟ", "๐Ÿคฒ", "๐Ÿคฒ๐Ÿป", "๐Ÿคฒ๐Ÿผ", "๐Ÿคฒ๐Ÿฝ", "๐Ÿคฒ๐Ÿพ", "๐Ÿคฒ๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿ™Œ", "๐Ÿ™Œ๐Ÿป", "๐Ÿ™Œ๐Ÿผ", "๐Ÿ™Œ๐Ÿฝ", "๐Ÿ™Œ๐Ÿพ", "๐Ÿ™Œ๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿค", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿ‘Ž", "๐Ÿ‘Ž๐Ÿป", "๐Ÿ‘Ž๐Ÿผ", "๐Ÿ‘Ž๐Ÿฝ", "๐Ÿ‘Ž๐Ÿพ", "๐Ÿ‘Ž๐Ÿฟ", "๐Ÿ‘Š", "๐Ÿ‘Š๐Ÿป", "๐Ÿ‘Š๐Ÿผ", "๐Ÿ‘Š๐Ÿฝ", "๐Ÿ‘Š๐Ÿพ", "๐Ÿ‘Š๐Ÿฟ", "โœŠ", "โœŠ๐Ÿป", "โœŠ๐Ÿผ", "โœŠ๐Ÿฝ", "โœŠ๐Ÿพ", "โœŠ๐Ÿฟ", "๐Ÿค›", "๐Ÿค›๐Ÿป", "๐Ÿค›๐Ÿผ", "๐Ÿค›๐Ÿฝ", "๐Ÿค›๐Ÿพ", "๐Ÿค›๐Ÿฟ", "๐Ÿคœ", "๐Ÿคœ๐Ÿป", "๐Ÿคœ๐Ÿผ", "๐Ÿคœ๐Ÿฝ", "๐Ÿคœ๐Ÿพ", "๐Ÿคœ๐Ÿฟ", "๐Ÿซท", "๐Ÿซท๐Ÿป", "๐Ÿซท๐Ÿผ", "๐Ÿซท๐Ÿฝ", "๐Ÿซท๐Ÿพ", "๐Ÿซท๐Ÿฟ", "๐Ÿซธ", "๐Ÿซธ๐Ÿป", "๐Ÿซธ๐Ÿผ", "๐Ÿซธ๐Ÿฝ", "๐Ÿซธ๐Ÿพ", "๐Ÿซธ๐Ÿฟ", "๐Ÿคž", "๐Ÿคž๐Ÿป", "๐Ÿคž๐Ÿผ", "๐Ÿคž๐Ÿฝ", "๐Ÿคž๐Ÿพ", "๐Ÿคž๐Ÿฟ", "โœŒ", "โœŒ๐Ÿป", "โœŒ๐Ÿผ", "โœŒ๐Ÿฝ", "โœŒ๐Ÿพ", "โœŒ๐Ÿฟ", "๐Ÿซฐ", "๐Ÿซฐ๐Ÿป", "๐Ÿซฐ๐Ÿผ", "๐Ÿซฐ๐Ÿฝ", "๐Ÿซฐ๐Ÿพ", "๐Ÿซฐ๐Ÿฟ", "๐ŸคŸ", "๐ŸคŸ๐Ÿป", "๐ŸคŸ๐Ÿผ", "๐ŸคŸ๐Ÿฝ", "๐ŸคŸ๐Ÿพ", "๐ŸคŸ๐Ÿฟ", "๐Ÿค˜", "๐Ÿค˜๐Ÿป", "๐Ÿค˜๐Ÿผ", "๐Ÿค˜๐Ÿฝ", "๐Ÿค˜๐Ÿพ", "๐Ÿค˜๐Ÿฟ", "๐Ÿ‘Œ", "๐Ÿ‘Œ๐Ÿป", "๐Ÿ‘Œ๐Ÿผ", "๐Ÿ‘Œ๐Ÿฝ", "๐Ÿ‘Œ๐Ÿพ", "๐Ÿ‘Œ๐Ÿฟ", "๐ŸคŒ", "๐ŸคŒ๐Ÿป", "๐ŸคŒ๐Ÿผ", "๐ŸคŒ๐Ÿฝ", "๐ŸคŒ๐Ÿพ", "๐ŸคŒ๐Ÿฟ", "๐Ÿค", "๐Ÿค๐Ÿป", "๐Ÿค๐Ÿผ", "๐Ÿค๐Ÿฝ", "๐Ÿค๐Ÿพ", "๐Ÿค๐Ÿฟ", "๐Ÿซณ", "๐Ÿซณ๐Ÿป", "๐Ÿซณ๐Ÿผ", "๐Ÿซณ๐Ÿฝ", "๐Ÿซณ๐Ÿพ", "๐Ÿซณ๐Ÿฟ", "๐Ÿซด", "๐Ÿซด๐Ÿป", "๐Ÿซด๐Ÿผ", "๐Ÿซด๐Ÿฝ", "๐Ÿซด๐Ÿพ", "๐Ÿซด๐Ÿฟ", "๐Ÿ‘ˆ", "๐Ÿ‘ˆ๐Ÿป", "๐Ÿ‘ˆ๐Ÿผ", "๐Ÿ‘ˆ๐Ÿฝ", "๐Ÿ‘ˆ๐Ÿพ", "๐Ÿ‘ˆ๐Ÿฟ", "๐Ÿ‘‰", "๐Ÿ‘‰๐Ÿป", "๐Ÿ‘‰๐Ÿผ", "๐Ÿ‘‰๐Ÿฝ", "๐Ÿ‘‰๐Ÿพ", "๐Ÿ‘‰๐Ÿฟ", "๐Ÿ‘†", "๐Ÿ‘†๐Ÿป", "๐Ÿ‘†๐Ÿผ", "๐Ÿ‘†๐Ÿฝ", "๐Ÿ‘†๐Ÿพ", "๐Ÿ‘†๐Ÿฟ", "๐Ÿ‘‡", "๐Ÿ‘‡๐Ÿป", "๐Ÿ‘‡๐Ÿผ", "๐Ÿ‘‡๐Ÿฝ", "๐Ÿ‘‡๐Ÿพ", "๐Ÿ‘‡๐Ÿฟ", "โ˜", "โ˜๐Ÿป", "โ˜๐Ÿผ", "โ˜๐Ÿฝ", "โ˜๐Ÿพ", "โ˜๐Ÿฟ", "โœ‹", "โœ‹๐Ÿป", "โœ‹๐Ÿผ", "โœ‹๐Ÿฝ", "โœ‹๐Ÿพ", "โœ‹๐Ÿฟ", "๐Ÿคš", "๐Ÿคš๐Ÿป", "๐Ÿคš๐Ÿผ", "๐Ÿคš๐Ÿฝ", "๐Ÿคš๐Ÿพ", "๐Ÿคš๐Ÿฟ", "๐Ÿ–", "๐Ÿ–๐Ÿป", "๐Ÿ–๐Ÿผ", "๐Ÿ–๐Ÿฝ", "๐Ÿ–๐Ÿพ", "๐Ÿ–๐Ÿฟ", "๐Ÿ––", "๐Ÿ––๐Ÿป", "๐Ÿ––๐Ÿผ", "๐Ÿ––๐Ÿฝ", "๐Ÿ––๐Ÿพ", "๐Ÿ––๐Ÿฟ", "๐Ÿ‘‹", "๐Ÿ‘‹๐Ÿป", "๐Ÿ‘‹๐Ÿผ", "๐Ÿ‘‹๐Ÿฝ", "๐Ÿ‘‹๐Ÿพ", "๐Ÿ‘‹๐Ÿฟ", "๐Ÿค™", "๐Ÿค™๐Ÿป", "๐Ÿค™๐Ÿผ", "๐Ÿค™๐Ÿฝ", "๐Ÿค™๐Ÿพ", "๐Ÿค™๐Ÿฟ", "๐Ÿซฒ", "๐Ÿซฒ๐Ÿป", "๐Ÿซฒ๐Ÿผ", "๐Ÿซฒ๐Ÿฝ", "๐Ÿซฒ๐Ÿพ", "๐Ÿซฒ๐Ÿฟ", "๐Ÿซฑ", "๐Ÿซฑ๐Ÿป", "๐Ÿซฑ๐Ÿผ", "๐Ÿซฑ๐Ÿฝ", "๐Ÿซฑ๐Ÿพ", "๐Ÿซฑ๐Ÿฟ", "๐Ÿ’ช", "๐Ÿ’ช๐Ÿป", "๐Ÿ’ช๐Ÿผ", "๐Ÿ’ช๐Ÿฝ", "๐Ÿ’ช๐Ÿพ", "๐Ÿ’ช๐Ÿฟ", "๐Ÿฆพ", "๐Ÿ–•", "๐Ÿ–•๐Ÿป", "๐Ÿ–•๐Ÿผ", "๐Ÿ–•๐Ÿฝ", "๐Ÿ–•๐Ÿพ", "๐Ÿ–•๐Ÿฟ", "โœ", "โœ๐Ÿป", "โœ๐Ÿผ", "โœ๐Ÿฝ", "โœ๐Ÿพ", "โœ๐Ÿฟ", "๐Ÿ™", "๐Ÿ™๐Ÿป", "๐Ÿ™๐Ÿผ", "๐Ÿ™๐Ÿฝ", "๐Ÿ™๐Ÿพ", "๐Ÿ™๐Ÿฟ", "๐Ÿซต", "๐Ÿซต๐Ÿป", "๐Ÿซต๐Ÿผ", "๐Ÿซต๐Ÿฝ", "๐Ÿซต๐Ÿพ", "๐Ÿซต๐Ÿฟ", "๐Ÿฆถ", "๐Ÿฆถ๐Ÿป", "๐Ÿฆถ๐Ÿผ", "๐Ÿฆถ๐Ÿฝ", "๐Ÿฆถ๐Ÿพ", "๐Ÿฆถ๐Ÿฟ", "๐Ÿฆต", "๐Ÿฆต๐Ÿป", "๐Ÿฆต๐Ÿผ", "๐Ÿฆต๐Ÿฝ", "๐Ÿฆต๐Ÿพ", "๐Ÿฆต๐Ÿฟ", "๐Ÿฆฟ", "๐Ÿ’„", "๐Ÿ’‹", "๐Ÿ‘„", "๐Ÿซฆ", "๐Ÿฆท", "๐Ÿ‘…", "๐Ÿ‘‚", "๐Ÿ‘‚๐Ÿป", "๐Ÿ‘‚๐Ÿผ", "๐Ÿ‘‚๐Ÿฝ", "๐Ÿ‘‚๐Ÿพ", "๐Ÿ‘‚๐Ÿฟ", "๐Ÿฆป", "๐Ÿฆป๐Ÿป", "๐Ÿฆป๐Ÿผ", "๐Ÿฆป๐Ÿฝ", "๐Ÿฆป๐Ÿพ", "๐Ÿฆป๐Ÿฟ", "๐Ÿ‘ƒ", "๐Ÿ‘ƒ๐Ÿป", "๐Ÿ‘ƒ๐Ÿผ", "๐Ÿ‘ƒ๐Ÿฝ", "๐Ÿ‘ƒ๐Ÿพ", "๐Ÿ‘ƒ๐Ÿฟ", "๐Ÿ‘ฃ", "๐Ÿ‘", "๐Ÿ‘€", "๐Ÿซ€", "๐Ÿซ", "๐Ÿง ", "๐Ÿ—ฃ", "๐Ÿ‘ค", "๐Ÿ‘ฅ", "๐Ÿซ‚", "๐Ÿ‘ถ", "๐Ÿ‘ถ๐Ÿป", "๐Ÿ‘ถ๐Ÿผ", "๐Ÿ‘ถ๐Ÿฝ", "๐Ÿ‘ถ๐Ÿพ", "๐Ÿ‘ถ๐Ÿฟ", "๐Ÿ‘ง", "๐Ÿ‘ง๐Ÿป", "๐Ÿ‘ง๐Ÿผ", "๐Ÿ‘ง๐Ÿฝ", "๐Ÿ‘ง๐Ÿพ", "๐Ÿ‘ง๐Ÿฟ", "๐Ÿง’", "๐Ÿง’๐Ÿป", "๐Ÿง’๐Ÿผ", "๐Ÿง’๐Ÿฝ", "๐Ÿง’๐Ÿพ", "๐Ÿง’๐Ÿฟ", "๐Ÿ‘ฆ", "๐Ÿ‘ฆ๐Ÿป", "๐Ÿ‘ฆ๐Ÿผ", "๐Ÿ‘ฆ๐Ÿฝ", "๐Ÿ‘ฆ๐Ÿพ", "๐Ÿ‘ฆ๐Ÿฟ", "๐Ÿ‘ฉ", "๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿง‘", "๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฟ", "๐Ÿ‘จ", "๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฑ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฑ", "๐Ÿง‘โ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฑ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฑ", "๐Ÿ‘จโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฑ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฑ", "๐Ÿ‘ฉโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฐ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฐ", "๐Ÿง‘โ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฐ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฐ", "๐Ÿ‘จโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฐ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฐ", "๐Ÿ‘ฑโ€โ™€", "๐Ÿ‘ฑ๐Ÿปโ€โ™€", "๐Ÿ‘ฑ๐Ÿผโ€โ™€", "๐Ÿ‘ฑ๐Ÿฝโ€โ™€", "๐Ÿ‘ฑ๐Ÿพโ€โ™€", "๐Ÿ‘ฑ๐Ÿฟโ€โ™€", "๐Ÿ‘ฑ", "๐Ÿ‘ฑ๐Ÿป", "๐Ÿ‘ฑ๐Ÿผ", "๐Ÿ‘ฑ๐Ÿฝ", "๐Ÿ‘ฑ๐Ÿพ", "๐Ÿ‘ฑ๐Ÿฟ", "๐Ÿ‘ฑโ€โ™‚", "๐Ÿ‘ฑ๐Ÿปโ€โ™‚", "๐Ÿ‘ฑ๐Ÿผโ€โ™‚", "๐Ÿ‘ฑ๐Ÿฝโ€โ™‚", "๐Ÿ‘ฑ๐Ÿพโ€โ™‚", "๐Ÿ‘ฑ๐Ÿฟโ€โ™‚", "๐Ÿ‘ฉโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆณ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆณ", "๐Ÿง‘โ€๐Ÿฆณ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆณ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆณ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆณ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆณ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆณ", "๐Ÿ‘จโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆณ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆณ", "๐Ÿ‘ฉโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฒ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฒ", "๐Ÿง‘โ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฒ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฒ", "๐Ÿ‘จโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฒ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฒ", "๐Ÿง”โ€โ™€", "๐Ÿง”๐Ÿปโ€โ™€", "๐Ÿง”๐Ÿผโ€โ™€", "๐Ÿง”๐Ÿฝโ€โ™€", "๐Ÿง”๐Ÿพโ€โ™€", "๐Ÿง”๐Ÿฟโ€โ™€", "๐Ÿง”", "๐Ÿง”๐Ÿป", "๐Ÿง”๐Ÿผ", "๐Ÿง”๐Ÿฝ", "๐Ÿง”๐Ÿพ", "๐Ÿง”๐Ÿฟ", "๐Ÿง”โ€โ™‚", "๐Ÿง”๐Ÿปโ€โ™‚", "๐Ÿง”๐Ÿผโ€โ™‚", "๐Ÿง”๐Ÿฝโ€โ™‚", "๐Ÿง”๐Ÿพโ€โ™‚", "๐Ÿง”๐Ÿฟโ€โ™‚", "๐Ÿ‘ต", "๐Ÿ‘ต๐Ÿป", "๐Ÿ‘ต๐Ÿผ", "๐Ÿ‘ต๐Ÿฝ", "๐Ÿ‘ต๐Ÿพ", "๐Ÿ‘ต๐Ÿฟ", "๐Ÿง“", "๐Ÿง“๐Ÿป", "๐Ÿง“๐Ÿผ", "๐Ÿง“๐Ÿฝ", "๐Ÿง“๐Ÿพ", "๐Ÿง“๐Ÿฟ", "๐Ÿ‘ด", "๐Ÿ‘ด๐Ÿป", "๐Ÿ‘ด๐Ÿผ", "๐Ÿ‘ด๐Ÿฝ", "๐Ÿ‘ด๐Ÿพ", "๐Ÿ‘ด๐Ÿฟ", "๐Ÿ‘ฒ", "๐Ÿ‘ฒ๐Ÿป", "๐Ÿ‘ฒ๐Ÿผ", "๐Ÿ‘ฒ๐Ÿฝ", "๐Ÿ‘ฒ๐Ÿพ", "๐Ÿ‘ฒ๐Ÿฟ", "๐Ÿ‘ณโ€โ™€", "๐Ÿ‘ณ๐Ÿปโ€โ™€", "๐Ÿ‘ณ๐Ÿผโ€โ™€", "๐Ÿ‘ณ๐Ÿฝโ€โ™€", "๐Ÿ‘ณ๐Ÿพโ€โ™€", "๐Ÿ‘ณ๐Ÿฟโ€โ™€", "๐Ÿ‘ณ", "๐Ÿ‘ณ๐Ÿป", "๐Ÿ‘ณ๐Ÿผ", "๐Ÿ‘ณ๐Ÿฝ", "๐Ÿ‘ณ๐Ÿพ", "๐Ÿ‘ณ๐Ÿฟ", "๐Ÿ‘ณโ€โ™‚", "๐Ÿ‘ณ๐Ÿปโ€โ™‚", "๐Ÿ‘ณ๐Ÿผโ€โ™‚", "๐Ÿ‘ณ๐Ÿฝโ€โ™‚", "๐Ÿ‘ณ๐Ÿพโ€โ™‚", "๐Ÿ‘ณ๐Ÿฟโ€โ™‚", "๐Ÿง•", "๐Ÿง•๐Ÿป", "๐Ÿง•๐Ÿผ", "๐Ÿง•๐Ÿฝ", "๐Ÿง•๐Ÿพ", "๐Ÿง•๐Ÿฟ", "๐Ÿ‘ฎโ€โ™€", "๐Ÿ‘ฎ๐Ÿปโ€โ™€", "๐Ÿ‘ฎ๐Ÿผโ€โ™€", "๐Ÿ‘ฎ๐Ÿฝโ€โ™€", "๐Ÿ‘ฎ๐Ÿพโ€โ™€", "๐Ÿ‘ฎ๐Ÿฟโ€โ™€", "๐Ÿ‘ฎ", "๐Ÿ‘ฎ๐Ÿป", "๐Ÿ‘ฎ๐Ÿผ", "๐Ÿ‘ฎ๐Ÿฝ", "๐Ÿ‘ฎ๐Ÿพ", "๐Ÿ‘ฎ๐Ÿฟ", "๐Ÿ‘ฎโ€โ™‚", "๐Ÿ‘ฎ๐Ÿปโ€โ™‚", "๐Ÿ‘ฎ๐Ÿผโ€โ™‚", "๐Ÿ‘ฎ๐Ÿฝโ€โ™‚", "๐Ÿ‘ฎ๐Ÿพโ€โ™‚", "๐Ÿ‘ฎ๐Ÿฟโ€โ™‚", "๐Ÿ‘ทโ€โ™€", "๐Ÿ‘ท๐Ÿปโ€โ™€", "๐Ÿ‘ท๐Ÿผโ€โ™€", "๐Ÿ‘ท๐Ÿฝโ€โ™€", "๐Ÿ‘ท๐Ÿพโ€โ™€", "๐Ÿ‘ท๐Ÿฟโ€โ™€", "๐Ÿ‘ท", "๐Ÿ‘ท๐Ÿป", "๐Ÿ‘ท๐Ÿผ", "๐Ÿ‘ท๐Ÿฝ", "๐Ÿ‘ท๐Ÿพ", "๐Ÿ‘ท๐Ÿฟ", "๐Ÿ‘ทโ€โ™‚", "๐Ÿ‘ท๐Ÿปโ€โ™‚", "๐Ÿ‘ท๐Ÿผโ€โ™‚", "๐Ÿ‘ท๐Ÿฝโ€โ™‚", "๐Ÿ‘ท๐Ÿพโ€โ™‚", "๐Ÿ‘ท๐Ÿฟโ€โ™‚", "๐Ÿ’‚โ€โ™€", "๐Ÿ’‚๐Ÿปโ€โ™€", "๐Ÿ’‚๐Ÿผโ€โ™€", "๐Ÿ’‚๐Ÿฝโ€โ™€", "๐Ÿ’‚๐Ÿพโ€โ™€", "๐Ÿ’‚๐Ÿฟโ€โ™€", "๐Ÿ’‚", "๐Ÿ’‚๐Ÿป", "๐Ÿ’‚๐Ÿผ", "๐Ÿ’‚๐Ÿฝ", "๐Ÿ’‚๐Ÿพ", "๐Ÿ’‚๐Ÿฟ", "๐Ÿ’‚โ€โ™‚", "๐Ÿ’‚๐Ÿปโ€โ™‚", "๐Ÿ’‚๐Ÿผโ€โ™‚", "๐Ÿ’‚๐Ÿฝโ€โ™‚", "๐Ÿ’‚๐Ÿพโ€โ™‚", "๐Ÿ’‚๐Ÿฟโ€โ™‚", "๐Ÿ•ตโ€โ™€", "๐Ÿ•ต๐Ÿปโ€โ™€", "๐Ÿ•ต๐Ÿผโ€โ™€", "๐Ÿ•ต๐Ÿฝโ€โ™€", "๐Ÿ•ต๐Ÿพโ€โ™€", "๐Ÿ•ต๐Ÿฟโ€โ™€", "๐Ÿ•ต", "๐Ÿ•ต๐Ÿป", "๐Ÿ•ต๐Ÿผ", "๐Ÿ•ต๐Ÿฝ", "๐Ÿ•ต๐Ÿพ", "๐Ÿ•ต๐Ÿฟ", "๐Ÿ•ตโ€โ™‚", "๐Ÿ•ต๐Ÿปโ€โ™‚", "๐Ÿ•ต๐Ÿผโ€โ™‚", "๐Ÿ•ต๐Ÿฝโ€โ™‚", "๐Ÿ•ต๐Ÿพโ€โ™‚", "๐Ÿ•ต๐Ÿฟโ€โ™‚", "๐Ÿ‘ฉโ€โš•", "๐Ÿ‘ฉ๐Ÿปโ€โš•", "๐Ÿ‘ฉ๐Ÿผโ€โš•", "๐Ÿ‘ฉ๐Ÿฝโ€โš•", "๐Ÿ‘ฉ๐Ÿพโ€โš•", "๐Ÿ‘ฉ๐Ÿฟโ€โš•", "๐Ÿง‘โ€โš•", "๐Ÿง‘๐Ÿปโ€โš•", "๐Ÿง‘๐Ÿผโ€โš•", "๐Ÿง‘๐Ÿฝโ€โš•", "๐Ÿง‘๐Ÿพโ€โš•", "๐Ÿง‘๐Ÿฟโ€โš•", "๐Ÿ‘จโ€โš•", "๐Ÿ‘จ๐Ÿปโ€โš•", "๐Ÿ‘จ๐Ÿผโ€โš•", "๐Ÿ‘จ๐Ÿฝโ€โš•", "๐Ÿ‘จ๐Ÿพโ€โš•", "๐Ÿ‘จ๐Ÿฟโ€โš•", "๐Ÿ‘ฉโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŒพ", "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŒพ", "๐Ÿง‘โ€๐ŸŒพ", "๐Ÿง‘๐Ÿปโ€๐ŸŒพ", "๐Ÿง‘๐Ÿผโ€๐ŸŒพ", "๐Ÿง‘๐Ÿฝโ€๐ŸŒพ", "๐Ÿง‘๐Ÿพโ€๐ŸŒพ", "๐Ÿง‘๐Ÿฟโ€๐ŸŒพ", "๐Ÿ‘จโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿปโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿผโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿฝโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿพโ€๐ŸŒพ", "๐Ÿ‘จ๐Ÿฟโ€๐ŸŒพ", "๐Ÿ‘ฉโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿณ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿณ", "๐Ÿง‘โ€๐Ÿณ", "๐Ÿง‘๐Ÿปโ€๐Ÿณ", "๐Ÿง‘๐Ÿผโ€๐Ÿณ", "๐Ÿง‘๐Ÿฝโ€๐Ÿณ", "๐Ÿง‘๐Ÿพโ€๐Ÿณ", "๐Ÿง‘๐Ÿฟโ€๐Ÿณ", "๐Ÿ‘จโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿณ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿณ", "๐Ÿ‘ฉโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽ“", "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽ“", "๐Ÿง‘โ€๐ŸŽ“", "๐Ÿง‘๐Ÿปโ€๐ŸŽ“", "๐Ÿง‘๐Ÿผโ€๐ŸŽ“", "๐Ÿง‘๐Ÿฝโ€๐ŸŽ“", "๐Ÿง‘๐Ÿพโ€๐ŸŽ“", "๐Ÿง‘๐Ÿฟโ€๐ŸŽ“", "๐Ÿ‘จโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿปโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿผโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿฝโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿพโ€๐ŸŽ“", "๐Ÿ‘จ๐Ÿฟโ€๐ŸŽ“", "๐Ÿ‘ฉโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽค", "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽค", "๐Ÿง‘โ€๐ŸŽค", "๐Ÿง‘๐Ÿปโ€๐ŸŽค", "๐Ÿง‘๐Ÿผโ€๐ŸŽค", "๐Ÿง‘๐Ÿฝโ€๐ŸŽค", "๐Ÿง‘๐Ÿพโ€๐ŸŽค", "๐Ÿง‘๐Ÿฟโ€๐ŸŽค", "๐Ÿ‘จโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿปโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿผโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿฝโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿพโ€๐ŸŽค", "๐Ÿ‘จ๐Ÿฟโ€๐ŸŽค", "๐Ÿ‘ฉโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿซ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿซ", "๐Ÿง‘โ€๐Ÿซ", "๐Ÿง‘๐Ÿปโ€๐Ÿซ", "๐Ÿง‘๐Ÿผโ€๐Ÿซ", "๐Ÿง‘๐Ÿฝโ€๐Ÿซ", "๐Ÿง‘๐Ÿพโ€๐Ÿซ", "๐Ÿง‘๐Ÿฟโ€๐Ÿซ", "๐Ÿ‘จโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿซ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿซ", "๐Ÿ‘ฉโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿญ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿญ", "๐Ÿง‘โ€๐Ÿญ", "๐Ÿง‘๐Ÿปโ€๐Ÿญ", "๐Ÿง‘๐Ÿผโ€๐Ÿญ", "๐Ÿง‘๐Ÿฝโ€๐Ÿญ", "๐Ÿง‘๐Ÿพโ€๐Ÿญ", "๐Ÿง‘๐Ÿฟโ€๐Ÿญ", "๐Ÿ‘จโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿญ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿญ", "๐Ÿ‘ฉโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ป", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ป", "๐Ÿง‘โ€๐Ÿ’ป", "๐Ÿง‘๐Ÿปโ€๐Ÿ’ป", "๐Ÿง‘๐Ÿผโ€๐Ÿ’ป", "๐Ÿง‘๐Ÿฝโ€๐Ÿ’ป", "๐Ÿง‘๐Ÿพโ€๐Ÿ’ป", "๐Ÿง‘๐Ÿฟโ€๐Ÿ’ป", "๐Ÿ‘จโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ป", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ป", "๐Ÿ‘ฉโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ผ", "๐Ÿง‘โ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿปโ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿผโ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿฝโ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿพโ€๐Ÿ’ผ", "๐Ÿง‘๐Ÿฟโ€๐Ÿ’ผ", "๐Ÿ‘จโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ผ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ผ", "๐Ÿ‘ฉโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ง", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ง", "๐Ÿง‘โ€๐Ÿ”ง", "๐Ÿง‘๐Ÿปโ€๐Ÿ”ง", "๐Ÿง‘๐Ÿผโ€๐Ÿ”ง", "๐Ÿง‘๐Ÿฝโ€๐Ÿ”ง", "๐Ÿง‘๐Ÿพโ€๐Ÿ”ง", "๐Ÿง‘๐Ÿฟโ€๐Ÿ”ง", "๐Ÿ‘จโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ง", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ง", "๐Ÿ‘ฉโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ฌ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ฌ", "๐Ÿง‘โ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿปโ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿผโ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿฝโ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿพโ€๐Ÿ”ฌ", "๐Ÿง‘๐Ÿฟโ€๐Ÿ”ฌ", "๐Ÿ‘จโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ฌ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ฌ", "๐Ÿ‘ฉโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽจ", "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽจ", "๐Ÿง‘โ€๐ŸŽจ", "๐Ÿง‘๐Ÿปโ€๐ŸŽจ", "๐Ÿง‘๐Ÿผโ€๐ŸŽจ", "๐Ÿง‘๐Ÿฝโ€๐ŸŽจ", "๐Ÿง‘๐Ÿพโ€๐ŸŽจ", "๐Ÿง‘๐Ÿฟโ€๐ŸŽจ", "๐Ÿ‘จโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿผโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿฝโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿพโ€๐ŸŽจ", "๐Ÿ‘จ๐Ÿฟโ€๐ŸŽจ", "๐Ÿ‘ฉโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš’", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš’", "๐Ÿง‘โ€๐Ÿš’", "๐Ÿง‘๐Ÿปโ€๐Ÿš’", "๐Ÿง‘๐Ÿผโ€๐Ÿš’", "๐Ÿง‘๐Ÿฝโ€๐Ÿš’", "๐Ÿง‘๐Ÿพโ€๐Ÿš’", "๐Ÿง‘๐Ÿฟโ€๐Ÿš’", "๐Ÿ‘จโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿปโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿผโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿพโ€๐Ÿš’", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿš’", "๐Ÿ‘ฉโ€โœˆ", "๐Ÿ‘ฉ๐Ÿปโ€โœˆ", "๐Ÿ‘ฉ๐Ÿผโ€โœˆ", "๐Ÿ‘ฉ๐Ÿฝโ€โœˆ", "๐Ÿ‘ฉ๐Ÿพโ€โœˆ", "๐Ÿ‘ฉ๐Ÿฟโ€โœˆ", "๐Ÿง‘โ€โœˆ", "๐Ÿง‘๐Ÿปโ€โœˆ", "๐Ÿง‘๐Ÿผโ€โœˆ", "๐Ÿง‘๐Ÿฝโ€โœˆ", "๐Ÿง‘๐Ÿพโ€โœˆ", "๐Ÿง‘๐Ÿฟโ€โœˆ", "๐Ÿ‘จโ€โœˆ", "๐Ÿ‘จ๐Ÿปโ€โœˆ", "๐Ÿ‘จ๐Ÿผโ€โœˆ", "๐Ÿ‘จ๐Ÿฝโ€โœˆ", "๐Ÿ‘จ๐Ÿพโ€โœˆ", "๐Ÿ‘จ๐Ÿฟโ€โœˆ", "๐Ÿ‘ฉโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš€", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš€", "๐Ÿง‘โ€๐Ÿš€", "๐Ÿง‘๐Ÿปโ€๐Ÿš€", "๐Ÿง‘๐Ÿผโ€๐Ÿš€", "๐Ÿง‘๐Ÿฝโ€๐Ÿš€", "๐Ÿง‘๐Ÿพโ€๐Ÿš€", "๐Ÿง‘๐Ÿฟโ€๐Ÿš€", "๐Ÿ‘จโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿปโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿผโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿพโ€๐Ÿš€", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿš€", "๐Ÿ‘ฉโ€โš–", "๐Ÿ‘ฉ๐Ÿปโ€โš–", "๐Ÿ‘ฉ๐Ÿผโ€โš–", "๐Ÿ‘ฉ๐Ÿฝโ€โš–", "๐Ÿ‘ฉ๐Ÿพโ€โš–", "๐Ÿ‘ฉ๐Ÿฟโ€โš–", "๐Ÿง‘โ€โš–", "๐Ÿง‘๐Ÿปโ€โš–", "๐Ÿง‘๐Ÿผโ€โš–", "๐Ÿง‘๐Ÿฝโ€โš–", "๐Ÿง‘๐Ÿพโ€โš–", "๐Ÿง‘๐Ÿฟโ€โš–", "๐Ÿ‘จโ€โš–", "๐Ÿ‘จ๐Ÿปโ€โš–", "๐Ÿ‘จ๐Ÿผโ€โš–", "๐Ÿ‘จ๐Ÿฝโ€โš–", "๐Ÿ‘จ๐Ÿพโ€โš–", "๐Ÿ‘จ๐Ÿฟโ€โš–", "๐Ÿ‘ฐโ€โ™€", "๐Ÿ‘ฐ๐Ÿปโ€โ™€", "๐Ÿ‘ฐ๐Ÿผโ€โ™€", "๐Ÿ‘ฐ๐Ÿฝโ€โ™€", "๐Ÿ‘ฐ๐Ÿพโ€โ™€", "๐Ÿ‘ฐ๐Ÿฟโ€โ™€", "๐Ÿ‘ฐ", "๐Ÿ‘ฐ๐Ÿป", "๐Ÿ‘ฐ๐Ÿผ", "๐Ÿ‘ฐ๐Ÿฝ", "๐Ÿ‘ฐ๐Ÿพ", "๐Ÿ‘ฐ๐Ÿฟ", "๐Ÿ‘ฐโ€โ™‚", "๐Ÿ‘ฐ๐Ÿปโ€โ™‚", "๐Ÿ‘ฐ๐Ÿผโ€โ™‚", "๐Ÿ‘ฐ๐Ÿฝโ€โ™‚", "๐Ÿ‘ฐ๐Ÿพโ€โ™‚", "๐Ÿ‘ฐ๐Ÿฟโ€โ™‚", "๐Ÿคตโ€โ™€", "๐Ÿคต๐Ÿปโ€โ™€", "๐Ÿคต๐Ÿผโ€โ™€", "๐Ÿคต๐Ÿฝโ€โ™€", "๐Ÿคต๐Ÿพโ€โ™€", "๐Ÿคต๐Ÿฟโ€โ™€", "๐Ÿคต", "๐Ÿคต๐Ÿป", "๐Ÿคต๐Ÿผ", "๐Ÿคต๐Ÿฝ", "๐Ÿคต๐Ÿพ", "๐Ÿคต๐Ÿฟ", "๐Ÿคตโ€โ™‚", "๐Ÿคต๐Ÿปโ€โ™‚", "๐Ÿคต๐Ÿผโ€โ™‚", "๐Ÿคต๐Ÿฝโ€โ™‚", "๐Ÿคต๐Ÿพโ€โ™‚", "๐Ÿคต๐Ÿฟโ€โ™‚", "๐Ÿ‘ธ", "๐Ÿ‘ธ๐Ÿป", "๐Ÿ‘ธ๐Ÿผ", "๐Ÿ‘ธ๐Ÿฝ", "๐Ÿ‘ธ๐Ÿพ", "๐Ÿ‘ธ๐Ÿฟ", "๐Ÿซ…", "๐Ÿซ…๐Ÿป", "๐Ÿซ…๐Ÿผ", "๐Ÿซ…๐Ÿฝ", "๐Ÿซ…๐Ÿพ", "๐Ÿซ…๐Ÿฟ", "๐Ÿคด", "๐Ÿคด๐Ÿป", "๐Ÿคด๐Ÿผ", "๐Ÿคด๐Ÿฝ", "๐Ÿคด๐Ÿพ", "๐Ÿคด๐Ÿฟ", "๐Ÿฅท", "๐Ÿฅท๐Ÿป", "๐Ÿฅท๐Ÿผ", "๐Ÿฅท๐Ÿฝ", "๐Ÿฅท๐Ÿพ", "๐Ÿฅท๐Ÿฟ", "๐Ÿฆธโ€โ™€", "๐Ÿฆธ๐Ÿปโ€โ™€", "๐Ÿฆธ๐Ÿผโ€โ™€", "๐Ÿฆธ๐Ÿฝโ€โ™€", "๐Ÿฆธ๐Ÿพโ€โ™€", "๐Ÿฆธ๐Ÿฟโ€โ™€", "๐Ÿฆธ", "๐Ÿฆธ๐Ÿป", "๐Ÿฆธ๐Ÿผ", "๐Ÿฆธ๐Ÿฝ", "๐Ÿฆธ๐Ÿพ", "๐Ÿฆธ๐Ÿฟ", "๐Ÿฆธโ€โ™‚", "๐Ÿฆธ๐Ÿปโ€โ™‚", "๐Ÿฆธ๐Ÿผโ€โ™‚", "๐Ÿฆธ๐Ÿฝโ€โ™‚", "๐Ÿฆธ๐Ÿพโ€โ™‚", "๐Ÿฆธ๐Ÿฟโ€โ™‚", "๐Ÿฆนโ€โ™€", "๐Ÿฆน๐Ÿปโ€โ™€", "๐Ÿฆน๐Ÿผโ€โ™€", "๐Ÿฆน๐Ÿฝโ€โ™€", "๐Ÿฆน๐Ÿพโ€โ™€", "๐Ÿฆน๐Ÿฟโ€โ™€", "๐Ÿฆน", "๐Ÿฆน๐Ÿป", "๐Ÿฆน๐Ÿผ", "๐Ÿฆน๐Ÿฝ", "๐Ÿฆน๐Ÿพ", "๐Ÿฆน๐Ÿฟ", "๐Ÿฆนโ€โ™‚", "๐Ÿฆน๐Ÿปโ€โ™‚", "๐Ÿฆน๐Ÿผโ€โ™‚", "๐Ÿฆน๐Ÿฝโ€โ™‚", "๐Ÿฆน๐Ÿพโ€โ™‚", "๐Ÿฆน๐Ÿฟโ€โ™‚", "๐Ÿคถ", "๐Ÿคถ๐Ÿป", "๐Ÿคถ๐Ÿผ", "๐Ÿคถ๐Ÿฝ", "๐Ÿคถ๐Ÿพ", "๐Ÿคถ๐Ÿฟ", "๐Ÿง‘โ€๐ŸŽ„", "๐Ÿง‘๐Ÿปโ€๐ŸŽ„", "๐Ÿง‘๐Ÿผโ€๐ŸŽ„", "๐Ÿง‘๐Ÿฝโ€๐ŸŽ„", "๐Ÿง‘๐Ÿพโ€๐ŸŽ„", "๐Ÿง‘๐Ÿฟโ€๐ŸŽ„", "๐ŸŽ…", "๐ŸŽ…๐Ÿป", "๐ŸŽ…๐Ÿผ", "๐ŸŽ…๐Ÿฝ", "๐ŸŽ…๐Ÿพ", "๐ŸŽ…๐Ÿฟ", "๐Ÿง™โ€โ™€", "๐Ÿง™๐Ÿปโ€โ™€", "๐Ÿง™๐Ÿผโ€โ™€", "๐Ÿง™๐Ÿฝโ€โ™€", "๐Ÿง™๐Ÿพโ€โ™€", "๐Ÿง™๐Ÿฟโ€โ™€", "๐Ÿง™", "๐Ÿง™๐Ÿป", "๐Ÿง™๐Ÿผ", "๐Ÿง™๐Ÿฝ", "๐Ÿง™๐Ÿพ", "๐Ÿง™๐Ÿฟ", "๐Ÿง™โ€โ™‚", "๐Ÿง™๐Ÿปโ€โ™‚", "๐Ÿง™๐Ÿผโ€โ™‚", "๐Ÿง™๐Ÿฝโ€โ™‚", "๐Ÿง™๐Ÿพโ€โ™‚", "๐Ÿง™๐Ÿฟโ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง๐Ÿปโ€โ™€", "๐Ÿง๐Ÿผโ€โ™€", "๐Ÿง๐Ÿฝโ€โ™€", "๐Ÿง๐Ÿพโ€โ™€", "๐Ÿง๐Ÿฟโ€โ™€", "๐Ÿง", "๐Ÿง๐Ÿป", "๐Ÿง๐Ÿผ", "๐Ÿง๐Ÿฝ", "๐Ÿง๐Ÿพ", "๐Ÿง๐Ÿฟ", "๐Ÿงโ€โ™‚", "๐Ÿง๐Ÿปโ€โ™‚", "๐Ÿง๐Ÿผโ€โ™‚", "๐Ÿง๐Ÿฝโ€โ™‚", "๐Ÿง๐Ÿพโ€โ™‚", "๐Ÿง๐Ÿฟโ€โ™‚", "๐ŸงŒ", "๐Ÿง›โ€โ™€", "๐Ÿง›๐Ÿปโ€โ™€", "๐Ÿง›๐Ÿผโ€โ™€", "๐Ÿง›๐Ÿฝโ€โ™€", "๐Ÿง›๐Ÿพโ€โ™€", "๐Ÿง›๐Ÿฟโ€โ™€", "๐Ÿง›", "๐Ÿง›๐Ÿป", "๐Ÿง›๐Ÿผ", "๐Ÿง›๐Ÿฝ", "๐Ÿง›๐Ÿพ", "๐Ÿง›๐Ÿฟ", "๐Ÿง›โ€โ™‚", "๐Ÿง›๐Ÿปโ€โ™‚", "๐Ÿง›๐Ÿผโ€โ™‚", "๐Ÿง›๐Ÿฝโ€โ™‚", "๐Ÿง›๐Ÿพโ€โ™‚", "๐Ÿง›๐Ÿฟโ€โ™‚", "๐ŸงŸโ€โ™€", "๐ŸงŸ", "๐ŸงŸโ€โ™‚", "๐Ÿงžโ€โ™€", "๐Ÿงž", "๐Ÿงžโ€โ™‚", "๐Ÿงœโ€โ™€", "๐Ÿงœ๐Ÿปโ€โ™€", "๐Ÿงœ๐Ÿผโ€โ™€", "๐Ÿงœ๐Ÿฝโ€โ™€", "๐Ÿงœ๐Ÿพโ€โ™€", "๐Ÿงœ๐Ÿฟโ€โ™€", "๐Ÿงœ", "๐Ÿงœ๐Ÿป", "๐Ÿงœ๐Ÿผ", "๐Ÿงœ๐Ÿฝ", "๐Ÿงœ๐Ÿพ", "๐Ÿงœ๐Ÿฟ", "๐Ÿงœโ€โ™‚", "๐Ÿงœ๐Ÿปโ€โ™‚", "๐Ÿงœ๐Ÿผโ€โ™‚", "๐Ÿงœ๐Ÿฝโ€โ™‚", "๐Ÿงœ๐Ÿพโ€โ™‚", "๐Ÿงœ๐Ÿฟโ€โ™‚", "๐Ÿงšโ€โ™€", "๐Ÿงš๐Ÿปโ€โ™€", "๐Ÿงš๐Ÿผโ€โ™€", "๐Ÿงš๐Ÿฝโ€โ™€", "๐Ÿงš๐Ÿพโ€โ™€", "๐Ÿงš๐Ÿฟโ€โ™€", "๐Ÿงš", "๐Ÿงš๐Ÿป", "๐Ÿงš๐Ÿผ", "๐Ÿงš๐Ÿฝ", "๐Ÿงš๐Ÿพ", "๐Ÿงš๐Ÿฟ", "๐Ÿงšโ€โ™‚", "๐Ÿงš๐Ÿปโ€โ™‚", "๐Ÿงš๐Ÿผโ€โ™‚", "๐Ÿงš๐Ÿฝโ€โ™‚", "๐Ÿงš๐Ÿพโ€โ™‚", "๐Ÿงš๐Ÿฟโ€โ™‚", "๐Ÿ‘ผ", "๐Ÿ‘ผ๐Ÿป", "๐Ÿ‘ผ๐Ÿผ", "๐Ÿ‘ผ๐Ÿฝ", "๐Ÿ‘ผ๐Ÿพ", "๐Ÿ‘ผ๐Ÿฟ", "๐Ÿคฐ", "๐Ÿคฐ๐Ÿป", "๐Ÿคฐ๐Ÿผ", "๐Ÿคฐ๐Ÿฝ", "๐Ÿคฐ๐Ÿพ", "๐Ÿคฐ๐Ÿฟ", "๐Ÿซ„", "๐Ÿซ„๐Ÿป", "๐Ÿซ„๐Ÿผ", "๐Ÿซ„๐Ÿฝ", "๐Ÿซ„๐Ÿพ", "๐Ÿซ„๐Ÿฟ", "๐Ÿซƒ", "๐Ÿซƒ๐Ÿป", "๐Ÿซƒ๐Ÿผ", "๐Ÿซƒ๐Ÿฝ", "๐Ÿซƒ๐Ÿพ", "๐Ÿซƒ๐Ÿฟ", "๐Ÿคฑ", "๐Ÿคฑ๐Ÿป", "๐Ÿคฑ๐Ÿผ", "๐Ÿคฑ๐Ÿฝ", "๐Ÿคฑ๐Ÿพ", "๐Ÿคฑ๐Ÿฟ", "๐Ÿ‘ฉโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿผ", "๐Ÿง‘โ€๐Ÿผ", "๐Ÿง‘๐Ÿปโ€๐Ÿผ", "๐Ÿง‘๐Ÿผโ€๐Ÿผ", "๐Ÿง‘๐Ÿฝโ€๐Ÿผ", "๐Ÿง‘๐Ÿพโ€๐Ÿผ", "๐Ÿง‘๐Ÿฟโ€๐Ÿผ", "๐Ÿ‘จโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿผ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿผ", "๐Ÿ™‡โ€โ™€", "๐Ÿ™‡๐Ÿปโ€โ™€", "๐Ÿ™‡๐Ÿผโ€โ™€", "๐Ÿ™‡๐Ÿฝโ€โ™€", "๐Ÿ™‡๐Ÿพโ€โ™€", "๐Ÿ™‡๐Ÿฟโ€โ™€", "๐Ÿ™‡", "๐Ÿ™‡๐Ÿป", "๐Ÿ™‡๐Ÿผ", "๐Ÿ™‡๐Ÿฝ", "๐Ÿ™‡๐Ÿพ", "๐Ÿ™‡๐Ÿฟ", "๐Ÿ™‡โ€โ™‚", "๐Ÿ™‡๐Ÿปโ€โ™‚", "๐Ÿ™‡๐Ÿผโ€โ™‚", "๐Ÿ™‡๐Ÿฝโ€โ™‚", "๐Ÿ™‡๐Ÿพโ€โ™‚", "๐Ÿ™‡๐Ÿฟโ€โ™‚", "๐Ÿ’โ€โ™€", "๐Ÿ’๐Ÿปโ€โ™€", "๐Ÿ’๐Ÿผโ€โ™€", "๐Ÿ’๐Ÿฝโ€โ™€", "๐Ÿ’๐Ÿพโ€โ™€", "๐Ÿ’๐Ÿฟโ€โ™€", "๐Ÿ’", "๐Ÿ’๐Ÿป", "๐Ÿ’๐Ÿผ", "๐Ÿ’๐Ÿฝ", "๐Ÿ’๐Ÿพ", "๐Ÿ’๐Ÿฟ", "๐Ÿ’โ€โ™‚", "๐Ÿ’๐Ÿปโ€โ™‚", "๐Ÿ’๐Ÿผโ€โ™‚", "๐Ÿ’๐Ÿฝโ€โ™‚", "๐Ÿ’๐Ÿพโ€โ™‚", "๐Ÿ’๐Ÿฟโ€โ™‚", "๐Ÿ™…โ€โ™€", "๐Ÿ™…๐Ÿปโ€โ™€", "๐Ÿ™…๐Ÿผโ€โ™€", "๐Ÿ™…๐Ÿฝโ€โ™€", "๐Ÿ™…๐Ÿพโ€โ™€", "๐Ÿ™…๐Ÿฟโ€โ™€", "๐Ÿ™…", "๐Ÿ™…๐Ÿป", "๐Ÿ™…๐Ÿผ", "๐Ÿ™…๐Ÿฝ", "๐Ÿ™…๐Ÿพ", "๐Ÿ™…๐Ÿฟ", "๐Ÿ™…โ€โ™‚", "๐Ÿ™…๐Ÿปโ€โ™‚", "๐Ÿ™…๐Ÿผโ€โ™‚", "๐Ÿ™…๐Ÿฝโ€โ™‚", "๐Ÿ™…๐Ÿพโ€โ™‚", "๐Ÿ™…๐Ÿฟโ€โ™‚", "๐Ÿ™†โ€โ™€", "๐Ÿ™†๐Ÿปโ€โ™€", "๐Ÿ™†๐Ÿผโ€โ™€", "๐Ÿ™†๐Ÿฝโ€โ™€", "๐Ÿ™†๐Ÿพโ€โ™€", "๐Ÿ™†๐Ÿฟโ€โ™€", "๐Ÿ™†", "๐Ÿ™†๐Ÿป", "๐Ÿ™†๐Ÿผ", "๐Ÿ™†๐Ÿฝ", "๐Ÿ™†๐Ÿพ", "๐Ÿ™†๐Ÿฟ", "๐Ÿ™†โ€โ™‚", "๐Ÿ™†๐Ÿปโ€โ™‚", "๐Ÿ™†๐Ÿผโ€โ™‚", "๐Ÿ™†๐Ÿฝโ€โ™‚", "๐Ÿ™†๐Ÿพโ€โ™‚", "๐Ÿ™†๐Ÿฟโ€โ™‚", "๐Ÿ™‹โ€โ™€", "๐Ÿ™‹๐Ÿปโ€โ™€", "๐Ÿ™‹๐Ÿผโ€โ™€", "๐Ÿ™‹๐Ÿฝโ€โ™€", "๐Ÿ™‹๐Ÿพโ€โ™€", "๐Ÿ™‹๐Ÿฟโ€โ™€", "๐Ÿ™‹", "๐Ÿ™‹๐Ÿป", "๐Ÿ™‹๐Ÿผ", "๐Ÿ™‹๐Ÿฝ", "๐Ÿ™‹๐Ÿพ", "๐Ÿ™‹๐Ÿฟ", "๐Ÿ™‹โ€โ™‚", "๐Ÿ™‹๐Ÿปโ€โ™‚", "๐Ÿ™‹๐Ÿผโ€โ™‚", "๐Ÿ™‹๐Ÿฝโ€โ™‚", "๐Ÿ™‹๐Ÿพโ€โ™‚", "๐Ÿ™‹๐Ÿฟโ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง๐Ÿปโ€โ™€", "๐Ÿง๐Ÿผโ€โ™€", "๐Ÿง๐Ÿฝโ€โ™€", "๐Ÿง๐Ÿพโ€โ™€", "๐Ÿง๐Ÿฟโ€โ™€", "๐Ÿง", "๐Ÿง๐Ÿป", "๐Ÿง๐Ÿผ", "๐Ÿง๐Ÿฝ", "๐Ÿง๐Ÿพ", "๐Ÿง๐Ÿฟ", "๐Ÿงโ€โ™‚", "๐Ÿง๐Ÿปโ€โ™‚", "๐Ÿง๐Ÿผโ€โ™‚", "๐Ÿง๐Ÿฝโ€โ™‚", "๐Ÿง๐Ÿพโ€โ™‚", "๐Ÿง๐Ÿฟโ€โ™‚", "๐Ÿคฆโ€โ™€", "๐Ÿคฆ๐Ÿปโ€โ™€", "๐Ÿคฆ๐Ÿผโ€โ™€", "๐Ÿคฆ๐Ÿฝโ€โ™€", "๐Ÿคฆ๐Ÿพโ€โ™€", "๐Ÿคฆ๐Ÿฟโ€โ™€", "๐Ÿคฆ", "๐Ÿคฆ๐Ÿป", "๐Ÿคฆ๐Ÿผ", "๐Ÿคฆ๐Ÿฝ", "๐Ÿคฆ๐Ÿพ", "๐Ÿคฆ๐Ÿฟ", "๐Ÿคฆโ€โ™‚", "๐Ÿคฆ๐Ÿปโ€โ™‚", "๐Ÿคฆ๐Ÿผโ€โ™‚", "๐Ÿคฆ๐Ÿฝโ€โ™‚", "๐Ÿคฆ๐Ÿพโ€โ™‚", "๐Ÿคฆ๐Ÿฟโ€โ™‚", "๐Ÿคทโ€โ™€", "๐Ÿคท๐Ÿปโ€โ™€", "๐Ÿคท๐Ÿผโ€โ™€", "๐Ÿคท๐Ÿฝโ€โ™€", "๐Ÿคท๐Ÿพโ€โ™€", "๐Ÿคท๐Ÿฟโ€โ™€", "๐Ÿคท", "๐Ÿคท๐Ÿป", "๐Ÿคท๐Ÿผ", "๐Ÿคท๐Ÿฝ", "๐Ÿคท๐Ÿพ", "๐Ÿคท๐Ÿฟ", "๐Ÿคทโ€โ™‚", "๐Ÿคท๐Ÿปโ€โ™‚", "๐Ÿคท๐Ÿผโ€โ™‚", "๐Ÿคท๐Ÿฝโ€โ™‚", "๐Ÿคท๐Ÿพโ€โ™‚", "๐Ÿคท๐Ÿฟโ€โ™‚", "๐Ÿ™Žโ€โ™€", "๐Ÿ™Ž๐Ÿปโ€โ™€", "๐Ÿ™Ž๐Ÿผโ€โ™€", "๐Ÿ™Ž๐Ÿฝโ€โ™€", "๐Ÿ™Ž๐Ÿพโ€โ™€", "๐Ÿ™Ž๐Ÿฟโ€โ™€", "๐Ÿ™Ž", "๐Ÿ™Ž๐Ÿป", "๐Ÿ™Ž๐Ÿผ", "๐Ÿ™Ž๐Ÿฝ", "๐Ÿ™Ž๐Ÿพ", "๐Ÿ™Ž๐Ÿฟ", "๐Ÿ™Žโ€โ™‚", "๐Ÿ™Ž๐Ÿปโ€โ™‚", "๐Ÿ™Ž๐Ÿผโ€โ™‚", "๐Ÿ™Ž๐Ÿฝโ€โ™‚", "๐Ÿ™Ž๐Ÿพโ€โ™‚", "๐Ÿ™Ž๐Ÿฟโ€โ™‚", "๐Ÿ™โ€โ™€", "๐Ÿ™๐Ÿปโ€โ™€", "๐Ÿ™๐Ÿผโ€โ™€", "๐Ÿ™๐Ÿฝโ€โ™€", "๐Ÿ™๐Ÿพโ€โ™€", "๐Ÿ™๐Ÿฟโ€โ™€", "๐Ÿ™", "๐Ÿ™๐Ÿป", "๐Ÿ™๐Ÿผ", "๐Ÿ™๐Ÿฝ", "๐Ÿ™๐Ÿพ", "๐Ÿ™๐Ÿฟ", "๐Ÿ™โ€โ™‚", "๐Ÿ™๐Ÿปโ€โ™‚", "๐Ÿ™๐Ÿผโ€โ™‚", "๐Ÿ™๐Ÿฝโ€โ™‚", "๐Ÿ™๐Ÿพโ€โ™‚", "๐Ÿ™๐Ÿฟโ€โ™‚", "๐Ÿ’‡โ€โ™€", "๐Ÿ’‡๐Ÿปโ€โ™€", "๐Ÿ’‡๐Ÿผโ€โ™€", "๐Ÿ’‡๐Ÿฝโ€โ™€", "๐Ÿ’‡๐Ÿพโ€โ™€", "๐Ÿ’‡๐Ÿฟโ€โ™€", "๐Ÿ’‡", "๐Ÿ’‡๐Ÿป", "๐Ÿ’‡๐Ÿผ", "๐Ÿ’‡๐Ÿฝ", "๐Ÿ’‡๐Ÿพ", "๐Ÿ’‡๐Ÿฟ", "๐Ÿ’‡โ€โ™‚", "๐Ÿ’‡๐Ÿปโ€โ™‚", "๐Ÿ’‡๐Ÿผโ€โ™‚", "๐Ÿ’‡๐Ÿฝโ€โ™‚", "๐Ÿ’‡๐Ÿพโ€โ™‚", "๐Ÿ’‡๐Ÿฟโ€โ™‚", "๐Ÿ’†โ€โ™€", "๐Ÿ’†๐Ÿปโ€โ™€", "๐Ÿ’†๐Ÿผโ€โ™€", "๐Ÿ’†๐Ÿฝโ€โ™€", "๐Ÿ’†๐Ÿพโ€โ™€", "๐Ÿ’†๐Ÿฟโ€โ™€", "๐Ÿ’†", "๐Ÿ’†๐Ÿป", "๐Ÿ’†๐Ÿผ", "๐Ÿ’†๐Ÿฝ", "๐Ÿ’†๐Ÿพ", "๐Ÿ’†๐Ÿฟ", "๐Ÿ’†โ€โ™‚", "๐Ÿ’†๐Ÿปโ€โ™‚", "๐Ÿ’†๐Ÿผโ€โ™‚", "๐Ÿ’†๐Ÿฝโ€โ™‚", "๐Ÿ’†๐Ÿพโ€โ™‚", "๐Ÿ’†๐Ÿฟโ€โ™‚", "๐Ÿง–โ€โ™€", "๐Ÿง–๐Ÿปโ€โ™€", "๐Ÿง–๐Ÿผโ€โ™€", "๐Ÿง–๐Ÿฝโ€โ™€", "๐Ÿง–๐Ÿพโ€โ™€", "๐Ÿง–๐Ÿฟโ€โ™€", "๐Ÿง–", "๐Ÿง–๐Ÿป", "๐Ÿง–๐Ÿผ", "๐Ÿง–๐Ÿฝ", "๐Ÿง–๐Ÿพ", "๐Ÿง–๐Ÿฟ", "๐Ÿง–โ€โ™‚", "๐Ÿง–๐Ÿปโ€โ™‚", "๐Ÿง–๐Ÿผโ€โ™‚", "๐Ÿง–๐Ÿฝโ€โ™‚", "๐Ÿง–๐Ÿพโ€โ™‚", "๐Ÿง–๐Ÿฟโ€โ™‚", "๐Ÿ’…", "๐Ÿ’…๐Ÿป", "๐Ÿ’…๐Ÿผ", "๐Ÿ’…๐Ÿฝ", "๐Ÿ’…๐Ÿพ", "๐Ÿ’…๐Ÿฟ", "๐Ÿคณ", "๐Ÿคณ๐Ÿป", "๐Ÿคณ๐Ÿผ", "๐Ÿคณ๐Ÿฝ", "๐Ÿคณ๐Ÿพ", "๐Ÿคณ๐Ÿฟ", "๐Ÿ’ƒ", "๐Ÿ’ƒ๐Ÿป", "๐Ÿ’ƒ๐Ÿผ", "๐Ÿ’ƒ๐Ÿฝ", "๐Ÿ’ƒ๐Ÿพ", "๐Ÿ’ƒ๐Ÿฟ", "๐Ÿ•บ", "๐Ÿ•บ๐Ÿป", "๐Ÿ•บ๐Ÿผ", "๐Ÿ•บ๐Ÿฝ", "๐Ÿ•บ๐Ÿพ", "๐Ÿ•บ๐Ÿฟ", "๐Ÿ‘ฏโ€โ™€", "๐Ÿ‘ฏ", "๐Ÿ‘ฏโ€โ™‚", "๐Ÿ•ด", "๐Ÿ•ด๐Ÿป", "๐Ÿ•ด๐Ÿผ", "๐Ÿ•ด๐Ÿฝ", "๐Ÿ•ด๐Ÿพ", "๐Ÿ•ด๐Ÿฟ", "๐Ÿ‘ฉโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฝ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฝ", "๐Ÿง‘โ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฝ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฝ", "๐Ÿ‘จโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฝ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฝ", "๐Ÿ‘ฉโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆผ", "๐Ÿง‘โ€๐Ÿฆผ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆผ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆผ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆผ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆผ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆผ", "๐Ÿ‘จโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆผ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆผ", "๐Ÿšถโ€โ™€", "๐Ÿšถ๐Ÿปโ€โ™€", "๐Ÿšถ๐Ÿผโ€โ™€", "๐Ÿšถ๐Ÿฝโ€โ™€", "๐Ÿšถ๐Ÿพโ€โ™€", "๐Ÿšถ๐Ÿฟโ€โ™€", "๐Ÿšถ", "๐Ÿšถ๐Ÿป", "๐Ÿšถ๐Ÿผ", "๐Ÿšถ๐Ÿฝ", "๐Ÿšถ๐Ÿพ", "๐Ÿšถ๐Ÿฟ", "๐Ÿšถโ€โ™‚", "๐Ÿšถ๐Ÿปโ€โ™‚", "๐Ÿšถ๐Ÿผโ€โ™‚", "๐Ÿšถ๐Ÿฝโ€โ™‚", "๐Ÿšถ๐Ÿพโ€โ™‚", "๐Ÿšถ๐Ÿฟโ€โ™‚", "๐Ÿ‘ฉโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฏ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฏ", "๐Ÿง‘โ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿปโ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿผโ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿพโ€๐Ÿฆฏ", "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฏ", "๐Ÿ‘จโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฏ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฏ", "๐ŸงŽโ€โ™€", "๐ŸงŽ๐Ÿปโ€โ™€", "๐ŸงŽ๐Ÿผโ€โ™€", "๐ŸงŽ๐Ÿฝโ€โ™€", "๐ŸงŽ๐Ÿพโ€โ™€", "๐ŸงŽ๐Ÿฟโ€โ™€", "๐ŸงŽ", "๐ŸงŽ๐Ÿป", "๐ŸงŽ๐Ÿผ", "๐ŸงŽ๐Ÿฝ", "๐ŸงŽ๐Ÿพ", "๐ŸงŽ๐Ÿฟ", "๐ŸงŽโ€โ™‚", "๐ŸงŽ๐Ÿปโ€โ™‚", "๐ŸงŽ๐Ÿผโ€โ™‚", "๐ŸงŽ๐Ÿฝโ€โ™‚", "๐ŸงŽ๐Ÿพโ€โ™‚", "๐ŸงŽ๐Ÿฟโ€โ™‚", "๐Ÿƒโ€โ™€", "๐Ÿƒ๐Ÿปโ€โ™€", "๐Ÿƒ๐Ÿผโ€โ™€", "๐Ÿƒ๐Ÿฝโ€โ™€", "๐Ÿƒ๐Ÿพโ€โ™€", "๐Ÿƒ๐Ÿฟโ€โ™€", "๐Ÿƒ", "๐Ÿƒ๐Ÿป", "๐Ÿƒ๐Ÿผ", "๐Ÿƒ๐Ÿฝ", "๐Ÿƒ๐Ÿพ", "๐Ÿƒ๐Ÿฟ", "๐Ÿƒโ€โ™‚", "๐Ÿƒ๐Ÿปโ€โ™‚", "๐Ÿƒ๐Ÿผโ€โ™‚", "๐Ÿƒ๐Ÿฝโ€โ™‚", "๐Ÿƒ๐Ÿพโ€โ™‚", "๐Ÿƒ๐Ÿฟโ€โ™‚", "๐Ÿงโ€โ™€", "๐Ÿง๐Ÿปโ€โ™€", "๐Ÿง๐Ÿผโ€โ™€", "๐Ÿง๐Ÿฝโ€โ™€", "๐Ÿง๐Ÿพโ€โ™€", "๐Ÿง๐Ÿฟโ€โ™€", "๐Ÿง", "๐Ÿง๐Ÿป", "๐Ÿง๐Ÿผ", "๐Ÿง๐Ÿฝ", "๐Ÿง๐Ÿพ", "๐Ÿง๐Ÿฟ", "๐Ÿงโ€โ™‚", "๐Ÿง๐Ÿปโ€โ™‚", "๐Ÿง๐Ÿผโ€โ™‚", "๐Ÿง๐Ÿฝโ€โ™‚", "๐Ÿง๐Ÿพโ€โ™‚", "๐Ÿง๐Ÿฟโ€โ™‚", "๐Ÿ‘ซ", "๐Ÿ‘ซ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ซ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ซ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ซ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ซ๐Ÿฟ", "๐Ÿ‘ญ", "๐Ÿ‘ญ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ญ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ญ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ญ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ญ๐Ÿฟ", "๐Ÿ‘ฌ", "๐Ÿ‘ฌ๐Ÿป", "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฌ๐Ÿผ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฌ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฌ๐Ÿพ", "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฌ๐Ÿฟ", "๐Ÿ‘ฉโ€โคโ€๐Ÿ‘จ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉโ€โคโ€๐Ÿ‘ฉ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ’‘", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿฟ", "๐Ÿ‘จโ€โคโ€๐Ÿ‘จ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", "๐Ÿ’", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", "๐Ÿ‘จโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ง", "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ง", "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", "๐Ÿชข", "๐Ÿงถ", "๐Ÿงต", "๐Ÿชก", "๐Ÿงฅ", "๐Ÿฅผ", "๐Ÿฆบ", "๐Ÿ‘š", "๐Ÿ‘•", "๐Ÿ‘–", "๐Ÿฉฒ", "๐Ÿฉณ", "๐Ÿ‘”", "๐Ÿ‘—", "๐Ÿ‘™", "๐Ÿฉฑ", "๐Ÿ‘˜", "๐Ÿฅป", "๐Ÿฉด", "๐Ÿฅฟ", "๐Ÿ‘ ", "๐Ÿ‘ก", "๐Ÿ‘ข", "๐Ÿ‘ž", "๐Ÿ‘Ÿ", "๐Ÿฅพ", "๐Ÿงฆ", "๐Ÿงค", "๐Ÿงฃ", "๐ŸŽฉ", "๐Ÿงข", "๐Ÿ‘’", "๐ŸŽ“", "โ›‘", "๐Ÿช–", "๐Ÿ‘‘", "๐Ÿ’", "๐Ÿ‘", "๐Ÿ‘›", "๐Ÿ‘œ", "๐Ÿ’ผ", "๐ŸŽ’", "๐Ÿงณ", "๐Ÿ‘“", "๐Ÿ•ถ", "๐Ÿฅฝ", "๐ŸŒ‚" }, new String[]{ - "๐Ÿถ", "๐Ÿฑ", "๐Ÿญ", "๐Ÿน", "๐Ÿฐ", "๐ŸฆŠ", "๐Ÿป", "๐Ÿผ", "๐Ÿปโ€โ„", "๐Ÿจ", "๐Ÿฏ", "๐Ÿฆ", "๐Ÿฎ", "๐Ÿท", "๐Ÿฝ", "๐Ÿธ", "๐Ÿต", "๐Ÿ™ˆ", "๐Ÿ™‰", "๐Ÿ™Š", "๐Ÿ’", "๐Ÿ”", "๐Ÿง", "๐Ÿฆ", "๐Ÿค", "๐Ÿฃ", "๐Ÿฅ", "๐Ÿชฟ", "๐Ÿฆ†", "๐Ÿฆโ€โฌ›", "๐Ÿฆ…", "๐Ÿฆ‰", "๐Ÿฆ‡", "๐Ÿบ", "๐Ÿ—", "๐Ÿด", "๐Ÿฆ„", "๐ŸซŽ", "๐Ÿ", "๐Ÿชฑ", "๐Ÿ›", "๐Ÿฆ‹", "๐ŸŒ", "๐Ÿž", "๐Ÿœ", "๐Ÿชฐ", "๐Ÿชฒ", "๐Ÿชณ", "๐ŸฆŸ", "๐Ÿฆ—", "๐Ÿ•ท", "๐Ÿ•ธ", "๐Ÿฆ‚", "๐Ÿข", "๐Ÿ", "๐ŸฆŽ", "๐Ÿฆ–", "๐Ÿฆ•", "๐Ÿ™", "๐Ÿฆ‘", "๐Ÿชผ", "๐Ÿฆ", "๐Ÿฆž", "๐Ÿฆ€", "๐Ÿก", "๐Ÿ ", "๐ŸŸ", "๐Ÿฌ", "๐Ÿณ", "๐Ÿ‹", "๐Ÿฆˆ", "๐Ÿฆญ", "๐ŸŠ", "๐Ÿ…", "๐Ÿ†", "๐Ÿฆ“", "๐Ÿฆ", "๐Ÿฆง", "๐Ÿฆฃ", "๐Ÿ˜", "๐Ÿฆ›", "๐Ÿฆ", "๐Ÿช", "๐Ÿซ", "๐Ÿฆ’", "๐Ÿฆ˜", "๐Ÿฆฌ", "๐Ÿƒ", "๐Ÿ‚", "๐Ÿ„", "๐Ÿซ", "๐ŸŽ", "๐Ÿ–", "๐Ÿ", "๐Ÿ‘", "๐Ÿฆ™", "๐Ÿ", "๐ŸฆŒ", "๐Ÿ•", "๐Ÿฉ", "๐Ÿฆฎ", "๐Ÿ•โ€๐Ÿฆบ", "๐Ÿˆ", "๐Ÿˆโ€โฌ›", "๐Ÿชถ", "๐Ÿชฝ", "๐Ÿ“", "๐Ÿฆƒ", "๐Ÿฆค", "๐Ÿฆš", "๐Ÿฆœ", "๐Ÿฆข", "๐Ÿฆฉ", "๐Ÿ•Š", "๐Ÿ‡", "๐Ÿฆ", "๐Ÿฆจ", "๐Ÿฆก", "๐Ÿฆซ", "๐Ÿฆฆ", "๐Ÿฆฅ", "๐Ÿ", "๐Ÿ€", "๐Ÿฟ", "๐Ÿฆ”", "๐Ÿพ", "๐Ÿ‰", "๐Ÿฒ", "๐ŸŒต", "๐ŸŽ„", "๐ŸŒฒ", "๐ŸŒณ", "๐ŸŒด", "๐Ÿชต", "๐ŸŒฑ", "๐ŸŒฟ", "โ˜˜", "๐Ÿ€", "๐ŸŽ", "๐Ÿชด", "๐ŸŽ‹", "๐Ÿƒ", "๐Ÿ‚", "๐Ÿ", "๐Ÿชบ", "๐Ÿชน", "๐Ÿ„", "๐Ÿš", "๐Ÿชธ", "๐Ÿชจ", "๐ŸŒพ", "๐Ÿ’", "๐ŸŒท", "๐ŸŒน", "๐Ÿฅ€", "๐Ÿชป", "๐Ÿชท", "๐ŸŒบ", "๐ŸŒธ", "๐ŸŒผ", "๐ŸŒป", "๐ŸŒž", "๐ŸŒ", "๐ŸŒ›", "๐ŸŒœ", "๐ŸŒš", "๐ŸŒ•", "๐ŸŒ–", "๐ŸŒ—", "๐ŸŒ˜", "๐ŸŒ‘", "๐ŸŒ’", "๐ŸŒ“", "๐ŸŒ”", "๐ŸŒ™", "๐ŸŒŽ", "๐ŸŒ", "๐ŸŒ", "๐Ÿช", "๐Ÿ’ซ", "โญ", "๐ŸŒŸ", "โœจ", "โšก", "โ˜„", "๐Ÿ’ฅ", "๐Ÿ”ฅ", "๐ŸŒช", "๐ŸŒˆ", "โ˜€", "๐ŸŒค", "โ›…", "๐ŸŒฅ", "โ˜", "๐ŸŒฆ", "๐ŸŒง", "โ›ˆ", "๐ŸŒฉ", "๐ŸŒจ", "โ„", "โ˜ƒ", "โ›„", "๐ŸŒฌ", "๐Ÿ’จ", "๐Ÿ’ง", "๐Ÿ’ฆ", "๐Ÿซง", "โ˜”", "โ˜‚", "๐ŸŒŠ", "๐ŸŒซ" + "๐Ÿถ", "๐Ÿฑ", "๐Ÿญ", "๐Ÿน", "๐Ÿฐ", "๐ŸฆŠ", "๐Ÿป", "๐Ÿผ", "๐Ÿปโ€โ„", "๐Ÿจ", "๐Ÿฏ", "๐Ÿฆ", "๐Ÿฎ", "๐Ÿท", "๐Ÿฝ", "๐Ÿธ", "๐Ÿต", "๐Ÿ™ˆ", "๐Ÿ™‰", "๐Ÿ™Š", "๐Ÿ’", "๐Ÿ”", "๐Ÿง", "๐Ÿฆ", "๐Ÿค", "๐Ÿฃ", "๐Ÿฅ", "๐Ÿชฟ", "๐Ÿฆ†", "๐Ÿฆโ€โฌ›", "๐Ÿฆ…", "๐Ÿฆ‰", "๐Ÿฆ‡", "๐Ÿบ", "๐Ÿ—", "๐Ÿด", "๐Ÿฆ„", "๐ŸซŽ", "๐Ÿ", "๐Ÿชฑ", "๐Ÿ›", "๐Ÿฆ‹", "๐ŸŒ", "๐Ÿž", "๐Ÿœ", "๐Ÿชฐ", "๐Ÿชฒ", "๐Ÿชณ", "๐ŸฆŸ", "๐Ÿฆ—", "๐Ÿ•ท", "๐Ÿ•ธ", "๐Ÿฆ‚", "๐Ÿข", "๐Ÿ", "๐ŸฆŽ", "๐Ÿฆ–", "๐Ÿฆ•", "๐Ÿ™", "๐Ÿฆ‘", "๐Ÿชผ", "๐Ÿฆ", "๐Ÿฆž", "๐Ÿฆ€", "๐Ÿก", "๐Ÿ ", "๐ŸŸ", "๐Ÿฌ", "๐Ÿณ", "๐Ÿ‹", "๐Ÿฆˆ", "๐Ÿฆญ", "๐ŸŠ", "๐Ÿ…", "๐Ÿ†", "๐Ÿฆ“", "๐Ÿฆ", "๐Ÿฆง", "๐Ÿฆฃ", "๐Ÿ˜", "๐Ÿฆ›", "๐Ÿฆ", "๐Ÿช", "๐Ÿซ", "๐Ÿฆ’", "๐Ÿฆ˜", "๐Ÿฆฌ", "๐Ÿƒ", "๐Ÿ‚", "๐Ÿ„", "๐Ÿซ", "๐ŸŽ", "๐Ÿ–", "๐Ÿ", "๐Ÿ‘", "๐Ÿฆ™", "๐Ÿ", "๐ŸฆŒ", "๐Ÿ•", "๐Ÿฉ", "๐Ÿฆฎ", "๐Ÿ•โ€๐Ÿฆบ", "๐Ÿˆ", "๐Ÿˆโ€โฌ›", "๐Ÿชถ", "๐Ÿชฝ", "๐Ÿ“", "๐Ÿฆƒ", "๐Ÿฆค", "๐Ÿฆš", "๐Ÿฆœ", "๐Ÿฆข", "๐Ÿฆฉ", "๐Ÿ•Š", "๐Ÿ‡", "๐Ÿฆ", "๐Ÿฆจ", "๐Ÿฆก", "๐Ÿฆซ", "๐Ÿฆฆ", "๐Ÿฆฅ", "๐Ÿ", "๐Ÿ€", "๐Ÿฟ", "๐Ÿฆ”", "๐Ÿพ", "๐Ÿ‰", "๐Ÿฒ", "๐Ÿฆโ€๐Ÿ”ฅ", "๐ŸŒต", "๐ŸŽ„", "๐ŸŒฒ", "๐ŸŒณ", "๐ŸŒด", "๐Ÿชต", "๐ŸŒฑ", "๐ŸŒฟ", "โ˜˜", "๐Ÿ€", "๐ŸŽ", "๐Ÿชด", "๐ŸŽ‹", "๐Ÿƒ", "๐Ÿ‚", "๐Ÿ", "๐Ÿชบ", "๐Ÿชน", "๐Ÿ„", "๐Ÿ„โ€๐ŸŸซ", "๐Ÿš", "๐Ÿชธ", "๐Ÿชจ", "๐ŸŒพ", "๐Ÿ’", "๐ŸŒท", "๐ŸŒน", "๐Ÿฅ€", "๐Ÿชป", "๐Ÿชท", "๐ŸŒบ", "๐ŸŒธ", "๐ŸŒผ", "๐ŸŒป", "๐ŸŒž", "๐ŸŒ", "๐ŸŒ›", "๐ŸŒœ", "๐ŸŒš", "๐ŸŒ•", "๐ŸŒ–", "๐ŸŒ—", "๐ŸŒ˜", "๐ŸŒ‘", "๐ŸŒ’", "๐ŸŒ“", "๐ŸŒ”", "๐ŸŒ™", "๐ŸŒŽ", "๐ŸŒ", "๐ŸŒ", "๐Ÿช", "๐Ÿ’ซ", "โญ", "๐ŸŒŸ", "โœจ", "โšก", "โ˜„", "๐Ÿ’ฅ", "๐Ÿ”ฅ", "๐ŸŒช", "๐ŸŒˆ", "โ˜€", "๐ŸŒค", "โ›…", "๐ŸŒฅ", "โ˜", "๐ŸŒฆ", "๐ŸŒง", "โ›ˆ", "๐ŸŒฉ", "๐ŸŒจ", "โ„", "โ˜ƒ", "โ›„", "๐ŸŒฌ", "๐Ÿ’จ", "๐Ÿ’ง", "๐Ÿ’ฆ", "๐Ÿซง", "โ˜”", "โ˜‚", "๐ŸŒŠ", "๐ŸŒซ" }, new String[]{ - "๐Ÿ", "๐ŸŽ", "๐Ÿ", "๐ŸŠ", "๐Ÿ‹", "๐ŸŒ", "๐Ÿ‰", "๐Ÿ‡", "๐Ÿ“", "๐Ÿซ", "๐Ÿˆ", "๐Ÿ’", "๐Ÿ‘", "๐Ÿฅญ", "๐Ÿ", "๐Ÿฅฅ", "๐Ÿฅ", "๐Ÿ…", "๐Ÿ†", "๐Ÿฅ‘", "๐Ÿซ›", "๐Ÿฅฆ", "๐Ÿฅฌ", "๐Ÿฅ’", "๐ŸŒถ", "๐Ÿซ‘", "๐ŸŒฝ", "๐Ÿฅ•", "๐Ÿซ’", "๐Ÿง„", "๐Ÿง…", "๐Ÿฅ”", "๐Ÿ ", "๐Ÿซš", "๐Ÿฅ", "๐Ÿฅฏ", "๐Ÿž", "๐Ÿฅ–", "๐Ÿฅจ", "๐Ÿง€", "๐Ÿฅš", "๐Ÿณ", "๐Ÿงˆ", "๐Ÿฅž", "๐Ÿง‡", "๐Ÿฅ“", "๐Ÿฅฉ", "๐Ÿ—", "๐Ÿ–", "๐Ÿฆด", "๐ŸŒญ", "๐Ÿ”", "๐ŸŸ", "๐Ÿ•", "๐Ÿซ“", "๐Ÿฅช", "๐Ÿฅ™", "๐Ÿง†", "๐ŸŒฎ", "๐ŸŒฏ", "๐Ÿซ”", "๐Ÿฅ—", "๐Ÿฅ˜", "๐Ÿซ•", "๐Ÿฅซ", "๐Ÿซ™", "๐Ÿ", "๐Ÿœ", "๐Ÿฒ", "๐Ÿ›", "๐Ÿฃ", "๐Ÿฑ", "๐ŸฅŸ", "๐Ÿฆช", "๐Ÿค", "๐Ÿ™", "๐Ÿš", "๐Ÿ˜", "๐Ÿฅ", "๐Ÿฅ ", "๐Ÿฅฎ", "๐Ÿข", "๐Ÿก", "๐Ÿง", "๐Ÿจ", "๐Ÿฆ", "๐Ÿฅง", "๐Ÿง", "๐Ÿฐ", "๐ŸŽ‚", "๐Ÿฎ", "๐Ÿญ", "๐Ÿฌ", "๐Ÿซ", "๐Ÿฟ", "๐Ÿฉ", "๐Ÿช", "๐ŸŒฐ", "๐Ÿฅœ", "๐Ÿซ˜", "๐Ÿฏ", "๐Ÿฅ›", "๐Ÿซ—", "๐Ÿผ", "๐Ÿซ–", "โ˜•", "๐Ÿต", "๐Ÿงƒ", "๐Ÿฅค", "๐Ÿง‹", "๐Ÿถ", "๐Ÿบ", "๐Ÿป", "๐Ÿฅ‚", "๐Ÿท", "๐Ÿฅƒ", "๐Ÿธ", "๐Ÿน", "๐Ÿง‰", "๐Ÿพ", "๐ŸงŠ", "๐Ÿฅ„", "๐Ÿด", "๐Ÿฝ", "๐Ÿฅฃ", "๐Ÿฅก", "๐Ÿฅข", "๐Ÿง‚" + "๐Ÿ", "๐ŸŽ", "๐Ÿ", "๐ŸŠ", "๐Ÿ‹", "๐Ÿ‹โ€๐ŸŸฉ", "๐ŸŒ", "๐Ÿ‰", "๐Ÿ‡", "๐Ÿ“", "๐Ÿซ", "๐Ÿˆ", "๐Ÿ’", "๐Ÿ‘", "๐Ÿฅญ", "๐Ÿ", "๐Ÿฅฅ", "๐Ÿฅ", "๐Ÿ…", "๐Ÿ†", "๐Ÿฅ‘", "๐Ÿซ›", "๐Ÿฅฆ", "๐Ÿฅฌ", "๐Ÿฅ’", "๐ŸŒถ", "๐Ÿซ‘", "๐ŸŒฝ", "๐Ÿฅ•", "๐Ÿซ’", "๐Ÿง„", "๐Ÿง…", "๐Ÿฅ”", "๐Ÿ ", "๐Ÿซš", "๐Ÿฅ", "๐Ÿฅฏ", "๐Ÿž", "๐Ÿฅ–", "๐Ÿฅจ", "๐Ÿง€", "๐Ÿฅš", "๐Ÿณ", "๐Ÿงˆ", "๐Ÿฅž", "๐Ÿง‡", "๐Ÿฅ“", "๐Ÿฅฉ", "๐Ÿ—", "๐Ÿ–", "๐Ÿฆด", "๐ŸŒญ", "๐Ÿ”", "๐ŸŸ", "๐Ÿ•", "๐Ÿซ“", "๐Ÿฅช", "๐Ÿฅ™", "๐Ÿง†", "๐ŸŒฎ", "๐ŸŒฏ", "๐Ÿซ”", "๐Ÿฅ—", "๐Ÿฅ˜", "๐Ÿซ•", "๐Ÿฅซ", "๐Ÿซ™", "๐Ÿ", "๐Ÿœ", "๐Ÿฒ", "๐Ÿ›", "๐Ÿฃ", "๐Ÿฑ", "๐ŸฅŸ", "๐Ÿฆช", "๐Ÿค", "๐Ÿ™", "๐Ÿš", "๐Ÿ˜", "๐Ÿฅ", "๐Ÿฅ ", "๐Ÿฅฎ", "๐Ÿข", "๐Ÿก", "๐Ÿง", "๐Ÿจ", "๐Ÿฆ", "๐Ÿฅง", "๐Ÿง", "๐Ÿฐ", "๐ŸŽ‚", "๐Ÿฎ", "๐Ÿญ", "๐Ÿฌ", "๐Ÿซ", "๐Ÿฟ", "๐Ÿฉ", "๐Ÿช", "๐ŸŒฐ", "๐Ÿฅœ", "๐Ÿซ˜", "๐Ÿฏ", "๐Ÿฅ›", "๐Ÿซ—", "๐Ÿผ", "๐Ÿซ–", "โ˜•", "๐Ÿต", "๐Ÿงƒ", "๐Ÿฅค", "๐Ÿง‹", "๐Ÿถ", "๐Ÿบ", "๐Ÿป", "๐Ÿฅ‚", "๐Ÿท", "๐Ÿฅƒ", "๐Ÿธ", "๐Ÿน", "๐Ÿง‰", "๐Ÿพ", "๐ŸงŠ", "๐Ÿฅ„", "๐Ÿด", "๐Ÿฝ", "๐Ÿฅฃ", "๐Ÿฅก", "๐Ÿฅข", "๐Ÿง‚" }, new String[]{ "โšฝ", "๐Ÿ€", "๐Ÿˆ", "โšพ", "๐ŸฅŽ", "๐ŸŽพ", "๐Ÿ", "๐Ÿ‰", "๐Ÿฅ", "๐ŸŽฑ", "๐Ÿช€", "๐Ÿ“", "๐Ÿธ", "๐Ÿ’", "๐Ÿ‘", "๐Ÿฅ", "๐Ÿ", "๐Ÿชƒ", "๐Ÿฅ…", "โ›ณ", "๐Ÿช", "๐Ÿ›", "๐Ÿน", "๐ŸŽฃ", "๐Ÿคฟ", "๐ŸฅŠ", "๐Ÿฅ‹", "๐ŸŽฝ", "๐Ÿ›น", "๐Ÿ›ผ", "๐Ÿ›ท", "โ›ธ", "๐ŸฅŒ", "๐ŸŽฟ", "โ›ท", "๐Ÿ‚", "๐Ÿช‚", "๐Ÿ‹โ€โ™€", "๐Ÿ‹๐Ÿปโ€โ™€", "๐Ÿ‹๐Ÿผโ€โ™€", "๐Ÿ‹๐Ÿฝโ€โ™€", "๐Ÿ‹๐Ÿพโ€โ™€", "๐Ÿ‹๐Ÿฟโ€โ™€", "๐Ÿ‹", "๐Ÿ‹๐Ÿป", "๐Ÿ‹๐Ÿผ", "๐Ÿ‹๐Ÿฝ", "๐Ÿ‹๐Ÿพ", "๐Ÿ‹๐Ÿฟ", "๐Ÿ‹โ€โ™‚", "๐Ÿ‹๐Ÿปโ€โ™‚", "๐Ÿ‹๐Ÿผโ€โ™‚", "๐Ÿ‹๐Ÿฝโ€โ™‚", "๐Ÿ‹๐Ÿพโ€โ™‚", "๐Ÿ‹๐Ÿฟโ€โ™‚", "๐Ÿคผโ€โ™€", "๐Ÿคผ", "๐Ÿคผโ€โ™‚", "๐Ÿคธโ€โ™€", "๐Ÿคธ๐Ÿปโ€โ™€", "๐Ÿคธ๐Ÿผโ€โ™€", "๐Ÿคธ๐Ÿฝโ€โ™€", "๐Ÿคธ๐Ÿพโ€โ™€", "๐Ÿคธ๐Ÿฟโ€โ™€", "๐Ÿคธ", "๐Ÿคธ๐Ÿป", "๐Ÿคธ๐Ÿผ", "๐Ÿคธ๐Ÿฝ", "๐Ÿคธ๐Ÿพ", "๐Ÿคธ๐Ÿฟ", "๐Ÿคธโ€โ™‚", "๐Ÿคธ๐Ÿปโ€โ™‚", "๐Ÿคธ๐Ÿผโ€โ™‚", "๐Ÿคธ๐Ÿฝโ€โ™‚", "๐Ÿคธ๐Ÿพโ€โ™‚", "๐Ÿคธ๐Ÿฟโ€โ™‚", "โ›นโ€โ™€", "โ›น๐Ÿปโ€โ™€", "โ›น๐Ÿผโ€โ™€", "โ›น๐Ÿฝโ€โ™€", "โ›น๐Ÿพโ€โ™€", "โ›น๐Ÿฟโ€โ™€", "โ›น", "โ›น๐Ÿป", "โ›น๐Ÿผ", "โ›น๐Ÿฝ", "โ›น๐Ÿพ", "โ›น๐Ÿฟ", "โ›นโ€โ™‚", "โ›น๐Ÿปโ€โ™‚", "โ›น๐Ÿผโ€โ™‚", "โ›น๐Ÿฝโ€โ™‚", "โ›น๐Ÿพโ€โ™‚", "โ›น๐Ÿฟโ€โ™‚", "๐Ÿคบ", "๐Ÿคพโ€โ™€", "๐Ÿคพ๐Ÿปโ€โ™€", "๐Ÿคพ๐Ÿผโ€โ™€", "๐Ÿคพ๐Ÿฝโ€โ™€", "๐Ÿคพ๐Ÿพโ€โ™€", "๐Ÿคพ๐Ÿฟโ€โ™€", "๐Ÿคพ", "๐Ÿคพ๐Ÿป", "๐Ÿคพ๐Ÿผ", "๐Ÿคพ๐Ÿฝ", "๐Ÿคพ๐Ÿพ", "๐Ÿคพ๐Ÿฟ", "๐Ÿคพโ€โ™‚", "๐Ÿคพ๐Ÿปโ€โ™‚", "๐Ÿคพ๐Ÿผโ€โ™‚", "๐Ÿคพ๐Ÿฝโ€โ™‚", "๐Ÿคพ๐Ÿพโ€โ™‚", "๐Ÿคพ๐Ÿฟโ€โ™‚", "๐ŸŒโ€โ™€", "๐ŸŒ๐Ÿปโ€โ™€", "๐ŸŒ๐Ÿผโ€โ™€", "๐ŸŒ๐Ÿฝโ€โ™€", "๐ŸŒ๐Ÿพโ€โ™€", "๐ŸŒ๐Ÿฟโ€โ™€", "๐ŸŒ", "๐ŸŒ๐Ÿป", "๐ŸŒ๐Ÿผ", "๐ŸŒ๐Ÿฝ", "๐ŸŒ๐Ÿพ", "๐ŸŒ๐Ÿฟ", "๐ŸŒโ€โ™‚", "๐ŸŒ๐Ÿปโ€โ™‚", "๐ŸŒ๐Ÿผโ€โ™‚", "๐ŸŒ๐Ÿฝโ€โ™‚", "๐ŸŒ๐Ÿพโ€โ™‚", "๐ŸŒ๐Ÿฟโ€โ™‚", "๐Ÿ‡", "๐Ÿ‡๐Ÿป", "๐Ÿ‡๐Ÿผ", "๐Ÿ‡๐Ÿฝ", "๐Ÿ‡๐Ÿพ", "๐Ÿ‡๐Ÿฟ", "๐Ÿง˜โ€โ™€", "๐Ÿง˜๐Ÿปโ€โ™€", "๐Ÿง˜๐Ÿผโ€โ™€", "๐Ÿง˜๐Ÿฝโ€โ™€", "๐Ÿง˜๐Ÿพโ€โ™€", "๐Ÿง˜๐Ÿฟโ€โ™€", "๐Ÿง˜", "๐Ÿง˜๐Ÿป", "๐Ÿง˜๐Ÿผ", "๐Ÿง˜๐Ÿฝ", "๐Ÿง˜๐Ÿพ", "๐Ÿง˜๐Ÿฟ", "๐Ÿง˜โ€โ™‚", "๐Ÿง˜๐Ÿปโ€โ™‚", "๐Ÿง˜๐Ÿผโ€โ™‚", "๐Ÿง˜๐Ÿฝโ€โ™‚", "๐Ÿง˜๐Ÿพโ€โ™‚", "๐Ÿง˜๐Ÿฟโ€โ™‚", "๐Ÿ„โ€โ™€", "๐Ÿ„๐Ÿปโ€โ™€", "๐Ÿ„๐Ÿผโ€โ™€", "๐Ÿ„๐Ÿฝโ€โ™€", "๐Ÿ„๐Ÿพโ€โ™€", "๐Ÿ„๐Ÿฟโ€โ™€", "๐Ÿ„", "๐Ÿ„๐Ÿป", "๐Ÿ„๐Ÿผ", "๐Ÿ„๐Ÿฝ", "๐Ÿ„๐Ÿพ", "๐Ÿ„๐Ÿฟ", "๐Ÿ„โ€โ™‚", "๐Ÿ„๐Ÿปโ€โ™‚", "๐Ÿ„๐Ÿผโ€โ™‚", "๐Ÿ„๐Ÿฝโ€โ™‚", "๐Ÿ„๐Ÿพโ€โ™‚", "๐Ÿ„๐Ÿฟโ€โ™‚", "๐ŸŠโ€โ™€", "๐ŸŠ๐Ÿปโ€โ™€", "๐ŸŠ๐Ÿผโ€โ™€", "๐ŸŠ๐Ÿฝโ€โ™€", "๐ŸŠ๐Ÿพโ€โ™€", "๐ŸŠ๐Ÿฟโ€โ™€", "๐ŸŠ", "๐ŸŠ๐Ÿป", "๐ŸŠ๐Ÿผ", "๐ŸŠ๐Ÿฝ", "๐ŸŠ๐Ÿพ", "๐ŸŠ๐Ÿฟ", "๐ŸŠโ€โ™‚", "๐ŸŠ๐Ÿปโ€โ™‚", "๐ŸŠ๐Ÿผโ€โ™‚", "๐ŸŠ๐Ÿฝโ€โ™‚", "๐ŸŠ๐Ÿพโ€โ™‚", "๐ŸŠ๐Ÿฟโ€โ™‚", "๐Ÿคฝโ€โ™€", "๐Ÿคฝ๐Ÿปโ€โ™€", "๐Ÿคฝ๐Ÿผโ€โ™€", "๐Ÿคฝ๐Ÿฝโ€โ™€", "๐Ÿคฝ๐Ÿพโ€โ™€", "๐Ÿคฝ๐Ÿฟโ€โ™€", "๐Ÿคฝ", "๐Ÿคฝ๐Ÿป", "๐Ÿคฝ๐Ÿผ", "๐Ÿคฝ๐Ÿฝ", "๐Ÿคฝ๐Ÿพ", "๐Ÿคฝ๐Ÿฟ", "๐Ÿคฝโ€โ™‚", "๐Ÿคฝ๐Ÿปโ€โ™‚", "๐Ÿคฝ๐Ÿผโ€โ™‚", "๐Ÿคฝ๐Ÿฝโ€โ™‚", "๐Ÿคฝ๐Ÿพโ€โ™‚", "๐Ÿคฝ๐Ÿฟโ€โ™‚", "๐Ÿšฃโ€โ™€", "๐Ÿšฃ๐Ÿปโ€โ™€", "๐Ÿšฃ๐Ÿผโ€โ™€", "๐Ÿšฃ๐Ÿฝโ€โ™€", "๐Ÿšฃ๐Ÿพโ€โ™€", "๐Ÿšฃ๐Ÿฟโ€โ™€", "๐Ÿšฃ", "๐Ÿšฃ๐Ÿป", "๐Ÿšฃ๐Ÿผ", "๐Ÿšฃ๐Ÿฝ", "๐Ÿšฃ๐Ÿพ", "๐Ÿšฃ๐Ÿฟ", "๐Ÿšฃโ€โ™‚", "๐Ÿšฃ๐Ÿปโ€โ™‚", "๐Ÿšฃ๐Ÿผโ€โ™‚", "๐Ÿšฃ๐Ÿฝโ€โ™‚", "๐Ÿšฃ๐Ÿพโ€โ™‚", "๐Ÿšฃ๐Ÿฟโ€โ™‚", "๐Ÿง—โ€โ™€", "๐Ÿง—๐Ÿปโ€โ™€", "๐Ÿง—๐Ÿผโ€โ™€", "๐Ÿง—๐Ÿฝโ€โ™€", "๐Ÿง—๐Ÿพโ€โ™€", "๐Ÿง—๐Ÿฟโ€โ™€", "๐Ÿง—", "๐Ÿง—๐Ÿป", "๐Ÿง—๐Ÿผ", "๐Ÿง—๐Ÿฝ", "๐Ÿง—๐Ÿพ", "๐Ÿง—๐Ÿฟ", "๐Ÿง—โ€โ™‚", "๐Ÿง—๐Ÿปโ€โ™‚", "๐Ÿง—๐Ÿผโ€โ™‚", "๐Ÿง—๐Ÿฝโ€โ™‚", "๐Ÿง—๐Ÿพโ€โ™‚", "๐Ÿง—๐Ÿฟโ€โ™‚", "๐Ÿšตโ€โ™€", "๐Ÿšต๐Ÿปโ€โ™€", "๐Ÿšต๐Ÿผโ€โ™€", "๐Ÿšต๐Ÿฝโ€โ™€", "๐Ÿšต๐Ÿพโ€โ™€", "๐Ÿšต๐Ÿฟโ€โ™€", "๐Ÿšต", "๐Ÿšต๐Ÿป", "๐Ÿšต๐Ÿผ", "๐Ÿšต๐Ÿฝ", "๐Ÿšต๐Ÿพ", "๐Ÿšต๐Ÿฟ", "๐Ÿšตโ€โ™‚", "๐Ÿšต๐Ÿปโ€โ™‚", "๐Ÿšต๐Ÿผโ€โ™‚", "๐Ÿšต๐Ÿฝโ€โ™‚", "๐Ÿšต๐Ÿพโ€โ™‚", "๐Ÿšต๐Ÿฟโ€โ™‚", "๐Ÿšดโ€โ™€", "๐Ÿšด๐Ÿปโ€โ™€", "๐Ÿšด๐Ÿผโ€โ™€", "๐Ÿšด๐Ÿฝโ€โ™€", "๐Ÿšด๐Ÿพโ€โ™€", "๐Ÿšด๐Ÿฟโ€โ™€", "๐Ÿšด", "๐Ÿšด๐Ÿป", "๐Ÿšด๐Ÿผ", "๐Ÿšด๐Ÿฝ", "๐Ÿšด๐Ÿพ", "๐Ÿšด๐Ÿฟ", "๐Ÿšดโ€โ™‚", "๐Ÿšด๐Ÿปโ€โ™‚", "๐Ÿšด๐Ÿผโ€โ™‚", "๐Ÿšด๐Ÿฝโ€โ™‚", "๐Ÿšด๐Ÿพโ€โ™‚", "๐Ÿšด๐Ÿฟโ€โ™‚", "๐Ÿ†", "๐Ÿฅ‡", "๐Ÿฅˆ", "๐Ÿฅ‰", "๐Ÿ…", "๐ŸŽ–", "๐Ÿต", "๐ŸŽ—", "๐ŸŽซ", "๐ŸŽŸ", "๐ŸŽช", "๐Ÿคนโ€โ™€", "๐Ÿคน๐Ÿปโ€โ™€", "๐Ÿคน๐Ÿผโ€โ™€", "๐Ÿคน๐Ÿฝโ€โ™€", "๐Ÿคน๐Ÿพโ€โ™€", "๐Ÿคน๐Ÿฟโ€โ™€", "๐Ÿคน", "๐Ÿคน๐Ÿป", "๐Ÿคน๐Ÿผ", "๐Ÿคน๐Ÿฝ", "๐Ÿคน๐Ÿพ", "๐Ÿคน๐Ÿฟ", "๐Ÿคนโ€โ™‚", "๐Ÿคน๐Ÿปโ€โ™‚", "๐Ÿคน๐Ÿผโ€โ™‚", "๐Ÿคน๐Ÿฝโ€โ™‚", "๐Ÿคน๐Ÿพโ€โ™‚", "๐Ÿคน๐Ÿฟโ€โ™‚", "๐ŸŽญ", "๐Ÿฉฐ", "๐ŸŽจ", "๐ŸŽฌ", "๐ŸŽค", "๐ŸŽง", "๐ŸŽผ", "๐ŸŽน", "๐Ÿช‡", "๐Ÿฅ", "๐Ÿช˜", "๐ŸŽท", "๐ŸŽบ", "๐Ÿช—", "๐ŸŽธ", "๐Ÿช•", "๐ŸŽป", "๐Ÿชˆ", "๐ŸŽฒ", "โ™Ÿ", "๐ŸŽฏ", "๐ŸŽณ", "๐ŸŽฎ", "๐ŸŽฐ", "๐Ÿงฉ" @@ -518,7 +503,7 @@ public class EmojiData { "๐Ÿš—", "๐Ÿš•", "๐Ÿš™", "๐ŸšŒ", "๐ŸšŽ", "๐ŸŽ", "๐Ÿš“", "๐Ÿš‘", "๐Ÿš’", "๐Ÿš", "๐Ÿ›ป", "๐Ÿšš", "๐Ÿš›", "๐Ÿšœ", "๐Ÿฆฏ", "๐Ÿฆฝ", "๐Ÿฆผ", "๐Ÿฉผ", "๐Ÿ›ด", "๐Ÿšฒ", "๐Ÿ›ต", "๐Ÿ", "๐Ÿ›บ", "๐Ÿ›ž", "๐Ÿšจ", "๐Ÿš”", "๐Ÿš", "๐Ÿš˜", "๐Ÿš–", "๐Ÿšก", "๐Ÿš ", "๐ŸšŸ", "๐Ÿšƒ", "๐Ÿš‹", "๐Ÿšž", "๐Ÿš", "๐Ÿš„", "๐Ÿš…", "๐Ÿšˆ", "๐Ÿš‚", "๐Ÿš†", "๐Ÿš‡", "๐ŸšŠ", "๐Ÿš‰", "โœˆ", "๐Ÿ›ซ", "๐Ÿ›ฌ", "๐Ÿ›ฉ", "๐Ÿ’บ", "๐Ÿ›ฐ", "๐Ÿš€", "๐Ÿ›ธ", "๐Ÿš", "๐Ÿ›ถ", "โ›ต", "๐Ÿšค", "๐Ÿ›ฅ", "๐Ÿ›ณ", "โ›ด", "๐Ÿšข", "๐Ÿ›Ÿ", "โš“", "๐Ÿช", "โ›ฝ", "๐Ÿšง", "๐Ÿšฆ", "๐Ÿšฅ", "๐Ÿš", "๐Ÿ—บ", "๐Ÿ—ฟ", "๐Ÿ—ฝ", "๐Ÿ—ผ", "๐Ÿฐ", "๐Ÿฏ", "๐ŸŸ", "๐ŸŽก", "๐ŸŽข", "๐ŸŽ ", "โ›ฒ", "โ›ฑ", "๐Ÿ–", "๐Ÿ", "๐Ÿœ", "๐ŸŒ‹", "โ›ฐ", "๐Ÿ”", "๐Ÿ—ป", "๐Ÿ•", "โ›บ", "๐Ÿ›–", "๐Ÿ ", "๐Ÿก", "๐Ÿ˜", "๐Ÿš", "๐Ÿ—", "๐Ÿญ", "๐Ÿข", "๐Ÿฌ", "๐Ÿฃ", "๐Ÿค", "๐Ÿฅ", "๐Ÿฆ", "๐Ÿจ", "๐Ÿช", "๐Ÿซ", "๐Ÿฉ", "๐Ÿ’’", "๐Ÿ›", "โ›ช", "๐Ÿ•Œ", "๐Ÿ•", "๐Ÿ›•", "๐Ÿ•‹", "โ›ฉ", "๐Ÿ›ค", "๐Ÿ›ฃ", "๐Ÿ—พ", "๐ŸŽ‘", "๐Ÿž", "๐ŸŒ…", "๐ŸŒ„", "๐ŸŒ ", "๐ŸŽ‡", "๐ŸŽ†", "๐ŸŒ‡", "๐ŸŒ†", "๐Ÿ™", "๐ŸŒƒ", "๐ŸŒŒ", "๐ŸŒ‰", "๐ŸŒ" }, new String[]{ - "โŒš", "๐Ÿ“ฑ", "๐Ÿ“ฒ", "๐Ÿ’ป", "โŒจ", "๐Ÿ–ฅ", "๐Ÿ–จ", "๐Ÿ–ฑ", "๐Ÿ–ฒ", "๐Ÿ•น", "๐Ÿ—œ", "๐Ÿ’ฝ", "๐Ÿ’พ", "๐Ÿ’ฟ", "๐Ÿ“€", "๐Ÿ“ผ", "๐Ÿ“ท", "๐Ÿ“ธ", "๐Ÿ“น", "๐ŸŽฅ", "๐Ÿ“ฝ", "๐ŸŽž", "๐Ÿ“ž", "โ˜Ž", "๐Ÿ“Ÿ", "๐Ÿ“ ", "๐Ÿ“บ", "๐Ÿ“ป", "๐ŸŽ™", "๐ŸŽš", "๐ŸŽ›", "๐Ÿงญ", "โฑ", "โฒ", "โฐ", "๐Ÿ•ฐ", "โŒ›", "โณ", "๐Ÿ“ก", "๐Ÿ”‹", "๐Ÿชซ", "๐Ÿ”Œ", "๐Ÿ’ก", "๐Ÿ”ฆ", "๐Ÿ•ฏ", "๐Ÿช”", "๐Ÿงฏ", "๐Ÿ›ข", "๐Ÿ’ธ", "๐Ÿ’ต", "๐Ÿ’ด", "๐Ÿ’ถ", "๐Ÿ’ท", "๐Ÿช™", "๐Ÿ’ฐ", "๐Ÿ’ณ", "๐Ÿชช", "๐Ÿ’Ž", "โš–", "๐Ÿชœ", "๐Ÿงฐ", "๐Ÿช›", "๐Ÿ”ง", "๐Ÿ”จ", "โš’", "๐Ÿ› ", "โ›", "๐Ÿชš", "๐Ÿ”ฉ", "โš™", "๐Ÿชค", "๐Ÿงฑ", "โ›“", "๐Ÿงฒ", "๐Ÿ”ซ", "๐Ÿ’ฃ", "๐Ÿงจ", "๐Ÿช“", "๐Ÿ”ช", "๐Ÿ—ก", "โš”", "๐Ÿ›ก", "๐Ÿšฌ", "โšฐ", "๐Ÿชฆ", "โšฑ", "๐Ÿบ", "๐Ÿ”ฎ", "๐Ÿ“ฟ", "๐Ÿงฟ", "๐Ÿชฌ", "๐Ÿ’ˆ", "โš—", "๐Ÿ”ญ", "๐Ÿ”ฌ", "๐Ÿ•ณ๏ธ", "๐Ÿฉป", "๐Ÿฉน", "๐Ÿฉบ", "๐Ÿ’Š", "๐Ÿ’‰", "๐Ÿฉธ", "๐Ÿงฌ", "๐Ÿฆ ", "๐Ÿงซ", "๐Ÿงช", "๐ŸŒก", "๐Ÿงน", "๐Ÿช ", "๐Ÿงบ", "๐Ÿงป", "๐Ÿšฝ", "๐Ÿšฐ", "๐Ÿšฟ", "๐Ÿ›", "๐Ÿ›€", "๐Ÿ›€๐Ÿป", "๐Ÿ›€๐Ÿผ", "๐Ÿ›€๐Ÿฝ", "๐Ÿ›€๐Ÿพ", "๐Ÿ›€๐Ÿฟ", "๐Ÿงผ", "๐Ÿชฅ", "๐Ÿช’", "๐Ÿชฎ", "๐Ÿงฝ", "๐Ÿชฃ", "๐Ÿงด", "๐Ÿ›Ž", "๐Ÿ”‘", "๐Ÿ—", "๐Ÿšช", "๐Ÿช‘", "๐Ÿ›‹", "๐Ÿ›", "๐Ÿ›Œ", "๐Ÿงธ", "๐Ÿช†", "๐Ÿ–ผ", "๐Ÿชž", "๐ŸชŸ", "๐Ÿ›", "๐Ÿ›’", "๐ŸŽ", "๐ŸŽˆ", "๐ŸŽ", "๐ŸŽ€", "๐Ÿช„", "๐Ÿช…", "๐ŸŽŠ", "๐ŸŽ‰", "๐ŸŽŽ", "๐Ÿชญ", "๐Ÿฎ", "๐ŸŽ", "๐Ÿชฉ", "๐Ÿงง", "โœ‰", "๐Ÿ“ฉ", "๐Ÿ“จ", "๐Ÿ“ง", "๐Ÿ’Œ", "๐Ÿ“ฅ", "๐Ÿ“ค", "๐Ÿ“ฆ", "๐Ÿท", "๐Ÿชง", "๐Ÿ“ช", "๐Ÿ“ซ", "๐Ÿ“ฌ", "๐Ÿ“ญ", "๐Ÿ“ฎ", "๐Ÿ“ฏ", "๐Ÿ“œ", "๐Ÿ“ƒ", "๐Ÿ“„", "๐Ÿ“‘", "๐Ÿงพ", "๐Ÿ“Š", "๐Ÿ“ˆ", "๐Ÿ“‰", "๐Ÿ—’", "๐Ÿ—“", "๐Ÿ“†", "๐Ÿ“…", "๐Ÿ—‘", "๐Ÿ“‡", "๐Ÿ—ƒ", "๐Ÿ—ณ", "๐Ÿ—„", "๐Ÿ“‹", "๐Ÿ“", "๐Ÿ“‚", "๐Ÿ—‚", "๐Ÿ—ž", "๐Ÿ“ฐ", "๐Ÿ““", "๐Ÿ“”", "๐Ÿ“’", "๐Ÿ“•", "๐Ÿ“—", "๐Ÿ“˜", "๐Ÿ“™", "๐Ÿ“š", "๐Ÿ“–", "๐Ÿ”–", "๐Ÿงท", "๐Ÿ”—", "๐Ÿ“Ž", "๐Ÿ–‡", "๐Ÿ“", "๐Ÿ“", "๐Ÿงฎ", "๐Ÿ“Œ", "๐Ÿ“", "โœ‚", "๐Ÿ–Š", "๐Ÿ–‹", "โœ’", "๐Ÿ–Œ", "๐Ÿ–", "๐Ÿ“", "โœ", "๐Ÿ”", "๐Ÿ”Ž", "๐Ÿ”", "๐Ÿ”", "๐Ÿ”’", "๐Ÿ”“" + "โŒš", "๐Ÿ“ฑ", "๐Ÿ“ฒ", "๐Ÿ’ป", "โŒจ", "๐Ÿ–ฅ", "๐Ÿ–จ", "๐Ÿ–ฑ", "๐Ÿ–ฒ", "๐Ÿ•น", "๐Ÿ—œ", "๐Ÿ’ฝ", "๐Ÿ’พ", "๐Ÿ’ฟ", "๐Ÿ“€", "๐Ÿ“ผ", "๐Ÿ“ท", "๐Ÿ“ธ", "๐Ÿ“น", "๐ŸŽฅ", "๐Ÿ“ฝ", "๐ŸŽž", "๐Ÿ“ž", "โ˜Ž", "๐Ÿ“Ÿ", "๐Ÿ“ ", "๐Ÿ“บ", "๐Ÿ“ป", "๐ŸŽ™", "๐ŸŽš", "๐ŸŽ›", "๐Ÿงญ", "โฑ", "โฒ", "โฐ", "๐Ÿ•ฐ", "โŒ›", "โณ", "๐Ÿ“ก", "๐Ÿ”‹", "๐Ÿชซ", "๐Ÿ”Œ", "๐Ÿ’ก", "๐Ÿ”ฆ", "๐Ÿ•ฏ", "๐Ÿช”", "๐Ÿงฏ", "๐Ÿ›ข", "๐Ÿ’ธ", "๐Ÿ’ต", "๐Ÿ’ด", "๐Ÿ’ถ", "๐Ÿ’ท", "๐Ÿช™", "๐Ÿ’ฐ", "๐Ÿ’ณ", "๐Ÿชช", "๐Ÿ’Ž", "โš–", "๐Ÿชœ", "๐Ÿงฐ", "๐Ÿช›", "๐Ÿ”ง", "๐Ÿ”จ", "โš’", "๐Ÿ› ", "โ›", "๐Ÿชš", "๐Ÿ”ฉ", "โš™", "๐Ÿชค", "๐Ÿงฑ", "โ›“", "โ›“โ€๐Ÿ’ฅ", "๐Ÿงฒ", "๐Ÿ”ซ", "๐Ÿ’ฃ", "๐Ÿงจ", "๐Ÿช“", "๐Ÿ”ช", "๐Ÿ—ก", "โš”", "๐Ÿ›ก", "๐Ÿšฌ", "โšฐ", "๐Ÿชฆ", "โšฑ", "๐Ÿบ", "๐Ÿ”ฎ", "๐Ÿ“ฟ", "๐Ÿงฟ", "๐Ÿชฌ", "๐Ÿ’ˆ", "โš—", "๐Ÿ”ญ", "๐Ÿ”ฌ", "๐Ÿ•ณ๏ธ", "๐Ÿฉป", "๐Ÿฉน", "๐Ÿฉบ", "๐Ÿ’Š", "๐Ÿ’‰", "๐Ÿฉธ", "๐Ÿงฌ", "๐Ÿฆ ", "๐Ÿงซ", "๐Ÿงช", "๐ŸŒก", "๐Ÿงน", "๐Ÿช ", "๐Ÿงบ", "๐Ÿงป", "๐Ÿšฝ", "๐Ÿšฐ", "๐Ÿšฟ", "๐Ÿ›", "๐Ÿ›€", "๐Ÿ›€๐Ÿป", "๐Ÿ›€๐Ÿผ", "๐Ÿ›€๐Ÿฝ", "๐Ÿ›€๐Ÿพ", "๐Ÿ›€๐Ÿฟ", "๐Ÿงผ", "๐Ÿชฅ", "๐Ÿช’", "๐Ÿชฎ", "๐Ÿงฝ", "๐Ÿชฃ", "๐Ÿงด", "๐Ÿ›Ž", "๐Ÿ”‘", "๐Ÿ—", "๐Ÿšช", "๐Ÿช‘", "๐Ÿ›‹", "๐Ÿ›", "๐Ÿ›Œ", "๐Ÿงธ", "๐Ÿช†", "๐Ÿ–ผ", "๐Ÿชž", "๐ŸชŸ", "๐Ÿ›", "๐Ÿ›’", "๐ŸŽ", "๐ŸŽˆ", "๐ŸŽ", "๐ŸŽ€", "๐Ÿช„", "๐Ÿช…", "๐ŸŽŠ", "๐ŸŽ‰", "๐ŸŽŽ", "๐Ÿชญ", "๐Ÿฎ", "๐ŸŽ", "๐Ÿชฉ", "๐Ÿงง", "โœ‰", "๐Ÿ“ฉ", "๐Ÿ“จ", "๐Ÿ“ง", "๐Ÿ’Œ", "๐Ÿ“ฅ", "๐Ÿ“ค", "๐Ÿ“ฆ", "๐Ÿท", "๐Ÿชง", "๐Ÿ“ช", "๐Ÿ“ซ", "๐Ÿ“ฌ", "๐Ÿ“ญ", "๐Ÿ“ฎ", "๐Ÿ“ฏ", "๐Ÿ“œ", "๐Ÿ“ƒ", "๐Ÿ“„", "๐Ÿ“‘", "๐Ÿงพ", "๐Ÿ“Š", "๐Ÿ“ˆ", "๐Ÿ“‰", "๐Ÿ—’", "๐Ÿ—“", "๐Ÿ“†", "๐Ÿ“…", "๐Ÿ—‘", "๐Ÿ“‡", "๐Ÿ—ƒ", "๐Ÿ—ณ", "๐Ÿ—„", "๐Ÿ“‹", "๐Ÿ“", "๐Ÿ“‚", "๐Ÿ—‚", "๐Ÿ—ž", "๐Ÿ“ฐ", "๐Ÿ““", "๐Ÿ“”", "๐Ÿ“’", "๐Ÿ“•", "๐Ÿ“—", "๐Ÿ“˜", "๐Ÿ“™", "๐Ÿ“š", "๐Ÿ“–", "๐Ÿ”–", "๐Ÿงท", "๐Ÿ”—", "๐Ÿ“Ž", "๐Ÿ–‡", "๐Ÿ“", "๐Ÿ“", "๐Ÿงฎ", "๐Ÿ“Œ", "๐Ÿ“", "โœ‚", "๐Ÿ–Š", "๐Ÿ–‹", "โœ’", "๐Ÿ–Œ", "๐Ÿ–", "๐Ÿ“", "โœ", "๐Ÿ”", "๐Ÿ”Ž", "๐Ÿ”", "๐Ÿ”", "๐Ÿ”’", "๐Ÿ”“" }, new String[]{ "๐Ÿฉท", "โค", "๐Ÿงก", "๐Ÿ’›", "๐Ÿ’š", "๐Ÿฉต", "๐Ÿ’™", "๐Ÿ’œ", "๐Ÿ–ค", "๐Ÿฉถ", "๐Ÿค", "๐ŸคŽ", "๐Ÿ’”", "โคโ€๐Ÿ”ฅ", "โคโ€๐Ÿฉน", "โฃ", "๐Ÿ’•", "๐Ÿ’ž", "๐Ÿ’“", "๐Ÿ’—", "๐Ÿ’–", "๐Ÿ’˜", "๐Ÿ’", "๐Ÿ’Ÿ", "โ˜ฎ", "โœ", "โ˜ช", "๐Ÿ•‰", "โ˜ธ", "๐Ÿชฏ", "โœก", "๐Ÿ”ฏ", "๐Ÿ•Ž", "โ˜ฏ", "โ˜ฆ", "๐Ÿ›", "โ›Ž", "โ™ˆ", "โ™‰", "โ™Š", "โ™‹", "โ™Œ", "โ™", "โ™Ž", "โ™", "โ™", "โ™‘", "โ™’", "โ™“", "๐Ÿ†”", "โš›", "๐Ÿ‰‘", "โ˜ข", "โ˜ฃ", "๐Ÿ“ด", "๐Ÿ“ณ", "๐Ÿˆถ", "๐Ÿˆš", "๐Ÿˆธ", "๐Ÿˆบ", "๐Ÿˆท", "โœด", "๐Ÿ†š", "๐Ÿ’ฎ", "๐Ÿ‰", "ใŠ™", "ใŠ—", "๐Ÿˆด", "๐Ÿˆต", "๐Ÿˆน", "๐Ÿˆฒ", "๐Ÿ…ฐ", "๐Ÿ…ฑ", "๐Ÿ†Ž", "๐Ÿ†‘", "๐Ÿ…พ", "๐Ÿ†˜", "โŒ", "โญ•", "๐Ÿ›‘", "โ›”", "๐Ÿ“›", "๐Ÿšซ", "๐Ÿ’ฏ", "๐Ÿ’ข", "โ™จ", "๐Ÿšท", "๐Ÿšฏ", "๐Ÿšณ", "๐Ÿšฑ", "๐Ÿ”ž", "๐Ÿ“ต", "๐Ÿšญ", "โ—", "โ•", "โ“", "โ”", "โ€ผ", "โ‰", "๐Ÿ”…", "๐Ÿ”†", "ใ€ฝ", "โš ", "๐Ÿšธ", "๐Ÿ”ฑ", "โšœ", "๐Ÿ”ฐ", "โ™ป", "โœ…", "๐Ÿˆฏ", "๐Ÿ’น", "โ‡", "โœณ", "โŽ", "๐ŸŒ", "๐Ÿ’ ", "โ“‚", "๐ŸŒ€", "๐Ÿ’ค", "๐Ÿง", "๐Ÿšพ", "โ™ฟ", "๐Ÿ…ฟ", "๐Ÿ›—", "๐Ÿˆณ", "๐Ÿˆ‚", "๐Ÿ›‚", "๐Ÿ›ƒ", "๐Ÿ›„", "๐Ÿ›…", "๐Ÿ›œ", "๐Ÿšน", "๐Ÿšบ", "๐Ÿšผ", "โšง", "๐Ÿšป", "๐Ÿšฎ", "๐ŸŽฆ", "๐Ÿ“ถ", "๐Ÿˆ", "๐Ÿ”ฃ", "โ„น", "๐Ÿ”ค", "๐Ÿ”ก", "๐Ÿ” ", "๐Ÿ†–", "๐Ÿ†—", "๐Ÿ†™", "๐Ÿ†’", "๐Ÿ†•", "๐Ÿ†“", "0โƒฃ", "1โƒฃ", "2โƒฃ", "3โƒฃ", "4โƒฃ", "5โƒฃ", "6โƒฃ", "7โƒฃ", "8โƒฃ", "9โƒฃ", "๐Ÿ”Ÿ", "๐Ÿ”ข", "#โƒฃ", "*โƒฃ", "โ", "โ–ถ", "โธ", "โฏ", "โน", "โบ", "โญ", "โฎ", "โฉ", "โช", "โซ", "โฌ", "โ—€", "๐Ÿ”ผ", "๐Ÿ”ฝ", "โžก", "โฌ…", "โฌ†", "โฌ‡", "โ†—", "โ†˜", "โ†™", "โ†–", "โ†•", "โ†”", "โ†ช", "โ†ฉ", "โคด", "โคต", "๐Ÿ”€", "๐Ÿ”", "๐Ÿ”‚", "๐Ÿ”„", "๐Ÿ”ƒ", "๐ŸŽต", "๐ŸŽถ", "โž•", "โž–", "โž—", "โœ–", "๐ŸŸฐ", "โ™พ", "๐Ÿ’ฒ", "๐Ÿ’ฑ", "โ„ข๏ธ", "ยฉ", "ยฎ", "๐Ÿ‘โ€๐Ÿ—จ", "๐Ÿ”š", "๐Ÿ”™", "๐Ÿ”›", "๐Ÿ”", "๐Ÿ”œ", "ใ€ฐ", "โžฐ", "โžฟ", "โœ”", "โ˜‘", "๐Ÿ”˜", "๐Ÿ”ด", "๐ŸŸ ", "๐ŸŸก", "๐ŸŸข", "๐Ÿ”ต", "๐ŸŸฃ", "โšซ", "โšช", "๐ŸŸค", "๐Ÿ”บ", "๐Ÿ”ป", "๐Ÿ”ธ", "๐Ÿ”น", "๐Ÿ”ถ", "๐Ÿ”ท", "๐Ÿ”ณ", "๐Ÿ”ฒ", "โ–ช", "โ–ซ", "โ—พ", "โ—ฝ", "โ—ผ", "โ—ป", "๐ŸŸฅ", "๐ŸŸง", "๐ŸŸจ", "๐ŸŸฉ", "๐ŸŸฆ", "๐ŸŸช", "โฌ›", "โฌœ", "๐ŸŸซ", "๐Ÿ”ˆ", "๐Ÿ”‡", "๐Ÿ”‰", "๐Ÿ”Š", "๐Ÿ””", "๐Ÿ”•", "๐Ÿ“ฃ", "๐Ÿ“ข", "๐Ÿ’ฌ", "๐Ÿ’ญ", "๐Ÿ—ฏ", "โ™ ", "โ™ฃ", "โ™ฅ", "โ™ฆ", "๐Ÿƒ", "๐ŸŽด", "๐Ÿ€„", "๐Ÿ•", "๐Ÿ•‘", "๐Ÿ•’", "๐Ÿ•“", "๐Ÿ•”", "๐Ÿ••", "๐Ÿ•–", "๐Ÿ•—", "๐Ÿ•˜", "๐Ÿ•™", "๐Ÿ•š", "๐Ÿ•›", "๐Ÿ•œ", "๐Ÿ•", "๐Ÿ•ž", "๐Ÿ•Ÿ", "๐Ÿ• ", "๐Ÿ•ก", "๐Ÿ•ข", "๐Ÿ•ฃ", "๐Ÿ•ค", "๐Ÿ•ฅ", "๐Ÿ•ฆ", "๐Ÿ•ง" diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/EmuDetector.java b/TMessagesProj/src/main/java/org/telegram/messenger/EmuDetector.java index a7d34375e..807e2348c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/EmuDetector.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/EmuDetector.java @@ -7,12 +7,12 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Build; -import androidx.core.content.ContextCompat; - import android.os.Environment; import android.telephony.TelephonyManager; import android.text.TextUtils; +import androidx.core.content.ContextCompat; + import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @@ -215,6 +215,7 @@ public class EmuDetector { || Build.HARDWARE.toLowerCase().contains("vbox86") || Build.HARDWARE.toLowerCase().contains("android_x86") || Build.HARDWARE.toLowerCase().contains("nox") + || Build.HARDWARE.toLowerCase().contains("ranchu") || Build.PRODUCT.equals("sdk") || Build.PRODUCT.equals("google_sdk") || Build.PRODUCT.equals("sdk_x86") diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java index e13e9975f..d5faa892b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java @@ -49,6 +49,7 @@ public class FileLoadOperation { private Runnable fileWriteRunnable; public boolean isStory; + public volatile boolean caughtPremiumFloodWait; public void setStream(FileLoadOperationStream stream, boolean streamPriority, long streamOffset) { FileLog.e("FileLoadOperation " + getFileName() + " setStream(" + stream + ")"); this.stream = stream; @@ -95,10 +96,10 @@ public class FileLoadOperation { } protected static class RequestInfo { + public int requestToken; public long requestStartTime; public int chunkSize; public int connectionType; - private int requestToken; private long offset; private TLRPC.TL_upload_file response; private TLRPC.TL_upload_webFile responseWeb; @@ -239,7 +240,7 @@ public class FileLoadOperation { private byte[] cdnCheckBytes; private boolean requestingCdnOffsets; - private ArrayList requestInfos; + public ArrayList requestInfos; private ArrayList cancelledRequestInfos; private ArrayList delayedRequestInfos; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java index aefe3e522..7219cecf8 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java @@ -679,6 +679,50 @@ public class FileLoader extends BaseController { } } + public FileUploadOperation findUploadOperationByRequestToken(final int requestToken) { + for (FileUploadOperation operation : uploadOperationPaths.values()) { + if (operation == null) continue; + for (int i = 0; i < operation.requestTokens.size(); ++i) { + if (operation.requestTokens.valueAt(i) == requestToken) { + return operation; + } + } + } + return null; + } + + public boolean checkUploadCaughtPremiumFloodWait(final String filename) { + if (filename == null) return false; + FileUploadOperation operation = uploadOperationPaths.get(filename); + if (operation != null && operation.caughtPremiumFloodWait) { + operation.caughtPremiumFloodWait = false; + return true; + } + return false; + } + + public FileLoadOperation findLoadOperationByRequestToken(final int requestToken) { + for (FileLoadOperation operation : loadOperationPaths.values()) { + if (operation == null || operation.requestInfos == null) continue; + for (FileLoadOperation.RequestInfo requestInfo : operation.requestInfos) { + if (requestInfo.requestToken == requestToken) { + return operation; + } + } + } + return null; + } + + public boolean checkLoadCaughtPremiumFloodWait(final String filename) { + if (filename == null) return false; + FileLoadOperation operation = loadOperationPaths.get(filename); + if (operation != null && operation.caughtPremiumFloodWait) { + operation.caughtPremiumFloodWait = false; + return true; + } + return false; + } + public boolean isLoadingFile(final String fileName) { return fileName != null && loadOperationPathsUI.containsKey(fileName); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java index 4ddee0a30..8cbabbf9d 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLog.java @@ -16,6 +16,10 @@ import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; import org.telegram.messenger.time.FastDateFormat; import org.telegram.messenger.video.MediaCodecVideoConvertor; @@ -28,6 +32,8 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; +import java.lang.reflect.Field; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashSet; import java.util.Locale; @@ -73,6 +79,7 @@ public class FileLog { private static Gson gson; + private static ExclusionStrategy exclusionStrategy; private static HashSet excludeRequests; public static void dumpResponseAndRequest(int account, TLObject request, TLObject response, TLRPC.TL_error error, long requestMsgId, long startRequestTimeInMillis, int requestToken) { @@ -119,7 +126,7 @@ public class FileLog { } } - public static void dumpUnparsedMessage(TLObject message, long messageId) { + public static void dumpUnparsedMessage(TLObject message, long messageId, int account) { if (!BuildVars.DEBUG_PRIVATE_VERSION || !BuildVars.LOGS_ENABLED || message == null) { return; } @@ -131,7 +138,7 @@ public class FileLog { long time = System.currentTimeMillis(); FileLog.getInstance().logQueue.postRunnable(() -> { try { - String metadata = getInstance().dateFormat.format(time);// + " msgId=" + messageId; + String metadata = getInstance().dateFormat.format(time) + " msgId=" + messageId + " account=" + account; FileLog.getInstance().tlStreamWriter.write(metadata); FileLog.getInstance().tlStreamWriter.write("\n"); @@ -139,7 +146,7 @@ public class FileLog { FileLog.getInstance().tlStreamWriter.write("\n\n"); FileLog.getInstance().tlStreamWriter.flush(); - Log.d(mtproto_tag, "msgId=" + messageId); + Log.d(mtproto_tag, "msgId=" + messageId + " account=" + account); Log.d(mtproto_tag, messageStr); Log.d(mtproto_tag, " "); } catch (Exception e) { @@ -155,9 +162,10 @@ public class FileLog { gsonDisabled = disable; } + private static HashSet privateFields; private static void checkGson() { if (gson == null) { - HashSet privateFields = new HashSet<>(); + privateFields = new HashSet<>(); privateFields.add("message"); privateFields.add("phone"); privateFields.add("about"); @@ -171,13 +179,14 @@ public class FileLog { privateFields.add("disableFree"); privateFields.add("mContext"); privateFields.add("priority"); + privateFields.add("constructor"); //exclude file loading excludeRequests = new HashSet<>(); excludeRequests.add("TL_upload_getFile"); excludeRequests.add("TL_upload_getWebFile"); - ExclusionStrategy strategy = new ExclusionStrategy() { + exclusionStrategy = new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { @@ -192,10 +201,49 @@ public class FileLog { return clazz.isInstance(DispatchQueue.class) || clazz.isInstance(AnimatedFileDrawable.class) || clazz.isInstance(ColorStateList.class) || clazz.isInstance(Context.class); } }; - gson = new GsonBuilder().addSerializationExclusionStrategy(strategy).registerTypeAdapterFactory(RuntimeClassNameTypeAdapterFactory.of(TLObject.class, "type_", strategy)).create(); + gson = new GsonBuilder() + .addSerializationExclusionStrategy(exclusionStrategy) + .registerTypeAdapterFactory(RuntimeClassNameTypeAdapterFactory.of(TLObject.class, "type_", exclusionStrategy)) + .registerTypeHierarchyAdapter(TLObject.class, new TLObjectDeserializer()) + .create(); } } + private static class TLObjectDeserializer implements JsonSerializer { + @Override + public JsonElement serialize(TLObject src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject jsonObj = new JsonObject(); + String className = src.getClass().getName(); + final String usualPrefix = "org.telegram.tgnet."; + if (className.startsWith(usualPrefix)) { + className = className.substring(usualPrefix.length()); + } + jsonObj.addProperty("_", className); + try { + Field[] fields = src.getClass().getFields(); + for (Field field : fields) { + if (privateFields != null && privateFields.contains(field.getName())) continue; + field.setAccessible(true); + try { + Object value = field.get(src); + if (value != null) { + Class clazz = value.getClass(); + if (clazz.isInstance(DispatchQueue.class) || clazz.isInstance(AnimatedFileDrawable.class) || clazz.isInstance(ColorStateList.class) || clazz.isInstance(Context.class)) { + continue; + } + } + JsonElement jsonElement = context.serialize(value); + jsonObj.add(field.getName(), jsonElement); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return jsonObj; + } + } public void init() { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java index e1338e8ab..a3a075a31 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java @@ -53,7 +53,7 @@ public class FileUploadOperation { private int state; private byte[] readBuffer; private FileUploadOperationDelegate delegate; - private SparseIntArray requestTokens = new SparseIntArray(); + public final SparseIntArray requestTokens = new SparseIntArray(); private int currentPartNum; private long currentFileId; private long totalFileSize; @@ -83,6 +83,8 @@ public class FileUploadOperation { private boolean[] recalculatedEstimatedSize = {false, false}; protected long lastProgressUpdateTime; + public volatile boolean caughtPremiumFloodWait; + public interface FileUploadOperationDelegate { void didFinishUploadingFile(FileUploadOperation operation, TLRPC.InputFile inputFile, TLRPC.InputEncryptedFile inputEncryptedFile, byte[] key, byte[] iv); void didFailedUploadingFile(FileUploadOperation operation); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java index 04c2b17c9..12cc0c901 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java @@ -4139,7 +4139,16 @@ public class ImageLoader { location = (TLRPC.TL_fileLocationToBeDeprecated) photoSize.location; } - String fileName = location.volume_id + "_" + location.local_id + ".jpg"; + String external = ".jpg"; + switch (compressFormat) { + case WEBP: + case WEBP_LOSSY: + case WEBP_LOSSLESS: + external = ".webp"; + break; + } + + String fileName = location.volume_id + "_" + location.local_id + external; File fileDir; if (forceCacheDir) { fileDir = FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLocation.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLocation.java index 287a6d5bf..a3cd2c707 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLocation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLocation.java @@ -239,8 +239,10 @@ public class ImageLocation { return null; } ImageLocation imageLocation = getForPhoto(photoSize.location, photoSize.size, null, null, null, TYPE_SMALL, sticker.dc_id, stickerSet, photoSize.type); - if (MessageObject.isAnimatedStickerDocument(sticker, true)) { + if (photoSize.type.equalsIgnoreCase("a")) { imageLocation.imageType = FileLoader.IMAGE_TYPE_LOTTIE; + } else if (photoSize.type.equalsIgnoreCase("v")) { + imageLocation.imageType = FileLoader.IMAGE_TYPE_ANIMATION; } imageLocation.thumbVersion = thumbVersion; return imageLocation; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java index 661318cf2..61025ff2b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageReceiver.java @@ -95,6 +95,10 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg default void onAnimationReady(ImageReceiver imageReceiver) { } + + default void didSetImageBitmap(int type, String key, Drawable drawable) { + + } } public static class BitmapHolder { @@ -2249,6 +2253,10 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg return currentImageDrawable != null || currentMediaDrawable != null || currentThumbDrawable != null || staticThumbDrawable != null || currentImageKey != null || currentMediaKey != null; } + public boolean hasMediaSet() { + return currentMediaDrawable != null; + } + public boolean hasBitmapImage() { return currentImageDrawable != null || currentThumbDrawable != null || staticThumbDrawable != null || currentMediaDrawable != null; } @@ -2680,6 +2688,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (!key.equals(currentImageKey)) { return false; } + if (delegate != null) { + delegate.didSetImageBitmap(type, key, drawable); + } boolean allowCrossFade = true; if (!(drawable instanceof AnimatedFileDrawable)) { ImageLoader.getInstance().incrementUseCount(currentImageKey); @@ -2731,6 +2742,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (!key.equals(currentMediaKey)) { return false; } + if (delegate != null) { + delegate.didSetImageBitmap(type, key, drawable); + } if (!(drawable instanceof AnimatedFileDrawable)) { ImageLoader.getInstance().incrementUseCount(currentMediaKey); } else { @@ -2784,6 +2798,9 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg if (!key.equals(currentThumbKey)) { return false; } + if (delegate != null) { + delegate.didSetImageBitmap(type, key, drawable); + } ImageLoader.getInstance().incrementUseCount(currentThumbKey); currentThumbDrawable = drawable; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java index 50d831d7a..5cc54f1e4 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java @@ -2488,6 +2488,10 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, }); } + public boolean hasNoNextVoiceOrRoundVideoMessage() { + return playingMessageObject == null || (!playingMessageObject.isVoice() && !playingMessageObject.isRoundVideo()) || voiceMessagesPlaylist == null || voiceMessagesPlaylist.size() <= 1 || !voiceMessagesPlaylist.contains(playingMessageObject) || voiceMessagesPlaylist.indexOf(playingMessageObject) >= (voiceMessagesPlaylist.size() - 1); + } + public void playNextMessage() { playNextMessageWithoutOrder(false); } @@ -2910,7 +2914,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, playCount[0]++; } } else { - cleanupPlayer(true, true, true, false); + cleanupPlayer(true, hasNoNextVoiceOrRoundVideoMessage(), true, false); } } } @@ -3233,7 +3237,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, lastProgress = 0; audioInfo = null; playingMessageObject = messageObject; - if (playingMessageObject.isMusic()) { + if (canStartMusicPlayerService()) { Intent intent = new Intent(ApplicationLoader.applicationContext, MusicPlayerService.class); try { /*if (Build.VERSION.SDK_INT >= 26) { @@ -3438,7 +3442,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, if (!playlist.isEmpty() && (playlist.size() > 1 || !messageObject.isVoice())) { playNextMessageWithoutOrder(true); } else { - cleanupPlayer(true, true, messageObject.isVoice(), false); + cleanupPlayer(true, hasNoNextVoiceOrRoundVideoMessage(), messageObject.isVoice(), false); } } else if (audioPlayer != null && seekToProgressPending != 0 && (playbackState == ExoPlayer.STATE_READY || playbackState == ExoPlayer.STATE_IDLE)) { int seekTo = (int) (audioPlayer.getDuration() * seekToProgressPending); @@ -3625,8 +3629,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, FileLog.e(e2); } } - - if (playingMessageObject != null && playingMessageObject.isMusic()) { + if (canStartMusicPlayerService()) { Intent intent = new Intent(ApplicationLoader.applicationContext, MusicPlayerService.class); try { /*if (Build.VERSION.SDK_INT >= 26) { @@ -3644,6 +3647,10 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, return true; } + + private boolean canStartMusicPlayerService() { + return playingMessageObject != null && (playingMessageObject.isMusic() || playingMessageObject.isVoice() || playingMessageObject.isRoundVideo()) && !playingMessageObject.isVoiceOnce() && !playingMessageObject.isRoundOnce(); + } public void updateSilent(boolean value) { isSilent = value; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java index 5c2a949a5..c16094d77 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java @@ -66,12 +66,12 @@ import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; -import org.telegram.ui.Components.BotWebViewSheet; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.ChatThemeBottomSheet; import org.telegram.ui.Components.QuoteSpan; import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble; import org.telegram.ui.Components.StickerSetBulletinLayout; +import org.telegram.ui.Components.StickersAlert; import org.telegram.ui.Components.StickersArchiveAlert; import org.telegram.ui.Components.TextStyleSpan; import org.telegram.ui.Components.URLSpanReplacement; @@ -878,11 +878,19 @@ public class MediaDataController extends BaseController { } public ArrayList getRecentStickers(int type) { + return getRecentStickers(type, false); + } + + public ArrayList getRecentStickers(int type, boolean firstEmpty) { ArrayList arrayList = recentStickers[type]; if (type == TYPE_PREMIUM_STICKERS) { return new ArrayList<>(recentStickers[type]); } - return new ArrayList<>(arrayList.subList(0, Math.min(arrayList.size(), 20))); + ArrayList result = new ArrayList<>(arrayList.subList(0, Math.min(arrayList.size(), 20))); + if (firstEmpty && !result.isEmpty() && !StickersAlert.DISABLE_STICKER_EDITOR) { + result.add(0, new TLRPC.TL_documentEmpty()); + } + return result; } public ArrayList getRecentStickersNoCopy(int type) { @@ -1207,6 +1215,16 @@ public class MediaDataController extends BaseController { return null; } + public static TLRPC.TL_inputStickerSetItem getInputStickerSetItem(TLRPC.Document document, String emoji) { + TLRPC.TL_inputStickerSetItem item = new TLRPC.TL_inputStickerSetItem(); + item.document = new TLRPC.TL_inputDocument(); + item.document.id = document.id; + item.document.access_hash = document.access_hash; + item.document.file_reference = document.file_reference; + item.emoji = emoji; + return item; + } + public void setPlaceholderImage(BackupImageView imageView, String setName, String emoji, String filter) { TLRPC.InputStickerSet inputStickerSet = new TLRPC.TL_inputStickerSetShortName(); inputStickerSet.short_name = setName; @@ -1242,6 +1260,10 @@ public class MediaDataController extends BaseController { } public TLRPC.TL_messages_stickerSet getStickerSet(TLRPC.InputStickerSet inputStickerSet, Integer hash, boolean cacheOnly, Utilities.Callback onResponse) { + return getStickerSet(inputStickerSet, hash, cacheOnly, false, onResponse); + } + + public TLRPC.TL_messages_stickerSet getStickerSet(TLRPC.InputStickerSet inputStickerSet, Integer hash, boolean cacheOnly, boolean runWhenRemote, Utilities.Callback onResponse) { if (inputStickerSet == null) { return null; } @@ -1256,7 +1278,7 @@ public class MediaDataController extends BaseController { cacheSet = stickerSetDefaultChannelStatuses; } if (cacheSet != null) { - if (onResponse != null) { + if (!runWhenRemote && onResponse != null) { onResponse.run(cacheSet); } return cacheSet; @@ -1289,6 +1311,34 @@ public class MediaDataController extends BaseController { } }); }); + } else if (inputStickerSet instanceof TLRPC.TL_inputStickerSetShortName) { + getMessagesStorage().getStorageQueue().postRunnable(() -> { + TLRPC.TL_messages_stickerSet cachedSet = getCachedStickerSetInternal(inputStickerSet.short_name.toLowerCase(), hash); + AndroidUtilities.runOnUIThread(() -> { + if (cachedSet != null) { + if (onResponse != null) { + onResponse.run(cachedSet); + } + if (cachedSet.set != null) { + stickerSetsById.put(cachedSet.set.id, cachedSet); + stickerSetsByName.put(cachedSet.set.short_name.toLowerCase(), cachedSet); + } + getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, cachedSet.set.id, cachedSet); + } else { + fetchStickerSetInternal(inputStickerSet, (ok, set) -> { + if (onResponse != null) { + onResponse.run(set); + } + if (set != null && set.set != null) { + stickerSetsById.put(set.set.id, set); + stickerSetsByName.put(set.set.short_name.toLowerCase(), set); + saveStickerSetIntoCache(set); + getNotificationCenter().postNotificationName(NotificationCenter.groupStickersDidLoad, set.set.id, set); + } + }); + } + }); + }); } else if (!cacheOnly) { fetchStickerSetInternal(inputStickerSet, (ok, set) -> { if (onResponse != null) { @@ -1335,7 +1385,7 @@ public class MediaDataController extends BaseController { } getMessagesStorage().getStorageQueue().postRunnable(() -> { try { - SQLitePreparedStatement state = getMessagesStorage().getDatabase().executeFast("REPLACE INTO stickersets2 VALUES(?, ?, ?, ?)"); + SQLitePreparedStatement state = getMessagesStorage().getDatabase().executeFast("REPLACE INTO stickersets2 VALUES(?, ?, ?, ?, ?)"); state.requery(); NativeByteBuffer data = new NativeByteBuffer(set.getObjectSize()); set.serializeToStream(data); @@ -1343,6 +1393,7 @@ public class MediaDataController extends BaseController { state.bindByteBuffer(2, data); state.bindInteger(3, set.set.hash); state.bindLong(4, System.currentTimeMillis()); + state.bindString(5, set.set.short_name == null ? "" : set.set.short_name.toLowerCase()); state.step(); data.reuse(); state.dispose(); @@ -1358,7 +1409,37 @@ public class MediaDataController extends BaseController { SQLiteCursor cursor = null; NativeByteBuffer data = null; try { - cursor = getMessagesStorage().getDatabase().queryFinalized("SELECT data, hash FROM stickersets2 WHERE id = " + id + " LIMIT 1"); + cursor = getMessagesStorage().getDatabase().queryFinalized("SELECT data, hash FROM stickersets2 WHERE id = ? LIMIT 1", id); + if (cursor.next() && !cursor.isNull(0)) { + data = cursor.byteBufferValue(0); + if (data != null) { + set = TLRPC.TL_messages_stickerSet.TLdeserialize(data, data.readInt32(false), false); + int cachedHash = cursor.intValue(1); + if (hash != null && hash != 0 && hash != cachedHash) { + return null; + } + } + } + } catch (Throwable e) { + FileLog.e(e); + } finally { + if (data != null) { + data.reuse(); + } + if (cursor != null) { + cursor.dispose(); + } + } + return set; + } + + + private TLRPC.TL_messages_stickerSet getCachedStickerSetInternal(String short_name, Integer hash) { + TLRPC.TL_messages_stickerSet set = null; + SQLiteCursor cursor = null; + NativeByteBuffer data = null; + try { + cursor = getMessagesStorage().getDatabase().queryFinalized("SELECT data, hash FROM stickersets2 WHERE short_name = ? LIMIT 1", short_name); if (cursor.next() && !cursor.isNull(0)) { data = cursor.byteBufferValue(0); if (data != null) { @@ -2588,7 +2669,7 @@ public class MediaDataController extends BaseController { private void processLoadedDiceStickers(String name, boolean isEmoji, TLRPC.TL_messages_stickerSet res, boolean cache, int date) { AndroidUtilities.runOnUIThread(() -> loadingDiceStickerSets.remove(name)); Utilities.stageQueue.postRunnable(() -> { - if (cache && (res == null || Math.abs(System.currentTimeMillis() / 1000 - date) >= 60 * 60 * 24) || !cache && res == null) { + if (cache && (res == null || Math.abs(System.currentTimeMillis() / 1000 - date) >= 60 * 60 * 24)) { AndroidUtilities.runOnUIThread(() -> loadStickersByEmojiOrName(name, isEmoji, false), res == null && !cache ? 1000 : 0); if (res == null) { return; @@ -3119,6 +3200,7 @@ public class MediaDataController extends BaseController { currentIndex = a; stickerSets[type].remove(a); if (toggle == 2) { + set.set.title = stickerSet.title; stickerSets[type].add(0, set); } else if (forget) { stickerSetsById.remove(set.set.id); @@ -5242,8 +5324,8 @@ public class MediaDataController extends BaseController { return shortcutIntent; } - private Intent createIntrnalAttachedBotShortcutIntent(long botId, int botType) { - if (botId == 0 || botType != BotWebViewSheet.TYPE_WEB_VIEW_BOT_APP) { + private Intent createIntrnalAttachedBotShortcutIntent(long botId) { + if (botId == 0 || !canCreateAttachedMenuBotShortcut(botId)) { return null; } Intent shortcutIntent = new Intent(ApplicationLoader.applicationContext, OpenAttachedMenuBotReceiver.class); @@ -5260,7 +5342,7 @@ public class MediaDataController extends BaseController { public void installShortcut(long dialogId, int type) { try { - Intent shortcutIntent = type == SHORTCUT_TYPE_USER_OR_CHAT ? createIntrnalShortcutIntent(dialogId) : createIntrnalAttachedBotShortcutIntent(dialogId, BotWebViewSheet.TYPE_WEB_VIEW_BOT_APP); + Intent shortcutIntent = type == SHORTCUT_TYPE_USER_OR_CHAT ? createIntrnalShortcutIntent(dialogId) : createIntrnalAttachedBotShortcutIntent(dialogId); if (shortcutIntent == null) { return; } @@ -5474,7 +5556,7 @@ public class MediaDataController extends BaseController { name = chat.title; } - Intent shortcutIntent = type == SHORTCUT_TYPE_USER_OR_CHAT ? createIntrnalShortcutIntent(dialogId) : createIntrnalAttachedBotShortcutIntent(dialogId, BotWebViewSheet.TYPE_WEB_VIEW_BOT_APP); + Intent shortcutIntent = type == SHORTCUT_TYPE_USER_OR_CHAT ? createIntrnalShortcutIntent(dialogId) : createIntrnalAttachedBotShortcutIntent(dialogId); Intent addIntent = new Intent(); addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name); @@ -5501,6 +5583,15 @@ public class MediaDataController extends BaseController { } return false; } + + public boolean canCreateAttachedMenuBotShortcut(long botId) { + for (int i = 0; i < attachMenuBots.bots.size(); i++) { + if (attachMenuBots.bots.get(i).bot_id == botId) { + return attachMenuBots.bots.get(i).show_in_side_menu && !isShortcutAdded(botId, MediaDataController.SHORTCUT_TYPE_ATTACHED_BOT); + } + } + return false; + } //---------------- SEARCH END ---------------- private static Comparator entityComparator = (entity1, entity2) -> { @@ -6731,7 +6822,9 @@ public class MediaDataController extends BaseController { if (endMessage.length() > 0 && endMessage.charAt(0) != '\n') { endMessage = AndroidUtilities.concat("\n", endMessage); } + boolean contentWasTruncated = false; if (content.length() > 0 && content.charAt(content.length() - 1) == '\n') { + contentWasTruncated = true; content = substring(content, 0, content.length() - 1); } if (!TextUtils.isEmpty(content)) { @@ -6742,7 +6835,7 @@ public class MediaDataController extends BaseController { message[0] = AndroidUtilities.concat(startMessage, content, endMessage); TLRPC.TL_messageEntityPre entity = new TLRPC.TL_messageEntityPre(); entity.offset = start + (replacedFirst ? 0 : 1); - entity.length = index - start - 3 - (language.length() + (!language.isEmpty() ? 1 : 0)) + (replacedFirst ? 0 : 1); + entity.length = index - start - 3 - (language.length() + (!language.isEmpty() ? 1 : 0)) + (replacedFirst ? 0 : 1) - (contentWasTruncated ? 1 : 0); entity.language = TextUtils.isEmpty(language) || language.trim().length() == 0 ? "" : language; entities.add(entity); lastIndex -= 6; @@ -6947,6 +7040,44 @@ public class MediaDataController extends BaseController { return entities; } + public static boolean entitiesEqual(TLRPC.MessageEntity entity1, TLRPC.MessageEntity entity2) { + if (entity1.getClass() != entity2.getClass() || + entity1.offset != entity2.offset || + entity1.length != entity2.length || + !TextUtils.equals(entity1.url, entity2.url) || + !TextUtils.equals(entity1.language, entity2.language)) { + return false; + } + if (entity1 instanceof TLRPC.TL_inputMessageEntityMentionName && ((TLRPC.TL_inputMessageEntityMentionName) entity1).user_id != ((TLRPC.TL_inputMessageEntityMentionName) entity2).user_id) { + return false; + } + if (entity1 instanceof TLRPC.TL_messageEntityMentionName && ((TLRPC.TL_messageEntityMentionName) entity1).user_id != ((TLRPC.TL_messageEntityMentionName) entity2).user_id) { + return false; + } + if (entity1 instanceof TLRPC.TL_messageEntityCustomEmoji && ((TLRPC.TL_messageEntityCustomEmoji) entity1).document_id != ((TLRPC.TL_messageEntityCustomEmoji) entity2).document_id) { + return false; + } + + return true; + } + + public static boolean entitiesEqual(ArrayList entities1, ArrayList entities2) { + if (entities1.size() != entities2.size()) { + return false; + } + + for (int i = 0; i < entities1.size(); i++) { + TLRPC.MessageEntity entity1 = entities1.get(i); + TLRPC.MessageEntity entity2 = entities2.get(i); + + if (!MediaDataController.entitiesEqual(entity1, entity2)) { + return false; + } + } + + return true; + } + private CharSequence parsePattern(CharSequence cs, Pattern pattern, ArrayList entities, GenericProvider entityProvider) { Matcher m = pattern.matcher(cs); int offset = 0; @@ -9092,7 +9223,7 @@ public class MediaDataController extends BaseController { public LongSparseArray draftVoices = new LongSparseArray<>(); private void loadDraftVoiceMessages() { if (draftVoicesLoaded) return; - SharedPreferences prefs = ApplicationLoader.applicationContext.getSharedPreferences("voicedrafts_" + currentAccount, Context.MODE_PRIVATE); + SharedPreferences prefs = ApplicationLoader.applicationContext.getSharedPreferences("2voicedrafts_" + currentAccount, Context.MODE_PRIVATE); Set> entries = prefs.getAll().entrySet(); draftVoices.clear(); for (Map.Entry entry : entries) { @@ -9108,12 +9239,12 @@ public class MediaDataController extends BaseController { DraftVoice draft = getDraftVoice(dialog_id, topic_id); if (draft != null && draft.once != once) { draft.once = once; - SharedPreferences prefs = ApplicationLoader.applicationContext.getSharedPreferences("voicedrafts_" + currentAccount, Context.MODE_PRIVATE); + SharedPreferences prefs = ApplicationLoader.applicationContext.getSharedPreferences("2voicedrafts_" + currentAccount, Context.MODE_PRIVATE); prefs.edit().putString(Objects.hash(dialog_id, topic_id) + "", draft.toString()).apply(); } } public void pushDraftVoiceMessage(long dialog_id, long topic_id, DraftVoice draft) { - SharedPreferences prefs = ApplicationLoader.applicationContext.getSharedPreferences("voicedrafts_" + currentAccount, Context.MODE_PRIVATE); + SharedPreferences prefs = ApplicationLoader.applicationContext.getSharedPreferences("2voicedrafts_" + currentAccount, Context.MODE_PRIVATE); final long hash = Objects.hash(dialog_id, topic_id); final String key = hash + ""; if (draft == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java index 633ec9a1c..705e12107 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java @@ -214,6 +214,7 @@ public class MessageObject { public TLRPC.TL_sponsoredWebPage sponsoredWebPage; public TLRPC.BotApp sponsoredBotApp; public String sponsoredButtonText; + public boolean sponsoredCanReport; public boolean replyTextEllipsized; public boolean replyTextRevealed; public int overrideLinkColor = -1; @@ -3673,7 +3674,7 @@ public class MessageObject { boolean notReadyYet = videoEditedInfo != null && videoEditedInfo.notReadyYet; if (messageOwner.message != null && (messageOwner.id < 0 || isEditing()) && messageOwner.params != null) { String param; - if ((param = messageOwner.params.get("ve")) != null && (isVideo() || isNewGif() || isRoundVideo())) { + if ((param = messageOwner.params.get("ve")) != null && (isVideo() || isNewGif() || isRoundVideo() || isVideoSticker())) { videoEditedInfo = new VideoEditedInfo(); if (!videoEditedInfo.parseString(param)) { videoEditedInfo = null; @@ -5068,6 +5069,10 @@ public class MessageObject { return document != null && document.mime_type.equals("video/webm"); } + public static boolean isStaticStickerDocument(TLRPC.Document document) { + return document != null && document.mime_type.equals("image/webp"); + } + public static boolean isGifDocument(WebFile document) { return document != null && (document.mime_type.equals("image/gif") || isNewGifDocument(document)); } @@ -5978,13 +5983,20 @@ public class MessageObject { return; } for (int i = 0; i < spans.length; ++i) { - TLRPC.Document lottieDocument = MediaDataController.getInstance(currentAccount).getEmojiAnimatedSticker(spans[i].emoji); + CharSequence emoji = spans[i].emoji; + boolean invert = false; + if (Emoji.endsWithRightArrow(emoji)) { + emoji = emoji.subSequence(0, emoji.length() - 2); + invert = true; + } + TLRPC.Document lottieDocument = MediaDataController.getInstance(currentAccount).getEmojiAnimatedSticker(emoji); if (lottieDocument != null) { int start = spannable.getSpanStart(spans[i]); int end = spannable.getSpanEnd(spans[i]); spannable.removeSpan(spans[i]); AnimatedEmojiSpan span = new AnimatedEmojiSpan(lottieDocument, spans[i].fontMetrics); span.standard = true; + span.invert = invert; spannable.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } @@ -8926,7 +8938,7 @@ public class MessageObject { if (fromId >= 0) { fromId = DialogObject.getPeerDialogId(messageOwner.fwd_from.from_id); } - if (fromId == 0) return savedId != UserObject.ANONYMOUS; + if (fromId == 0) return savedId >= 0 && savedId != UserObject.ANONYMOUS; return savedId != fromId && fromId != selfId; } return (messageOwner.flags & TLRPC.MESSAGE_FLAG_FWD) != 0 && messageOwner.fwd_from != null && !messageOwner.fwd_from.imported && (messageOwner.fwd_from.saved_from_peer == null || !(messageOwner.fwd_from.from_id instanceof TLRPC.TL_peerChannel) || messageOwner.fwd_from.saved_from_peer.channel_id != messageOwner.fwd_from.from_id.channel_id) && UserConfig.getInstance(currentAccount).getClientUserId() != getDialogId(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index ee8868f20..bc8dc9de1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -537,6 +537,7 @@ public class MessagesController extends BaseController implements NotificationCe public int recommendedChannelsLimitDefault; public int recommendedChannelsLimitPremium; public int boostsChannelLevelMax; + public int channelRestrictSponsoredLevelMin; public int channelsLimitDefault; public int channelsLimitPremium; @@ -590,6 +591,14 @@ public class MessagesController extends BaseController implements NotificationCe public int groupTranscribeLevelMin; public int quickRepliesLimit; public int quickReplyMessagesLimit; + public float uploadPremiumSpeedupUpload; + public float uploadPremiumSpeedupDownload; + public int uploadPremiumSpeedupNotifyPeriod; + public int introTitleLengthLimit; + public int introDescriptionLengthLimit; + public int businessChatLinksLimit; + public boolean channelRevenueWithdrawalEnabled; + public boolean newNoncontactPeersRequirePremiumWithoutOwnpremium; public int savedDialogsPinnedLimitDefault; public int savedDialogsPinnedLimitPremium; @@ -1495,11 +1504,20 @@ public class MessagesController extends BaseController implements NotificationCe recommendedChannelsLimitDefault = mainPreferences.getInt("recommendedChannelsLimitDefault", 10); recommendedChannelsLimitPremium = mainPreferences.getInt("recommendedChannelsLimitPremium", 100); boostsChannelLevelMax = mainPreferences.getInt("boostsChannelLevelMax", 100); + channelRestrictSponsoredLevelMin = mainPreferences.getInt("channelRestrictSponsoredLevelMin", 30); savedDialogsPinnedLimitDefault = mainPreferences.getInt("savedDialogsPinnedLimitDefault", 4); savedDialogsPinnedLimitPremium = mainPreferences.getInt("savedDialogsPinnedLimitPremium", 6); storyQualityFull = mainPreferences.getBoolean("storyQualityFull", true); savedViewAsChats = mainPreferences.getBoolean("savedViewAsChats", false); folderTags = mainPreferences.getBoolean("folderTags", false); + uploadPremiumSpeedupUpload = mainPreferences.getFloat("uploadPremiumSpeedupUpload", 10.0f); + uploadPremiumSpeedupDownload = mainPreferences.getFloat("uploadPremiumSpeedupDownload", 10.0f); + uploadPremiumSpeedupNotifyPeriod = mainPreferences.getInt("uploadPremiumSpeedupNotifyPeriod2", 3600); + introTitleLengthLimit = mainPreferences.getInt("introTitleLengthLimit", 32); + introDescriptionLengthLimit = mainPreferences.getInt("introDescriptionLengthLimit", 72); + businessChatLinksLimit = mainPreferences.getInt("businessChatLinksLimit", 100); + channelRevenueWithdrawalEnabled = mainPreferences.getBoolean("channelRevenueWithdrawalEnabled", false); + newNoncontactPeersRequirePremiumWithoutOwnpremium = mainPreferences.getBoolean("newNoncontactPeersRequirePremiumWithoutOwnpremium", false); scheduleTranscriptionUpdate(); BuildVars.GOOGLE_AUTH_CLIENT_ID = mainPreferences.getString("googleAuthClientId", BuildVars.GOOGLE_AUTH_CLIENT_ID); if (mainPreferences.contains("dcDomainName2")) { @@ -3692,6 +3710,17 @@ public class MessagesController extends BaseController implements NotificationCe } break; } + case "channel_restrict_sponsored_level_min": { + if (value.value instanceof TLRPC.TL_jsonNumber) { + TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value; + if (channelRestrictSponsoredLevelMin != num.value) { + channelRestrictSponsoredLevelMin = (int) num.value; + editor.putInt("channelRestrictSponsoredLevelMin", channelRestrictSponsoredLevelMin); + changed = true; + } + } + break; + } case "channel_bg_icon_level_min": { if (value.value instanceof TLRPC.TL_jsonNumber) { TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value; @@ -3857,6 +3886,94 @@ public class MessagesController extends BaseController implements NotificationCe } break; } + case "upload_premium_speedup_upload": { + if (value.value instanceof TLRPC.TL_jsonNumber) { + TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value; + if (Math.abs(num.value - uploadPremiumSpeedupUpload) >= 0.01f) { + uploadPremiumSpeedupUpload = (float) num.value; + editor.putFloat("uploadPremiumSpeedupUpload", uploadPremiumSpeedupUpload); + changed = true; + } + } + break; + } + case "upload_premium_speedup_download": { + if (value.value instanceof TLRPC.TL_jsonNumber) { + TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value; + if (Math.abs(num.value - uploadPremiumSpeedupDownload) >= 0.01f) { + uploadPremiumSpeedupDownload = (float) num.value; + editor.putFloat("uploadPremiumSpeedupDownload", uploadPremiumSpeedupDownload); + changed = true; + } + } + break; + } + case "upload_premium_speedup_notify_period": { + if (value.value instanceof TLRPC.TL_jsonNumber) { + TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value; + if (num.value != uploadPremiumSpeedupNotifyPeriod) { + uploadPremiumSpeedupNotifyPeriod = (int) num.value; + editor.putInt("uploadPremiumSpeedupNotifyPeriod2", uploadPremiumSpeedupNotifyPeriod); + changed = true; + } + } + break; + } + case "intro_title_length_limit": { + if (value.value instanceof TLRPC.TL_jsonNumber) { + TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value; + if (num.value != introTitleLengthLimit) { + introTitleLengthLimit = (int) num.value; + editor.putInt("introTitleLengthLimit", introTitleLengthLimit); + changed = true; + } + } + break; + } + case "intro_description_length_limit": { + if (value.value instanceof TLRPC.TL_jsonNumber) { + TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value; + if (num.value != introDescriptionLengthLimit) { + introDescriptionLengthLimit = (int) num.value; + editor.putInt("introDescriptionLengthLimit", introDescriptionLengthLimit); + changed = true; + } + } + break; + } + case "business_chat_links_limit": { + if (value.value instanceof TLRPC.TL_jsonNumber) { + TLRPC.TL_jsonNumber num = (TLRPC.TL_jsonNumber) value.value; + if (num.value != businessChatLinksLimit) { + businessChatLinksLimit = (int) num.value; + editor.putInt("businessChatLinksLimit", businessChatLinksLimit); + changed = true; + } + } + break; + } + case "channel_revenue_withdrawal_enabled": { + if (value.value instanceof TLRPC.TL_jsonBool) { + TLRPC.TL_jsonBool num = (TLRPC.TL_jsonBool) value.value; + if (num.value != channelRevenueWithdrawalEnabled) { + channelRevenueWithdrawalEnabled = num.value; + editor.putBoolean("channelRevenueWithdrawalEnabled", channelRevenueWithdrawalEnabled); + changed = true; + } + } + break; + } + case "new_noncontact_peers_require_premium_without_ownpremium": { + if (value.value instanceof TLRPC.TL_jsonBool) { + TLRPC.TL_jsonBool num = (TLRPC.TL_jsonBool) value.value; + if (num.value != newNoncontactPeersRequirePremiumWithoutOwnpremium) { + newNoncontactPeersRequirePremiumWithoutOwnpremium = num.value; + editor.putBoolean("newNoncontactPeersRequirePremiumWithoutOwnpremium", newNoncontactPeersRequirePremiumWithoutOwnpremium); + changed = true; + } + } + break; + } } } @@ -4385,9 +4502,10 @@ public class MessagesController extends BaseController implements NotificationCe private void resetAppConfig() { getfileExperimentalParams = false; + channelRevenueWithdrawalEnabled = false; collectDeviceStats = false; smsjobsStickyNotificationEnabled = false; - mainPreferences.edit().remove("getfileExperimentalParams").remove("smsjobsStickyNotificationEnabled").apply(); + mainPreferences.edit().remove("getfileExperimentalParams").remove("smsjobsStickyNotificationEnabled").remove("channelRevenueWithdrawalEnabled").apply(); } private boolean savePremiumFeaturesPreviewOrder(String key, SparseIntArray array, SharedPreferences.Editor editor, ArrayList value) { @@ -4764,6 +4882,18 @@ public class MessagesController extends BaseController implements NotificationCe return inputPeer; } + public TLRPC.InputDocument getInputDocument(TLRPC.Document document) { + if (document == null) return null; + TLRPC.TL_inputDocument id = new TLRPC.TL_inputDocument(); + id.id = document.id; + id.access_hash = document.access_hash; + id.file_reference = document.file_reference; + if (id.file_reference == null) { + id.file_reference = new byte[0]; + } + return id; + } + public String getPeerName(long dialogId) { return getPeerName(dialogId, false); @@ -5936,7 +6066,7 @@ public class MessagesController extends BaseController implements NotificationCe loadingFullChats.remove(chatId); } - protected void clearFullUsers() { + public void clearFullUsers() { loadedFullUsers.clear(); loadedFullChats.clear(); } @@ -6064,7 +6194,7 @@ public class MessagesController extends BaseController implements NotificationCe public void loadChannelAdmins(long chatId, boolean cache) { int loadTime = loadingChannelAdmins.get(chatId); - if (SystemClock.elapsedRealtime() - loadTime < 60) { + if ((SystemClock.elapsedRealtime() / 1000) - loadTime < 60) { return; } loadingChannelAdmins.put(chatId, (int) (SystemClock.elapsedRealtime() / 1000)); @@ -6502,11 +6632,23 @@ public class MessagesController extends BaseController implements NotificationCe } } - private void savePeerSettings(long dialogId, TLRPC.TL_peerSettings settings, boolean update) { - if (settings == null || notificationsPreferences.getInt("dialog_bar_vis3" + dialogId, 0) == 3) { + private void savePeerSettings(long dialogId, TLRPC.PeerSettings settings, boolean update) { + if (settings == null) { return; } SharedPreferences.Editor editor = notificationsPreferences.edit(); + if (settings.business_bot_id != 0) { + editor.putLong("dialog_botid" + dialogId, settings.business_bot_id); + editor.putString("dialog_boturl" + dialogId, settings.business_bot_manage_url); + editor.putInt("dialog_botflags" + dialogId, (settings.business_bot_paused ? 1 : 0) + (settings.business_bot_can_reply ? 2 : 0)); + } else { + editor.remove("dialog_botid" + dialogId).remove("dialog_boturl" + dialogId).remove("dialog_botflags" + dialogId); + } + if (notificationsPreferences.getInt("dialog_bar_vis3" + dialogId, 0) == 3) { + editor.apply(); + getNotificationCenter().postNotificationName(NotificationCenter.peerSettingsDidLoad, dialogId); + return; + } boolean bar_hidden = settings.flags == 0; if (BuildVars.LOGS_ENABLED) { FileLog.d("peer settings loaded for " + dialogId + " add = " + settings.add_contact + " block = " + settings.block_contact + " spam = " + settings.report_spam + " share = " + settings.share_contact + " geo = " + settings.report_geo + " hide = " + bar_hidden + " distance = " + settings.geo_distance + " invite = " + settings.invite_members); @@ -6530,6 +6672,10 @@ public class MessagesController extends BaseController implements NotificationCe editor.remove("dialog_bar_distance" + dialogId); } } + if (dialogId == getUserConfig().getClientUserId()) { + settings.business_bot_id = UserObject.REPLY_BOT; + settings.business_bot_manage_url = "https://telegram.org/"; + } editor.apply(); getNotificationCenter().postNotificationName(NotificationCenter.peerSettingsDidLoad, dialogId); } @@ -6568,7 +6714,7 @@ public class MessagesController extends BaseController implements NotificationCe loadingPeerSettings.remove(dialogId); if (response != null) { TLRPC.TL_messages_peerSettings res = (TLRPC.TL_messages_peerSettings) response; - TLRPC.TL_peerSettings settings = res.settings; + TLRPC.PeerSettings settings = res.settings; putUsers(res.users, false); putChats(res.chats, false); @@ -7242,7 +7388,7 @@ public class MessagesController extends BaseController implements NotificationCe LimitReachedBottomSheet restricterdUsersBottomSheet = new LimitReachedBottomSheet(lastFragment, lastFragment.getParentActivity(), LimitReachedBottomSheet.TYPE_ADD_MEMBERS_RESTRICTED, currentAccount, null); ArrayList users = new ArrayList(); users.add(user); - restricterdUsersBottomSheet.setRestrictedUsers(chat, users); + restricterdUsersBottomSheet.setRestrictedUsers(chat, users, null, null); restricterdUsersBottomSheet.show(); } onError.run(error); @@ -11710,13 +11856,14 @@ public class MessagesController extends BaseController implements NotificationCe } private void applyDialogsNotificationsSettings(ArrayList dialogs) { - SharedPreferences.Editor editor = null; + SharedPreferences.Editor editor = getNotificationsSettings(currentAccount).edit(); for (int a = 0; a < dialogs.size(); a++) { TLRPC.Dialog dialog = dialogs.get(a); if (dialog.peer != null && dialog.notify_settings instanceof TLRPC.TL_peerNotifySettings) { - getNotificationsController().getNotificationsSettingsFacade().setSettingsForDialog(dialog, dialog.notify_settings); + getNotificationsController().getNotificationsSettingsFacade().setSettingsForDialog(editor, dialog, dialog.notify_settings); } } + editor.apply(); } public void reloadMentionsCountForChannel(TLRPC.InputPeer peer, long taskId) { @@ -12747,18 +12894,20 @@ public class MessagesController extends BaseController implements NotificationCe }); return; } - TLRPC.Updates updates = (TLRPC.Updates) response; - processUpdates(updates, false); - AndroidUtilities.runOnUIThread(() -> { - putUsers(updates.users, false); - putChats(updates.chats, false); - if (updates.chats != null && !updates.chats.isEmpty()) { - getNotificationCenter().postNotificationName(NotificationCenter.chatDidCreated, updates.chats.get(0).id); - AlertsCreator.checkRestrictedInviteUsers(currentAccount, updates.chats.get(0), updates); - } else { - getNotificationCenter().postNotificationName(NotificationCenter.chatDidFailCreate); - } - }); + if (response instanceof TLRPC.TL_messages_invitedUsers) { + TLRPC.TL_messages_invitedUsers res = (TLRPC.TL_messages_invitedUsers) response; + processUpdates(res.updates, false); + AndroidUtilities.runOnUIThread(() -> { + putUsers(res.updates.users, false); + putChats(res.updates.chats, false); + if (res.updates.chats != null && !res.updates.chats.isEmpty()) { + getNotificationCenter().postNotificationName(NotificationCenter.chatDidCreated, res.updates.chats.get(0).id); + AlertsCreator.checkRestrictedInviteUsers(currentAccount, res.updates.chats.get(0), res); + } else { + getNotificationCenter().postNotificationName(NotificationCenter.chatDidFailCreate); + } + }); + } }, ConnectionsManager.RequestFlagFailOnServerErrors); } else if (forImport || type == ChatObject.CHAT_TYPE_CHANNEL || type == ChatObject.CHAT_TYPE_MEGAGROUP || type == ChatObject.CHAT_TYPE_FORUM) { TLRPC.TL_channels_createChannel req = new TLRPC.TL_channels_createChannel(); @@ -12946,11 +13095,15 @@ public class MessagesController extends BaseController implements NotificationCe AndroidUtilities.runOnUIThread(() -> AlertsCreator.processError(currentAccount, error, fragment, req, true)); return; } - processUpdates((TLRPC.Updates) response, false); - AndroidUtilities.runOnUIThread(() -> { - AlertsCreator.checkRestrictedInviteUsers(currentAccount, getChat(chatId), (TLRPC.Updates) response); - }); - + if (response instanceof TLRPC.TL_messages_invitedUsers) { + TLRPC.TL_messages_invitedUsers res = (TLRPC.TL_messages_invitedUsers) response; + processUpdates(res.updates, false); + AndroidUtilities.runOnUIThread(() -> { + putUsers(res.updates.users, false); + putChats(res.updates.chats, false); + AlertsCreator.checkRestrictedInviteUsers(currentAccount, getChat(chatId), res); + }); + } }); } @@ -13164,47 +13317,40 @@ public class MessagesController extends BaseController implements NotificationCe public boolean run(TLRPC.TL_error error); } + public void loadUsersPremiumLocked( + final ArrayList users, + Utilities.Callback> whenDone + ) { + if (whenDone == null) return; + if (getUserConfig().isPremium()) { + whenDone.run(null); + return; + } + TLRPC.TL_users_getIsPremiumRequiredToContact req = new TLRPC.TL_users_getIsPremiumRequiredToContact(); + MessagesController mc = MessagesController.getInstance(currentAccount); + for (TLRPC.User user : users) { + req.id.add(mc.getInputUser(user)); + } + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + ArrayList lockedUserIds = new ArrayList<>(); + if (res instanceof TLRPC.Vector) { + TLRPC.Vector vector = (TLRPC.Vector) res; + for (int i = 0; i < vector.objects.size(); ++i) { + if (i < users.size() && vector.objects.get(i) instanceof TLRPC.TL_boolTrue) { + lockedUserIds.add(users.get(i).id); + } + } + } + whenDone.run(lockedUserIds); + })); + } + public void addUsersToChat(TLRPC.Chat currentChat, BaseFragment baseFragment, ArrayList users, int fwdCount, Consumer onAddUser, Consumer onRestricted, Runnable onComplete) { final int count = users.size(); final int[] processed = new int[1]; - final ArrayList userRestrictedPrivacy = new ArrayList<>(); processed[0] = 0; - final Runnable showUserRestrictedPrivacyAlert = () -> { - AndroidUtilities.runOnUIThread(() -> { - BaseFragment lastFragment = LaunchActivity.getLastFragment(); - if (lastFragment != null && lastFragment.getParentActivity() != null && !lastFragment.getParentActivity().isFinishing()) { -// if (ChatObject.canUserDoAdminAction(currentChat, ChatObject.ACTION_INVITE)) { - LimitReachedBottomSheet restricterdUsersBottomSheet = new LimitReachedBottomSheet(lastFragment, lastFragment.getParentActivity(), LimitReachedBottomSheet.TYPE_ADD_MEMBERS_RESTRICTED, currentAccount, null); - restricterdUsersBottomSheet.setRestrictedUsers(currentChat, userRestrictedPrivacy); - restricterdUsersBottomSheet.show(); -// } else { -// CharSequence title, description; -// if (userRestrictedPrivacy.size() == 1) { -// if (count > 1) { -// title = LocaleController.getString("InviteToGroupErrorTitleAUser", R.string.InviteToGroupErrorTitleAUser); -// } else { -// title = LocaleController.getString("InviteToGroupErrorTitleThisUser", R.string.InviteToGroupErrorTitleThisUser); -// } -// description = AndroidUtilities.replaceTags(LocaleController.formatString("InviteToGroupErrorMessageSingle", R.string.InviteToGroupErrorMessageSingle, UserObject.getFirstName(userRestrictedPrivacy.get(0)))); -// } else if (userRestrictedPrivacy.size() == 2) { -// title = LocaleController.getString("InviteToGroupErrorTitleSomeUsers", R.string.InviteToGroupErrorTitleSomeUsers); -// description = AndroidUtilities.replaceTags(LocaleController.formatString("InviteToGroupErrorMessageDouble", R.string.InviteToGroupErrorMessageDouble, UserObject.getFirstName(userRestrictedPrivacy.get(0)), UserObject.getFirstName(userRestrictedPrivacy.get(1)))); -// } else if (userRestrictedPrivacy.size() == count) { -// title = LocaleController.getString("InviteToGroupErrorTitleTheseUsers", R.string.InviteToGroupErrorTitleTheseUsers); -// description = LocaleController.getString("InviteToGroupErrorMessageMultipleAll", R.string.InviteToGroupErrorMessageMultipleAll); -// } else { -// title = LocaleController.getString("InviteToGroupErrorTitleSomeUsers", R.string.InviteToGroupErrorTitleSomeUsers); -// description = LocaleController.getString("InviteToGroupErrorMessageMultipleSome", R.string.InviteToGroupErrorMessageMultipleSome); -// } -// new AlertDialog.Builder(lastFragment.getParentActivity()) -// .setTitle(title) -// .setMessage(description) -// .setPositiveButton(LocaleController.getString("OK", R.string.OK), null) -// .show(); -// } - } - }, 200); - }; + TLRPC.TL_messages_invitedUsers totalInvitedUsers = new TLRPC.TL_messages_invitedUsers(); + totalInvitedUsers.updates = new TLRPC.TL_updates(); long chatId = currentChat.id; for (int a = 0; a < count; a++) { final TLRPC.User user = users.get(a); @@ -13212,38 +13358,63 @@ public class MessagesController extends BaseController implements NotificationCe if (onAddUser != null) { onAddUser.accept(user); } + }, err -> { + if (onRestricted != null) { + onRestricted.accept(user); + } + return !(err != null && "USER_PRIVACY_RESTRICTED".equals(err.text)); + }, invitedUsers -> { + if (invitedUsers != null) { + totalInvitedUsers.missing_invitees.addAll(invitedUsers.missing_invitees); + } processed[0]++; if (processed[0] >= count) { - if (userRestrictedPrivacy.size() > 0) { - showUserRestrictedPrivacyAlert.run(); + if (!totalInvitedUsers.missing_invitees.isEmpty()) { + AndroidUtilities.runOnUIThread(() -> { + AlertsCreator.checkRestrictedInviteUsers(currentAccount, currentChat, totalInvitedUsers); + }); } if (onComplete != null) { onComplete.run(); } } - }, err -> { - processed[0]++; - boolean privacyRestricted; - if (privacyRestricted = err != null && "USER_PRIVACY_RESTRICTED".equals(err.text)) { - userRestrictedPrivacy.add(user); - } - if (processed[0] >= count && userRestrictedPrivacy.size() > 0) { - showUserRestrictedPrivacyAlert.run(); - } - if (onRestricted != null) { - onRestricted.accept(user); - } - return !privacyRestricted; }); putUser(user, false); } } - public void addUserToChat(long chatId, TLRPC.User user, int forwardCount, String botHash, BaseFragment fragment, boolean ignoreIfAlreadyExists, Runnable onFinishRunnable, ErrorDelegate onError) { + + public void addUserToChat( + long chatId, + TLRPC.User user, + int forwardCount, + String botHash, + BaseFragment fragment, + boolean ignoreIfAlreadyExists, + Runnable onFinishRunnable, + ErrorDelegate onError + ) { + addUserToChat(chatId, user, forwardCount, botHash, fragment, ignoreIfAlreadyExists, onFinishRunnable, onError, null); + } + + public void addUserToChat( + long chatId, + TLRPC.User user, + int forwardCount, + String botHash, + BaseFragment fragment, + boolean ignoreIfAlreadyExists, + Runnable onFinishRunnable, + ErrorDelegate onError, + Utilities.Callback processInvitedUsers + ) { if (user == null) { if (onError != null) { onError.run(null); } + if (processInvitedUsers != null) { + processInvitedUsers.run(null); + } return; } @@ -13297,6 +13468,26 @@ public class MessagesController extends BaseController implements NotificationCe AndroidUtilities.runOnUIThread(() -> joiningToChannels.remove(chatId)); } if (error != null) { + if ("PRIVACY_PREMIUM_REQUIRED".equals(error.text)) { + TLRPC.TL_messages_invitedUsers invitedUsers = new TLRPC.TL_messages_invitedUsers(); + invitedUsers.updates = new TLRPC.TL_updates(); + TLRPC.TL_missingInvitee missingInvitee = new TLRPC.TL_missingInvitee(); + missingInvitee.user_id = user.id; + missingInvitee.premium_would_allow_invite = true; + missingInvitee.premium_required_for_pm = true; + invitedUsers.missing_invitees.add(missingInvitee); + AndroidUtilities.runOnUIThread(() -> { + if (processInvitedUsers != null) { + processInvitedUsers.run(invitedUsers); + } else { + AlertsCreator.checkRestrictedInviteUsers(currentAccount, getChat(chatId), invitedUsers); + } + }); + return; + } + if (processInvitedUsers != null) { + processInvitedUsers.run(null); + } if ("USER_ALREADY_PARTICIPANT".equals(error.text) && ignoreIfAlreadyExists) { if (onFinishRunnable != null) { AndroidUtilities.runOnUIThread(onFinishRunnable); @@ -13322,7 +13513,21 @@ public class MessagesController extends BaseController implements NotificationCe return; } boolean hasJoinMessage = false; - TLRPC.Updates updates = (TLRPC.Updates) response; + TLRPC.Updates updates; + TLRPC.TL_messages_invitedUsers invitedUsers; + if (response instanceof TLRPC.TL_messages_invitedUsers) { + invitedUsers = (TLRPC.TL_messages_invitedUsers) response; + updates = invitedUsers.updates; + } else if (response instanceof TLRPC.Updates) { + invitedUsers = null; + updates = (TLRPC.Updates) response; + } else { + FileLog.e("unexpected " + response + " in addUserToChat"); + if (processInvitedUsers != null) { + processInvitedUsers.run(null); + } + return; + } for (int a = 0; a < updates.updates.size(); a++) { TLRPC.Update update = updates.updates.get(a); if (update instanceof TLRPC.TL_updateNewChannelMessage) { @@ -13333,13 +13538,22 @@ public class MessagesController extends BaseController implements NotificationCe } } processUpdates(updates, false); + if (invitedUsers != null && !invitedUsers.missing_invitees.isEmpty()) { + AndroidUtilities.runOnUIThread(() -> { + putUsers(updates.users, false); + putChats(updates.chats, false); + if (processInvitedUsers != null) { + processInvitedUsers.run(invitedUsers); + } else { + AlertsCreator.checkRestrictedInviteUsers(currentAccount, getChat(chatId), invitedUsers); + } + }); + return; + } if (isChannel) { if (!hasJoinMessage && inputUser instanceof TLRPC.TL_inputUserSelf) { generateJoinMessage(chatId, true); } - AndroidUtilities.runOnUIThread(() -> { - AlertsCreator.checkRestrictedInviteUsers(currentAccount, getChat(chatId), (TLRPC.Updates) response); - }); AndroidUtilities.runOnUIThread(() -> loadFullChat(chatId, 0, true), 1000); } if (isChannel && inputUser instanceof TLRPC.TL_inputUserSelf) { @@ -13348,6 +13562,9 @@ public class MessagesController extends BaseController implements NotificationCe if (onFinishRunnable != null) { AndroidUtilities.runOnUIThread(onFinishRunnable); } + if (processInvitedUsers != null) { + AndroidUtilities.runOnUIThread(() -> processInvitedUsers.run(null)); + } }); } @@ -17976,7 +18193,7 @@ public class MessagesController extends BaseController implements NotificationCe for (int a = 0, size = scheduledMessagesFinal.size(); a < size; a++) { long key = scheduledMessagesFinal.keyAt(a); ArrayList value = scheduledMessagesFinal.valueAt(a); - updateInterfaceWithMessages(key, value, 0); + updateInterfaceWithMessages(key, value, ChatActivity.MODE_SCHEDULED); } } if (editingMessagesFinal != null) { @@ -18560,6 +18777,7 @@ public class MessagesController extends BaseController implements NotificationCe messageObject.sponsoredWebPage = sponsoredMessage.webpage; messageObject.sponsoredBotApp = sponsoredMessage.app; messageObject.sponsoredButtonText = sponsoredMessage.button_text; + messageObject.sponsoredCanReport = sponsoredMessage.can_report; result.add(messageObject); } } @@ -18764,7 +18982,7 @@ public class MessagesController extends BaseController implements NotificationCe save = true; } if (save) { - getMediaDataController().addRecentGif(message.messageOwner.media.document, message.messageOwner.date, true); + getMediaDataController().addRecentGif(message.messageOwner.media.document, message.messageOwner.date, message.wasJustSent); } } else if (!message.isAnimatedEmoji() && (message.isSticker() || message.isAnimatedSticker())) { getMediaDataController().addRecentSticker(MediaDataController.TYPE_IMAGE, message, message.messageOwner.media.document, message.messageOwner.date, false); @@ -19367,7 +19585,7 @@ public class MessagesController extends BaseController implements NotificationCe if (type != 3 && user.bot) { type = 1; BaseFragment lastFragment = LaunchActivity.getLastFragment(); - if (!(lastFragment.storyViewer != null && lastFragment.storyViewer.isShown())) { + if (lastFragment.getLastStoryViewer() == null) { closeLast = true; } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index fc62317ed..cd7b54b56 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -21,7 +21,6 @@ import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; -import android.util.Log; import android.util.Pair; import android.util.SparseArray; import android.util.SparseIntArray; @@ -42,7 +41,6 @@ import org.telegram.tgnet.TLRPC; import org.telegram.tgnet.tl.TL_stories; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Adapters.DialogsSearchAdapter; -import org.telegram.ui.Business.QuickRepliesController; import org.telegram.ui.ChatActivity; import org.telegram.ui.Components.Reactions.ReactionsLayoutInBubble; import org.telegram.ui.DialogsActivity; @@ -106,7 +104,7 @@ public class MessagesStorage extends BaseController { } } - public final static int LAST_DB_VERSION = 149; + public final static int LAST_DB_VERSION = 151; private boolean databaseMigrationInProgress; public boolean showClearDatabaseAlert; private LongSparseIntArray dialogIsForum = new LongSparseIntArray(); @@ -625,8 +623,9 @@ public class MessagesStorage extends BaseController { database.executeFast("CREATE TABLE requested_holes(uid INTEGER, seq_out_start INTEGER, seq_out_end INTEGER, PRIMARY KEY (uid, seq_out_start, seq_out_end));").stepThis().dispose(); database.executeFast("CREATE TABLE sharing_locations(uid INTEGER PRIMARY KEY, mid INTEGER, date INTEGER, period INTEGER, message BLOB, proximity INTEGER);").stepThis().dispose(); - database.executeFast("CREATE TABLE stickersets2(id INTEGER PRIMATE KEY, data BLOB, hash INTEGER, date INTEGER);").stepThis().dispose(); + database.executeFast("CREATE TABLE stickersets2(id INTEGER PRIMATE KEY, data BLOB, hash INTEGER, date INTEGER, short_name TEXT);").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS stickersets2_id_index ON stickersets2(id);").stepThis().dispose(); + database.executeFast("CREATE INDEX IF NOT EXISTS stickersets2_id_short_name ON stickersets2(id, short_name);").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS stickers_featured_emoji_index ON stickers_featured(emoji);").stepThis().dispose(); @@ -721,6 +720,8 @@ public class MessagesStorage extends BaseController { database.executeFast("CREATE INDEX IF NOT EXISTS reply_to_idx_quick_replies_messages ON quick_replies_messages(mid, reply_to_message_id);").stepThis().dispose(); database.executeFast("CREATE INDEX IF NOT EXISTS idx_to_reply_quick_replies_messages ON quick_replies_messages(reply_to_message_id, mid);").stepThis().dispose(); + database.executeFast("CREATE TABLE business_links(data BLOB, order_value INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = " + MessagesStorage.LAST_DB_VERSION).stepThis().dispose(); @@ -3573,6 +3574,7 @@ public class MessagesStorage extends BaseController { public void loadUnreadMessages() { storageQueue.postRunnable(() -> { SQLiteCursor cursor = null; + int magic = 0; try { ArrayList usersToLoad = new ArrayList<>(); ArrayList chatsToLoad = new ArrayList<>(); @@ -3629,7 +3631,8 @@ public class MessagesStorage extends BaseController { while (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(1); if (data != null) { - TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + magic = data.readInt32(false); + TLRPC.Message message = TLRPC.Message.TLdeserialize(data, magic, false); message.readAttachPath(data, getUserConfig().clientUserId); data.reuse(); MessageObject.setUnreadFlags(message, cursor.intValue(0)); @@ -6708,6 +6711,17 @@ public class MessagesStorage extends BaseController { } } } + ArrayList chatsToLoad = new ArrayList<>(); + if (info != null && (info.flags2 & 64) != 0 && info.personal_channel_id != 0) { + chatsToLoad.add(info.personal_channel_id); + } + if (!chatsToLoad.isEmpty()) { + ArrayList chats = new ArrayList<>(); + getChatsInternal(TextUtils.join(",", chatsToLoad), chats); + AndroidUtilities.runOnUIThread(() -> { + getMessagesController().putChats(chats, true); + }); + } } catch (Exception e) { checkSQLException(e); } finally { @@ -14531,6 +14545,38 @@ public class MessagesStorage extends BaseController { }); } + public void loadMessageAttachPaths(ArrayList messageObjects, Runnable done) { + storageQueue.postRunnable(() -> { + final long selfId = getUserConfig().getClientUserId(); + for (MessageObject messageObject : messageObjects) { + if (messageObject.scheduled) continue; // TODO if needed + if (messageObject.isQuickReply()) continue; + SQLiteCursor cursor = null; + try { + cursor = database.queryFinalized("SELECT data FROM messages_v2 WHERE uid = ? AND mid = ?", messageObject.getDialogId(), messageObject.getId()); + if (cursor.next()) { + NativeByteBuffer data = cursor.byteBufferValue(0); + if (data != null) { + TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + message.readAttachPath(data, selfId); + data.reuse(); + + messageObject.messageOwner.attachPath = message.attachPath; + messageObject.checkMediaExistance(); + } + } + } catch (Exception e) { + FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + } + } + AndroidUtilities.runOnUIThread(done); + }); + } + // put messages in data base while load history public void putMessages(TLRPC.messages_Messages messages, long dialogId, int load_type, int max_id, boolean createDialog, int mode, long threadMessageId) { storageQueue.postRunnable(() -> { @@ -14549,9 +14595,6 @@ public class MessagesStorage extends BaseController { final boolean scheduled = mode == ChatActivity.MODE_SCHEDULED; final boolean quickReplies = mode == ChatActivity.MODE_QUICK_REPLIES; if (quickReplies) { -// final long type = dialogId; - -// database.executeFast(String.format(Locale.US, "DELETE FROM quick_replies_messages WHERE topic_id = %d AND mid > 0", topic_id)).stepThis().dispose(); state_messages = database.executeFast("REPLACE INTO quick_replies_messages VALUES(?, ?, ?, ?, ?, ?, NULL, 0)"); int count = messages.messages.size(); for (int a = 0; a < count; a++) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MusicPlayerService.java b/TMessagesProj/src/main/java/org/telegram/messenger/MusicPlayerService.java index 8b37f0757..146034f27 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MusicPlayerService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MusicPlayerService.java @@ -28,6 +28,7 @@ import android.media.MediaMetadataRetriever; import android.media.RemoteControlClient; import android.media.session.MediaSession; import android.media.session.PlaybackState; +import android.net.Uri; import android.os.Build; import android.os.IBinder; import android.text.TextUtils; @@ -37,9 +38,12 @@ import android.widget.RemoteViews; import androidx.core.app.NotificationCompat; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.util.Log; import org.telegram.messenger.audioinfo.AudioInfo; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.LaunchActivity; import java.io.File; @@ -124,12 +128,18 @@ public class MusicPlayerService extends Service implements NotificationCenter.No @Override public void onSkipToNext() { - MediaController.getInstance().playNextMessage(); + MessageObject playingMessageObject = MediaController.getInstance().getPlayingMessageObject(); + if (playingMessageObject != null && playingMessageObject.isMusic()) { + MediaController.getInstance().playNextMessage(); + } } @Override public void onSkipToPrevious() { - MediaController.getInstance().playPreviousMessage(); + MessageObject playingMessageObject = MediaController.getInstance().getPlayingMessageObject(); + if (playingMessageObject != null && playingMessageObject.isMusic()) { + MediaController.getInstance().playPreviousMessage(); + } } @Override @@ -212,39 +222,148 @@ public class MusicPlayerService extends Service implements NotificationCenter.No return null; } + + private Bitmap getAvatarBitmap(TLObject userOrChat, boolean big, boolean tryLoad) { + int size = big ? 600 : 100; + Bitmap bitmap = null; + try { + if (userOrChat instanceof TLRPC.User) { + TLRPC.User user = (TLRPC.User) userOrChat; + TLRPC.FileLocation photoPath = big ? user.photo.photo_big : user.photo.photo_small; + if (photoPath != null) { + File path = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(photoPath, true); + if (path.exists()) { + return ImageLoader.loadBitmap(path.getAbsolutePath(), null, size, size, false); + } + if (big) { + if (tryLoad) { + loadingFilePath = FileLoader.getAttachFileName(photoPath); + ImageLocation photoLocation = ImageLocation.getForUser(user, ImageLocation.TYPE_BIG); + imageReceiver.setImage(photoLocation, "", null, null, null, 0); + } else { + loadingFilePath = null; + } + } + } + } else { + TLRPC.Chat chat = (TLRPC.Chat) userOrChat; + TLRPC.FileLocation photoPath = big ? chat.photo.photo_big : chat.photo.photo_small; + if (photoPath != null) { + File path = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(photoPath, true); + if (path.exists()) { + return ImageLoader.loadBitmap(path.getAbsolutePath(), null, size, size, false); + } + if (big) { + if (tryLoad) { + loadingFilePath = FileLoader.getAttachFileName(photoPath); + ImageLocation photoLocation = ImageLocation.getForChat(chat, ImageLocation.TYPE_BIG); + imageReceiver.setImage(photoLocation, "", null, null, null, 0); + } else { + loadingFilePath = null; + } + } + } + } + } catch (Throwable e) { + FileLog.e(e); + } + if (!big) { + Theme.createDialogsResources(this); + AvatarDrawable placeholder; + if (userOrChat instanceof TLRPC.User) { + placeholder = new AvatarDrawable((TLRPC.User) userOrChat); + } else { + placeholder = new AvatarDrawable((TLRPC.Chat) userOrChat); + } + placeholder.setRoundRadius(1); + bitmap = Bitmap.createBitmap(AndroidUtilities.dp(size), AndroidUtilities.dp(size), Bitmap.Config.ARGB_8888); + placeholder.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); + placeholder.draw(new Canvas(bitmap)); + } + return bitmap; + } + @SuppressLint("NewApi") private void createNotification(MessageObject messageObject, boolean forBitmap) { - String songName = messageObject.getMusicTitle(); - String authorName = messageObject.getMusicAuthor(); + String contentTitle = messageObject.getMusicTitle(); + String contentText = messageObject.getMusicAuthor(); AudioInfo audioInfo = MediaController.getInstance().getAudioInfo(); - Intent intent = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class); - intent.setAction("com.tmessages.openplayer"); - intent.addCategory(Intent.CATEGORY_LAUNCHER); + if (messageObject.isMusic()) { + intent.setAction("com.tmessages.openplayer"); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + } else if (messageObject.isVoice() || messageObject.isRoundVideo()) { + intent.setAction(Intent.ACTION_VIEW); + long fromId = 0; + TLRPC.Message owner = messageObject.messageOwner; + if (owner.peer_id instanceof TLRPC.TL_peerUser) { + fromId = owner.peer_id.user_id; + } else if (owner.peer_id instanceof TLRPC.TL_peerChat) { + fromId = owner.peer_id.chat_id; + } else if (owner.peer_id instanceof TLRPC.TL_peerChannel) { + fromId = owner.peer_id.channel_id; + } + if (fromId != 0) { + if (owner.peer_id instanceof TLRPC.TL_peerUser) { + intent.setData(Uri.parse("tg://openmessage?user_id=" + fromId + "&message_id=" + messageObject.getId())); + } else { + intent.setData(Uri.parse("tg://openmessage?chat_id=" + fromId + "&message_id=" + messageObject.getId())); + } + } + } PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, fixIntentFlags(PendingIntent.FLAG_MUTABLE)); Notification notification; - - String artworkUrl = messageObject.getArtworkUrl(true); - String artworkUrlBig = messageObject.getArtworkUrl(false); + Bitmap albumArt = null; + Bitmap fullAlbumArt = null; long duration = (long) (messageObject.getDuration() * 1000); + if (messageObject.isMusic()) { + String artworkUrl = messageObject.getArtworkUrl(true); + String artworkUrlBig = messageObject.getArtworkUrl(false); - Bitmap albumArt = audioInfo != null ? audioInfo.getSmallCover() : null; - Bitmap fullAlbumArt = audioInfo != null ? audioInfo.getCover() : null; + albumArt = audioInfo != null ? audioInfo.getSmallCover() : null; + fullAlbumArt = audioInfo != null ? audioInfo.getCover() : null; - loadingFilePath = null; - imageReceiver.setImageBitmap((BitmapDrawable) null); - if (albumArt == null && !TextUtils.isEmpty(artworkUrl)) { - fullAlbumArt = loadArtworkFromUrl(artworkUrlBig, true, !forBitmap); - if (fullAlbumArt == null) { - fullAlbumArt = albumArt = loadArtworkFromUrl(artworkUrl, false, !forBitmap); + loadingFilePath = null; + imageReceiver.setImageBitmap((BitmapDrawable) null); + if (albumArt == null && !TextUtils.isEmpty(artworkUrl)) { + fullAlbumArt = loadArtworkFromUrl(artworkUrlBig, true, !forBitmap); + if (fullAlbumArt == null) { + fullAlbumArt = albumArt = loadArtworkFromUrl(artworkUrl, false, !forBitmap); + } else { + albumArt = loadArtworkFromUrl(artworkUrlBig, false, !forBitmap); + } } else { - albumArt = loadArtworkFromUrl(artworkUrlBig, false, !forBitmap); + loadingFilePath = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(messageObject.getDocument()).getAbsolutePath(); } - } else { - loadingFilePath = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(messageObject.getDocument()).getAbsolutePath(); - } + } else if (messageObject.isVoice() || messageObject.isRoundVideo()) { + long senderId = messageObject.getSenderId(); + if (messageObject.isFromUser()) { + TLRPC.User user = MessagesController.getInstance(UserConfig.selectedAccount).getUser(senderId); + if (user != null) { + contentTitle = UserObject.getUserName(user); + fullAlbumArt = getAvatarBitmap(user, true, !forBitmap); + albumArt = getAvatarBitmap(user, false, !forBitmap); + } + } else { + TLRPC.Chat chat = MessagesController.getInstance(UserConfig.selectedAccount).getChat(-senderId); + if (chat != null) { + contentTitle = chat.title; + fullAlbumArt = getAvatarBitmap(chat, true, !forBitmap); + albumArt = getAvatarBitmap(chat, false, !forBitmap); + } + } + + if (fullAlbumArt == null && albumArt != null) { + fullAlbumArt = albumArt; + } + if (messageObject.isVoice()) { + contentText = LocaleController.getString("AttachAudio", R.string.AttachAudio); + } else { + contentText = LocaleController.getString("AttachRound", R.string.AttachRound); + } + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { boolean isPlaying = !MediaController.getInstance().isMessagePaused(); @@ -255,20 +374,24 @@ public class MusicPlayerService extends Service implements NotificationCenter.No PendingIntent pendingNext = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_NEXT).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), fixIntentFlags(PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_CANCEL_CURRENT)); PendingIntent pendingSeek = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_SEEK).setComponent(new ComponentName(this, MusicPlayerReceiver.class)), fixIntentFlags(PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_CANCEL_CURRENT)); + Notification.MediaStyle mediaStyle = new Notification.MediaStyle().setMediaSession(mediaSession.getSessionToken()); + if (messageObject.isMusic()) { + mediaStyle.setShowActionsInCompactView(0, 1, 2); + } else if (messageObject.isVoice() || messageObject.isRoundVideo()) { + mediaStyle.setShowActionsInCompactView(0); + } Notification.Builder bldr = new Notification.Builder(this); bldr.setSmallIcon(R.drawable.player) .setOngoing(isPlaying) - .setContentTitle(songName) - .setContentText(authorName) - .setSubText(audioInfo != null ? audioInfo.getAlbum() : null) + .setContentTitle(contentTitle) + .setContentText(contentText) + .setSubText(audioInfo != null && messageObject.isMusic() ? audioInfo.getAlbum() : null) .setContentIntent(contentIntent) .setDeleteIntent(pendingStop) .setShowWhen(false) .setCategory(Notification.CATEGORY_TRANSPORT) .setPriority(Notification.PRIORITY_MAX) - .setStyle(new Notification.MediaStyle() - .setMediaSession(mediaSession.getSessionToken()) - .setShowActionsInCompactView(0, 1, 2)); + .setStyle(mediaStyle); if (Build.VERSION.SDK_INT >= 26) { NotificationsController.checkOtherNotificationsChannel(); bldr.setChannelId(NotificationsController.OTHER_NOTIFICATIONS_CHANNEL); @@ -284,28 +407,40 @@ public class MusicPlayerService extends Service implements NotificationCenter.No if (MediaController.getInstance().isDownloadingCurrentMessage()) { playbackState.setState(PlaybackState.STATE_BUFFERING, 0, 1).setActions(0); - bldr.addAction(new Notification.Action.Builder(R.drawable.ic_action_previous, previousDescription, pendingPrev).build()) - .addAction(new Notification.Action.Builder(R.drawable.loading_animation2, LocaleController.getString("Loading", R.string.Loading), null).build()) - .addAction(new Notification.Action.Builder(R.drawable.ic_action_next, nextDescription, pendingNext).build()); + if (messageObject.isMusic()) { + bldr.addAction(new Notification.Action.Builder(R.drawable.ic_action_previous, previousDescription, pendingPrev).build()); + } + bldr.addAction(new Notification.Action.Builder(R.drawable.loading_animation2, LocaleController.getString("Loading", R.string.Loading), null).build()); + if (messageObject.isMusic()) { + bldr.addAction(new Notification.Action.Builder(R.drawable.ic_action_next, nextDescription, pendingNext).build()); + } } else { + long actions = PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_SEEK_TO; + if (messageObject.isMusic()) { + actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS | PlaybackState.ACTION_SKIP_TO_NEXT; + } playbackState.setState(isPlaying ? PlaybackState.STATE_PLAYING : PlaybackState.STATE_PAUSED, - MediaController.getInstance().getPlayingMessageObject().audioProgressSec * 1000L, - isPlaying ? 1 : 0) - .setActions(PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_SEEK_TO | PlaybackState.ACTION_SKIP_TO_PREVIOUS | PlaybackState.ACTION_SKIP_TO_NEXT); + MediaController.getInstance().getPlayingMessageObject().audioProgressSec * 1000L, + getPlaybackSpeed(isPlaying, messageObject)) + .setActions(actions); final String playPauseTitle = isPlaying ? LocaleController.getString("AccActionPause", R.string.AccActionPause) : LocaleController.getString("AccActionPlay", R.string.AccActionPlay); - bldr.addAction(new Notification.Action.Builder(R.drawable.ic_action_previous, previousDescription, pendingPrev).build()) - .addAction(new Notification.Action.Builder(isPlaying ? R.drawable.ic_action_pause : R.drawable.ic_action_play, playPauseTitle, pendingPlaypause).build()) - .addAction(new Notification.Action.Builder(R.drawable.ic_action_next, nextDescription, pendingNext).build()); + if (messageObject.isMusic()) { + bldr.addAction(new Notification.Action.Builder(R.drawable.ic_action_previous, previousDescription, pendingPrev).build()); + } + bldr.addAction(new Notification.Action.Builder(isPlaying ? R.drawable.ic_action_pause : R.drawable.ic_action_play, playPauseTitle, pendingPlaypause).build()); + if (messageObject.isMusic()) { + bldr.addAction(new Notification.Action.Builder(R.drawable.ic_action_next, nextDescription, pendingNext).build()); + } } mediaSession.setPlaybackState(playbackState.build()); MediaMetadata.Builder meta = new MediaMetadata.Builder() .putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, fullAlbumArt) - .putString(MediaMetadata.METADATA_KEY_ALBUM_ARTIST, authorName) - .putString(MediaMetadata.METADATA_KEY_ARTIST, authorName) + .putString(MediaMetadata.METADATA_KEY_ALBUM_ARTIST, contentText) + .putString(MediaMetadata.METADATA_KEY_ARTIST, contentText) .putLong(MediaMetadata.METADATA_KEY_DURATION, duration) - .putString(MediaMetadata.METADATA_KEY_TITLE, songName) - .putString(MediaMetadata.METADATA_KEY_ALBUM, audioInfo != null ? audioInfo.getAlbum() : null); + .putString(MediaMetadata.METADATA_KEY_TITLE, contentTitle) + .putString(MediaMetadata.METADATA_KEY_ALBUM, audioInfo != null && messageObject.isMusic() ? audioInfo.getAlbum() : null); mediaSession.setMetadata(meta.build()); @@ -342,7 +477,7 @@ public class MusicPlayerService extends Service implements NotificationCenter.No .setSmallIcon(R.drawable.player) .setContentIntent(contentIntent) .setChannelId(NotificationsController.OTHER_NOTIFICATIONS_CHANNEL) - .setContentTitle(songName).build(); + .setContentTitle(contentTitle).build(); notification.contentView = simpleContentView; if (supportBigNotifications) { @@ -380,11 +515,21 @@ public class MusicPlayerService extends Service implements NotificationCenter.No } } else { notification.contentView.setViewVisibility(R.id.player_progress_bar, View.GONE); - notification.contentView.setViewVisibility(R.id.player_next, View.VISIBLE); - notification.contentView.setViewVisibility(R.id.player_previous, View.VISIBLE); + if (messageObject.isMusic()) { + notification.contentView.setViewVisibility(R.id.player_next, View.VISIBLE); + notification.contentView.setViewVisibility(R.id.player_previous, View.VISIBLE); + } else { + notification.bigContentView.setViewVisibility(R.id.player_next, View.GONE); + notification.bigContentView.setViewVisibility(R.id.player_previous, View.GONE); + } if (supportBigNotifications) { - notification.bigContentView.setViewVisibility(R.id.player_next, View.VISIBLE); - notification.bigContentView.setViewVisibility(R.id.player_previous, View.VISIBLE); + if (messageObject.isMusic()) { + notification.bigContentView.setViewVisibility(R.id.player_next, View.VISIBLE); + notification.bigContentView.setViewVisibility(R.id.player_previous, View.VISIBLE); + } else { + notification.bigContentView.setViewVisibility(R.id.player_next, View.GONE); + notification.bigContentView.setViewVisibility(R.id.player_previous, View.GONE); + } notification.bigContentView.setViewVisibility(R.id.player_progress_bar, View.GONE); } @@ -405,11 +550,11 @@ public class MusicPlayerService extends Service implements NotificationCenter.No } } - notification.contentView.setTextViewText(R.id.player_song_name, songName); - notification.contentView.setTextViewText(R.id.player_author_name, authorName); + notification.contentView.setTextViewText(R.id.player_song_name, contentTitle); + notification.contentView.setTextViewText(R.id.player_author_name, contentText); if (supportBigNotifications) { - notification.bigContentView.setTextViewText(R.id.player_song_name, songName); - notification.bigContentView.setTextViewText(R.id.player_author_name, authorName); + notification.bigContentView.setTextViewText(R.id.player_song_name, contentTitle); + notification.bigContentView.setTextViewText(R.id.player_author_name, contentText); notification.bigContentView.setTextViewText(R.id.player_album_title, audioInfo != null && !TextUtils.isEmpty(audioInfo.getAlbum()) ? audioInfo.getAlbum() : ""); } notification.flags |= Notification.FLAG_ONGOING_EVENT; @@ -421,8 +566,8 @@ public class MusicPlayerService extends Service implements NotificationCenter.No if (notificationMessageID != currentID) { notificationMessageID = currentID; RemoteControlClient.MetadataEditor metadataEditor = remoteControlClient.editMetadata(true); - metadataEditor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, authorName); - metadataEditor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, songName); + metadataEditor.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, contentText); + metadataEditor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, contentTitle); if (audioInfo != null && !TextUtils.isEmpty(audioInfo.getAlbum())) { metadataEditor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, audioInfo.getAlbum()); } @@ -483,14 +628,30 @@ public class MusicPlayerService extends Service implements NotificationCenter.No if (MediaController.getInstance().isDownloadingCurrentMessage()) { playbackState.setState(PlaybackState.STATE_BUFFERING, 0, 1).setActions(0); } else { + long actions = PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_SEEK_TO; + MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject(); + if (messageObject != null && messageObject.isMusic()) { + actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS | PlaybackState.ACTION_SKIP_TO_NEXT; + } playbackState.setState(isPlaying ? PlaybackState.STATE_PLAYING : PlaybackState.STATE_PAUSED, - seekTo, - isPlaying ? 1 : 0) - .setActions(PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_SEEK_TO | PlaybackState.ACTION_SKIP_TO_PREVIOUS | PlaybackState.ACTION_SKIP_TO_NEXT); + seekTo, + getPlaybackSpeed(isPlaying, messageObject)) + .setActions(actions); } mediaSession.setPlaybackState(playbackState.build()); } + private float getPlaybackSpeed(boolean isPlaying, MessageObject messageObject) { + if (isPlaying) { + if (messageObject.isVoice() || messageObject.isRoundVideo()) { + return MediaController.getInstance().getPlaybackSpeed(false); + } + return 1; + } else { + return 0; + } + } + public void setListeners(RemoteViews view) { PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(NOTIFY_PREVIOUS), fixIntentFlags(PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT)); view.setOnClickPendingIntent(R.id.player_previous, pendingIntent); @@ -545,8 +706,9 @@ public class MusicPlayerService extends Service implements NotificationCenter.No } } else if (id == NotificationCenter.messagePlayingDidSeek) { MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject(); + long progress = Math.round(messageObject.audioPlayerDuration * (float) args[1]) * 1000L; + updatePlaybackState(progress); if (remoteControlClient != null && Build.VERSION.SDK_INT >= 18) { - long progress = Math.round(messageObject.audioPlayerDuration * (float) args[1]) * 1000L; remoteControlClient.setPlaybackState(MediaController.getInstance().isMessagePaused() ? RemoteControlClient.PLAYSTATE_PAUSED : RemoteControlClient.PLAYSTATE_PLAYING, progress, MediaController.getInstance().isMessagePaused() ? 0f : 1f); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NativeLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/NativeLoader.java index 3c41a7180..badd396f1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NativeLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NativeLoader.java @@ -22,7 +22,7 @@ import java.util.zip.ZipFile; public class NativeLoader { - private final static int LIB_VERSION = 48; + private final static int LIB_VERSION = 49; private final static String LIB_NAME = "tmessages." + LIB_VERSION; private final static String LIB_SO_NAME = "lib" + LIB_NAME + ".so"; private final static String LOCALE_LIB_SO_NAME = "lib" + LIB_NAME + "loc.so"; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java index 1877a4926..51097f7ad 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java @@ -142,6 +142,10 @@ public class NotificationCenter { public static final int quickRepliesUpdated = totalEvents++; public static final int quickRepliesDeleted = totalEvents++; + public static final int businessLinksUpdated = totalEvents++; + public static final int businessLinkCreated = totalEvents++; + public static final int needDeleteBusinessLink = totalEvents++; + public static final int messageTranslated = totalEvents++; public static final int messageTranslating = totalEvents++; public static final int dialogIsTranslatable = totalEvents++; @@ -240,6 +244,8 @@ public class NotificationCenter { public static final int chatWasBoostedByUser = totalEvents++; public static final int groupPackUpdated = totalEvents++; public static final int timezonesUpdated = totalEvents++; + public static final int customStickerCreated = totalEvents++; + public static final int premiumFloodWaitReceived = totalEvents++; //global public static final int pushMessagesUpdated = totalEvents++; @@ -753,7 +759,7 @@ public class NotificationCenter { } } - public Runnable listen(View view, final int id, final Utilities.Callback callback) { + public Runnable listenGlobal(View view, final int id, final Utilities.Callback callback) { if (view == null || callback == null) { return () -> {}; } @@ -780,8 +786,35 @@ public class NotificationCenter { }; } + public Runnable listen(View view, final int id, final Utilities.Callback callback) { + if (view == null || callback == null) { + return () -> {}; + } + final NotificationCenterDelegate delegate = (_id, account, args) -> { + if (_id == id) { + callback.run(args); + } + }; + final View.OnAttachStateChangeListener viewListener = new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + addObserver(delegate, id); + } + @Override + public void onViewDetachedFromWindow(View view) { + removeObserver(delegate, id); + } + }; + view.addOnAttachStateChangeListener(viewListener); + + return () -> { + view.removeOnAttachStateChangeListener(viewListener); + removeObserver(delegate, id); + }; + } + public static void listenEmojiLoading(View view) { - getGlobalInstance().listen(view, NotificationCenter.emojiLoaded, args -> view.invalidate()); + getGlobalInstance().listenGlobal(view, NotificationCenter.emojiLoaded, args -> view.invalidate()); } public void listenOnce(int id, Runnable callback) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index da559b1a5..3e806e8ab 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -5765,10 +5765,10 @@ public class NotificationsController extends BaseController { minChangeTime = Math.min(minChangeTime, d.second); } } - AndroidUtilities.cancelRunOnUIThread(checkStoryPushesRunnable); + notificationsQueue.cancelRunnable(checkStoryPushesRunnable); long delay = minChangeTime - System.currentTimeMillis(); if (minChangeTime != Long.MAX_VALUE) { - AndroidUtilities.runOnUIThread(checkStoryPushesRunnable, Math.max(0, delay)); + notificationsQueue.postRunnable(checkStoryPushesRunnable, Math.max(0, delay)); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsSettingsFacade.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsSettingsFacade.java index 597e75cfc..04d171f73 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsSettingsFacade.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsSettingsFacade.java @@ -256,8 +256,7 @@ public class NotificationsSettingsFacade { } } - public void setSettingsForDialog(TLRPC.Dialog dialog, TLRPC.PeerNotifySettings notify_settings) { - SharedPreferences.Editor editor = getPreferences().edit(); + public void setSettingsForDialog(SharedPreferences.Editor editor, TLRPC.Dialog dialog, TLRPC.PeerNotifySettings notify_settings) { long dialogId = MessageObject.getPeerId(dialog.peer); if ((dialog.notify_settings.flags & 2) != 0) { @@ -281,7 +280,5 @@ public class NotificationsSettingsFacade { } else { editor.remove(PROPERTY_NOTIFY + dialogId); } - - editor.apply(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java index d2f196268..d531cb84d 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java @@ -66,7 +66,7 @@ import org.telegram.ui.ChatActivity; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AnimatedFileDrawable; -import org.telegram.ui.Components.BotWebViewSheet; +import org.telegram.ui.bots.BotWebViewSheet; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.Point; @@ -378,6 +378,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe public boolean animated; public TLRPC.TL_inputStickerSetItem item; + public VideoEditedInfo videoEditedInfo; public void uploadMedia(int account, TLRPC.InputFile inputFile, Runnable onFinish) { TLRPC.TL_messages_uploadMedia req = new TLRPC.TL_messages_uploadMedia(); req.peer = new TLRPC.TL_inputPeerSelf(); @@ -501,7 +502,6 @@ public class SendMessagesHelper extends BaseController implements NotificationCe req.user_id = new TLRPC.TL_inputUserSelf(); req.title = title; req.short_name = shortName; - req.animated = uploadMedia.get(0).animated; if (software != null) { req.software = software; req.flags |= 8; @@ -2174,7 +2174,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe if (arr.size() == 100 || a == messages.size() - 1 || a != messages.size() - 1 && messages.get(a + 1).getDialogId() != msgObj.getDialogId()) { getMessagesStorage().putMessages(new ArrayList<>(arr), false, true, false, 0, scheduleDate != 0 ? 1 : 0, 0); - getMessagesController().updateInterfaceWithMessages(peer, objArr, 0); + getMessagesController().updateInterfaceWithMessages(peer, objArr, scheduleDate != 0 ? 1 : 0); getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); getUserConfig().saveConfig(false); @@ -3207,7 +3207,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("BotOwnershipTransferReadyAlertText", R.string.BotOwnershipTransferReadyAlertText))); builder.setPositiveButton(LocaleController.getString("BotOwnershipTransferChangeOwner", R.string.BotOwnershipTransferChangeOwner), (dialogInterface, i) -> { TwoStepVerificationActivity fragment = new TwoStepVerificationActivity(); - fragment.setDelegate(password -> sendCallback(cache, messageObject, button, password, fragment, parentFragment)); + fragment.setDelegate(0, password -> sendCallback(cache, messageObject, button, password, fragment, parentFragment)); parentFragment.presentFragment(fragment); }); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); @@ -3748,7 +3748,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe newMsg.media.document = document; if (params != null && params.containsKey("query_id")) { type = 9; - } else if (!MessageObject.isVideoSticker(document) && (MessageObject.isVideoDocument(document) || MessageObject.isRoundVideoDocument(document) || videoEditedInfo != null)) { + } else if ((!MessageObject.isVideoSticker(document) || videoEditedInfo != null) && (MessageObject.isVideoDocument(document) || MessageObject.isRoundVideoDocument(document) || videoEditedInfo != null)) { type = 3; } else if (MessageObject.isVoiceDocument(document)) { type = 8; @@ -5121,7 +5121,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe String location = message.obj.messageOwner.attachPath; TLRPC.Document document = message.obj.getDocument(); if (location == null) { - location = FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + document.id + ".mp4"; + location = FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + document.id + "." + (message.videoEditedInfo.isSticker ? "webm" : "mp4"); } putToDelayedMessages(location, message); if (!message.videoEditedInfo.alreadyScheduledConverting) { @@ -6952,6 +6952,13 @@ public class SendMessagesHelper extends BaseController implements NotificationCe attributeImageSize.w = bmOptions.outWidth; attributeImageSize.h = bmOptions.outHeight; document.attributes.add(attributeImageSize); + + Bitmap bitmap = ImageLoader.loadBitmap(f.getAbsolutePath(), null, 400, 400, true); + TLRPC.PhotoSize thumb = ImageLoader.scaleAndSaveImage(null, bitmap, Bitmap.CompressFormat.PNG, false, 400, 400, 100, isEncrypted, 0, 0, false); + if (thumb != null) { + document.thumbs.add(thumb); + document.flags |= 1; + } } } } @@ -8166,8 +8173,23 @@ public class SendMessagesHelper extends BaseController implements NotificationCe document.thumbs.add(size); document.flags |= 1; } - document.mime_type = "video/mp4"; + if (info.videoEditedInfo != null && info.videoEditedInfo.isSticker) { + document.mime_type = "video/webm"; + } else { + document.mime_type = "video/mp4"; + } accountInstance.getUserConfig().saveConfig(false); + if (info.videoEditedInfo != null && info.videoEditedInfo.isSticker) { + document.attributes.add(new TLRPC.TL_documentAttributeAnimated()); + TLRPC.TL_documentAttributeSticker sticker = new TLRPC.TL_documentAttributeSticker(); + sticker.alt = "๐Ÿ‘"; + sticker.stickerset = new TLRPC.TL_inputStickerSetEmpty(); + document.attributes.add(sticker); +// document.size = videoEditedInfo.estimatedSize; + if (size != null && size.location != null) { + thumbKey = String.format(Locale.US, "%d_%d@b1", size.location.volume_id, size.location.local_id); + } + } TLRPC.TL_documentAttributeVideo attributeVideo; if (isEncrypted) { attributeVideo = new TLRPC.TL_documentAttributeVideo_layer159(); @@ -8221,7 +8243,8 @@ public class SendMessagesHelper extends BaseController implements NotificationCe } } if (videoEditedInfo != null && (videoEditedInfo.needConvert() || !info.isVideo)) { - String fileName = Integer.MIN_VALUE + "_" + SharedConfig.getLastLocalId() + ".mp4"; + String ext = videoEditedInfo.isSticker ? "webm" : "mp4"; + String fileName = Integer.MIN_VALUE + "_" + SharedConfig.getLastLocalId() + "." + ext; File cacheFile = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName); SharedConfig.saveConfig(); path = cacheFile.getAbsolutePath(); @@ -8247,7 +8270,7 @@ public class SendMessagesHelper extends BaseController implements NotificationCe lastGroupId = 0; } } - if (!isEncrypted && info.masks != null && !info.masks.isEmpty()) { + if (!isEncrypted && (videoEditedInfo == null || !videoEditedInfo.isSticker) && info.masks != null && !info.masks.isEmpty()) { document.attributes.add(new TLRPC.TL_documentAttributeHasStickers()); SerializedData serializedData = new SerializedData(4 + info.masks.size() * 20); serializedData.writeInt32(info.masks.size()); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserObject.java index 7279b9326..4c5d33b42 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/UserObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserObject.java @@ -107,7 +107,25 @@ public class UserObject { } else if (!allowShort && name.length() <= 2) { return ContactsController.formatName(user.first_name, user.last_name); } - return !TextUtils.isEmpty(name) ? name : LocaleController.getString("HiddenName", R.string.HiddenName); + return !TextUtils.isEmpty(name) ? name : LocaleController.getString(R.string.HiddenName); + } + + public static String getForcedFirstName(TLRPC.User user) { + if (user == null || isDeleted(user)) { + return "DELETED"; + } + String name = user.first_name; + if (TextUtils.isEmpty(name)) { + name = user.last_name; + } + if (name == null) { + return LocaleController.getString(R.string.HiddenName); + } + int index = name.indexOf(" "); + if (index >= 0) { + name = name.substring(0, index); + } + return name; } public static boolean hasPhoto(TLRPC.User user) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/VideoEditedInfo.java b/TMessagesProj/src/main/java/org/telegram/messenger/VideoEditedInfo.java index 170179815..af68fe0ea 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/VideoEditedInfo.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/VideoEditedInfo.java @@ -10,6 +10,8 @@ package org.telegram.messenger; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.RectF; import android.text.TextUtils; import android.view.View; @@ -49,6 +51,7 @@ public class VideoEditedInfo { public long estimatedDuration; public boolean roundVideo; public boolean muted; + public float volume = 1f; public long originalDuration; public TLRPC.InputFile file; public TLRPC.InputEncryptedFile encryptedFile; @@ -62,6 +65,8 @@ public class VideoEditedInfo { public boolean isStory; public StoryEntry.HDRInfo hdrInfo; + public boolean isSticker; + public Bitmap thumb; public boolean notReadyYet; @@ -157,6 +162,7 @@ public class VideoEditedInfo { public float currentFrame; public float framesPerDraw; public Bitmap bitmap; + public Matrix matrix; public View view; public Canvas canvas; @@ -387,7 +393,7 @@ public class VideoEditedInfo { blurPathBytes = null; } SerializedData serializedData = new SerializedData(len); - serializedData.writeInt32(8); + serializedData.writeInt32(10); serializedData.writeInt64(avatarStartTime); serializedData.writeInt32(originalBitrate); if (filterState != null) { @@ -478,6 +484,8 @@ public class VideoEditedInfo { } else { serializedData.writeByte(0); } + serializedData.writeFloat(volume); + serializedData.writeBool(isSticker); filters = Utilities.bytesToHex(serializedData.toByteArray()); serializedData.cleanup(); } else { @@ -605,6 +613,12 @@ public class VideoEditedInfo { blurPath = new String(bytes); } } + if (version >= 9) { + volume = serializedData.readFloat(false); + } + if (version >= 10) { + isSticker = serializedData.readBool(false); + } serializedData.cleanup(); } } else { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraController.java b/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraController.java index 180a77d66..1f493014d 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/camera/CameraController.java @@ -173,9 +173,9 @@ public class CameraController implements MediaRecorder.OnInfoListener { List list = params.getSupportedPreviewSizes(); for (int a = 0; a < list.size(); a++) { Camera.Size size = list.get(a); - if (size.width == 1280 && size.height != 720) { - continue; - } +// if (size.width == 1280 && size.height != 720) { +// continue; +// } if (size.height < 2160 && size.width < 2160) { cameraInfo.previewSizes.add(new Size(size.width, size.height)); if (BuildVars.LOGS_ENABLED) { @@ -187,9 +187,9 @@ public class CameraController implements MediaRecorder.OnInfoListener { list = params.getSupportedPictureSizes(); for (int a = 0; a < list.size(); a++) { Camera.Size size = list.get(a); - if (size.width == 1280 && size.height != 720) { - continue; - } +// if (size.width == 1280 && size.height != 720) { +// continue; +// } if (!"samsung".equals(Build.MANUFACTURER) || !"jflteuc".equals(Build.PRODUCT) || size.width < 2048) { cameraInfo.pictureSizes.add(new Size(size.width, size.height)); if (BuildVars.LOGS_ENABLED) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/video/AudioRecoder.java b/TMessagesProj/src/main/java/org/telegram/messenger/video/AudioRecoder.java index 63eb63d16..9cf7e6ab2 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/video/AudioRecoder.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/video/AudioRecoder.java @@ -84,7 +84,7 @@ public class AudioRecoder { } } - public boolean step(MP4Builder muxer, int audioTrackIndex) throws Exception { + public boolean step(MediaCodecVideoConvertor.Muxer muxer, int audioTrackIndex) throws Exception { if (!encoderInputDone) { int encoderBufferIndex = encoder.dequeueInputBuffer(TIMEOUT_USEC); if (encoderBufferIndex >= 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/video/MediaCodecVideoConvertor.java b/TMessagesProj/src/main/java/org/telegram/messenger/video/MediaCodecVideoConvertor.java index d8b614a00..6b5b5f079 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/video/MediaCodecVideoConvertor.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/video/MediaCodecVideoConvertor.java @@ -3,8 +3,10 @@ package org.telegram.messenger.video; import android.annotation.TargetApi; import android.media.MediaCodec; import android.media.MediaCodecInfo; +import android.media.MediaCodecList; import android.media.MediaExtractor; import android.media.MediaFormat; +import android.media.MediaMuxer; import android.os.Build; import androidx.annotation.NonNull; @@ -24,13 +26,14 @@ import org.telegram.ui.Components.RLottieDrawable; import org.telegram.ui.Stories.recorder.StoryEntry; import java.io.File; +import java.io.FileDescriptor; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; public class MediaCodecVideoConvertor { - private MP4Builder mediaMuxer; + private Muxer muxer; private MediaExtractor extractor; private long endPresentationTime; @@ -48,9 +51,12 @@ public class MediaCodecVideoConvertor { private static final int MEDIACODEC_TIMEOUT_INCREASED = 22000; private String outputMimeType; - public boolean convertVideo(ConvertVideoParams convertStoryVideoParams) { - this.callback = convertStoryVideoParams.callback; - return convertVideoInternal(convertStoryVideoParams, false, 0); + public boolean convertVideo(ConvertVideoParams convertVideoParams) { + if (convertVideoParams.isSticker) { + return WebmEncoder.convert(convertVideoParams); + } + this.callback = convertVideoParams.callback; + return convertVideoInternal(convertVideoParams, false, 0); } public long getLastFrameTimestamp() { @@ -87,6 +93,7 @@ public class MediaCodecVideoConvertor { Integer gradientTopColor = convertVideoParams.gradientTopColor; Integer gradientBottomColor = convertVideoParams.gradientBottomColor; boolean muted = convertVideoParams.muted; + float volume = convertVideoParams.volume; boolean isStory = convertVideoParams.isStory; StoryEntry.HDRInfo hdrInfo = convertVideoParams.hdrInfo; @@ -98,21 +105,18 @@ public class MediaCodecVideoConvertor { int videoTrackIndex = -5; String selectedEncoderName = null; + final boolean isWebm = convertVideoParams.isSticker; boolean shouldUseHevc = isStory; - outputMimeType = shouldUseHevc ? "video/hevc" : "video/avc"; + outputMimeType = isWebm ? "video/x-vnd.on2.vp9" : shouldUseHevc ? "video/hevc" : "video/avc"; boolean canBeBrokenEncoder = false; MediaCodec encoder = null; MediaCodec decoder = null; InputSurface inputSurface = null; OutputSurface outputSurface = null; + MediaCodec.BufferInfo info = null; try { - MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); - Mp4Movie movie = new Mp4Movie(); - movie.setCacheFile(cacheFile); - movie.setRotation(0); - movie.setSize(resultWidth, resultHeight); - + info = new MediaCodec.BufferInfo(); long currentPts = 0; float durationS = duration / 1000f; @@ -189,7 +193,15 @@ public class MediaCodecVideoConvertor { checkConversionCanceled(); - mediaMuxer = new MP4Builder().createMovie(movie, isSecret, outputMimeType.equals("video/hevc")); + if (isWebm) { + muxer = new Muxer(new MediaMuxer(cacheFile.getAbsolutePath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM)); + } else { + Mp4Movie movie = new Mp4Movie(); + movie.setCacheFile(cacheFile); + movie.setRotation(0); + movie.setSize(resultWidth, resultHeight); + muxer = new Muxer(new MP4Builder().createMovie(movie, isSecret, outputMimeType.equals("video/hevc"))); + } int audioTrackIndex = -1; boolean audioEncoderDone = true; @@ -202,13 +214,13 @@ public class MediaCodecVideoConvertor { applyAudioInputs(convertVideoParams.soundInfos, audioInputs); audioRecoder = new AudioRecoder(audioInputs, totalDuration); - audioTrackIndex = mediaMuxer.addTrack(audioRecoder.format, true); + audioTrackIndex = muxer.addTrack(audioRecoder.format, true); } while (!outputDone || !audioEncoderDone) { checkConversionCanceled(); if (audioRecoder != null) { - audioEncoderDone = audioRecoder.step(mediaMuxer, audioTrackIndex); + audioEncoderDone = audioRecoder.step(muxer, audioTrackIndex); } boolean decoderOutputAvailable = !decoderDone; @@ -228,7 +240,7 @@ public class MediaCodecVideoConvertor { FileLog.d("photo encoder new format " + newFormat); } if (videoTrackIndex == -5 && newFormat != null) { - videoTrackIndex = mediaMuxer.addTrack(newFormat, false); + videoTrackIndex = muxer.addTrack(newFormat, false); if (newFormat.containsKey(MediaFormat.KEY_PREPEND_HEADER_TO_SYNC_FRAMES) && newFormat.getInteger(MediaFormat.KEY_PREPEND_HEADER_TO_SYNC_FRAMES) == 1) { ByteBuffer spsBuff = newFormat.getByteBuffer("csd-0"); ByteBuffer ppsBuff = newFormat.getByteBuffer("csd-1"); @@ -257,7 +269,7 @@ public class MediaCodecVideoConvertor { cutOfNalData(outputMimeType, encodedData, info); firstEncode = false; } - long availableSize = mediaMuxer.writeSampleData(videoTrackIndex, encodedData, info, true); + long availableSize = muxer.writeSampleData(videoTrackIndex, encodedData, info, true); if (availableSize != 0) { if (callback != null) { if (info.presentationTimeUs > currentPts) { @@ -295,7 +307,7 @@ public class MediaCodecVideoConvertor { newFormat.setByteBuffer("csd-0", sps); newFormat.setByteBuffer("csd-1", pps); } - videoTrackIndex = mediaMuxer.addTrack(newFormat, false); + videoTrackIndex = muxer.addTrack(newFormat, false); } } outputDone = (info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0; @@ -354,7 +366,7 @@ public class MediaCodecVideoConvertor { extractor.setDataSource(videoPath); int videoIndex = MediaController.findTrack(extractor, false); - int audioIndex = bitrate != -1 && !muted ? MediaController.findTrack(extractor, true) : -1; + int audioIndex = bitrate != -1 && !muted && volume > 0 ? MediaController.findTrack(extractor, true) : -1; boolean needConvertVideo = false; if (videoIndex >= 0 && !extractor.getTrackFormat(videoIndex).getString(MediaFormat.KEY_MIME).equals(MediaController.VIDEO_MIME_TYPE)) { needConvertVideo = true; @@ -492,8 +504,7 @@ public class MediaCodecVideoConvertor { inputSurface.makeCurrent(); encoder.start(); - 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 && hasHDR) { hdrInfo = new StoryEntry.HDRInfo(); hdrInfo.colorTransfer = colorTransfer; hdrInfo.colorStandard = colorStandard; @@ -502,11 +513,13 @@ public class MediaCodecVideoConvertor { outputFormat.setInteger(MediaFormat.KEY_COLOR_TRANSFER, MediaFormat.COLOR_TRANSFER_SDR_VIDEO); } } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && hdrInfo != null && hdrInfo.getHDRType() != 0 && outputSurface.supportsEXTYUV()) { + + outputSurface = new OutputSurface(savedFilterState, null, paintPath, blurPath, mediaEntities, cropState, resultWidth, resultHeight, originalWidth, originalHeight, rotationValue, framerate, false, gradientTopColor, gradientBottomColor, hdrInfo, convertVideoParams); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && hdrInfo != null && hdrInfo.getHDRType() != 0) { outputSurface.changeFragmentShader( hdrFragmentShader(originalWidth, originalHeight, resultWidth, resultHeight, true, hdrInfo), hdrFragmentShader(originalWidth, originalHeight, resultWidth, resultHeight, false, hdrInfo), - true + false ); } else if (!isRound && Math.max(resultHeight, resultHeight) / (float) Math.max(originalHeight, originalWidth) < 0.9f) { outputSurface.changeFragmentShader( @@ -528,10 +541,20 @@ public class MediaCodecVideoConvertor { } int maxBufferSize = 0; - mediaMuxer = new MP4Builder().createMovie(movie, isSecret, outputMimeType.equals("video/hevc")); + + if (isWebm) { + muxer = new Muxer(new MediaMuxer(cacheFile.getAbsolutePath(), MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM)); + } else { + Mp4Movie movie = new Mp4Movie(); + movie.setCacheFile(cacheFile); + movie.setRotation(0); + movie.setSize(resultWidth, resultHeight); + muxer = new Muxer(new MP4Builder().createMovie(movie, isSecret, outputMimeType.equals("video/hevc"))); + } + if (audioIndex >= 0) { MediaFormat audioFormat = extractor.getTrackFormat(audioIndex); - copyAudioBuffer = convertVideoParams.soundInfos.isEmpty() && audioFormat.getString(MediaFormat.KEY_MIME).equals(MediaController.AUDIO_MIME_TYPE) || audioFormat.getString(MediaFormat.KEY_MIME).equals("audio/mpeg"); + copyAudioBuffer = Math.abs(volume - 1f) < 0.001f && (convertVideoParams.soundInfos.isEmpty() && audioFormat.getString(MediaFormat.KEY_MIME).equals(MediaController.AUDIO_MIME_TYPE) || audioFormat.getString(MediaFormat.KEY_MIME).equals("audio/mpeg")); if (audioFormat.getString(MediaFormat.KEY_MIME).equals("audio/unknown")) { audioIndex = -1; @@ -539,7 +562,7 @@ public class MediaCodecVideoConvertor { if (audioIndex >= 0) { if (copyAudioBuffer) { - audioTrackIndex = mediaMuxer.addTrack(audioFormat, true); + audioTrackIndex = muxer.addTrack(audioFormat, true); extractor.selectTrack(audioIndex); try { maxBufferSize = audioFormat.getInteger(MediaFormat.KEY_MAX_INPUT_SIZE); @@ -565,11 +588,12 @@ public class MediaCodecVideoConvertor { if (startTime > 0) { mainInput.setStartTimeUs(startTime); } + mainInput.setVolume(volume); audioInputs.add(mainInput); applyAudioInputs(convertVideoParams.soundInfos, audioInputs); audioRecoder = new AudioRecoder(audioInputs, duration); - audioTrackIndex = mediaMuxer.addTrack(audioRecoder.format, true); + audioTrackIndex = muxer.addTrack(audioRecoder.format, true); } } } else if (!convertVideoParams.soundInfos.isEmpty()) { @@ -580,7 +604,7 @@ public class MediaCodecVideoConvertor { applyAudioInputs(convertVideoParams.soundInfos, audioInputs); audioRecoder = new AudioRecoder(audioInputs, duration); - audioTrackIndex = mediaMuxer.addTrack(audioRecoder.format, true); + audioTrackIndex = muxer.addTrack(audioRecoder.format, true); } boolean audioEncoderDone = audioRecoder == null; @@ -589,12 +613,11 @@ public class MediaCodecVideoConvertor { checkConversionCanceled(); - while (!outputDone || (!copyAudioBuffer && !audioEncoderDone)) { checkConversionCanceled(); if (audioRecoder != null) { - audioEncoderDone = audioRecoder.step(mediaMuxer, audioTrackIndex); + audioEncoderDone = audioRecoder.step(muxer, audioTrackIndex); } if (!inputDone) { @@ -641,7 +664,7 @@ public class MediaCodecVideoConvertor { if (info.size > 0 && (endTime < 0 || info.presentationTimeUs < endTime)) { info.offset = 0; info.flags = extractor.getSampleFlags(); - long availableSize = mediaMuxer.writeSampleData(audioTrackIndex, audioBuffer, info, false); + long availableSize = muxer.writeSampleData(audioTrackIndex, audioBuffer, info, false); if (availableSize != 0) { if (callback != null) { if (info.presentationTimeUs - startTime > currentPts) { @@ -677,7 +700,7 @@ public class MediaCodecVideoConvertor { } else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { MediaFormat newFormat = encoder.getOutputFormat(); if (videoTrackIndex == -5 && newFormat != null) { - videoTrackIndex = mediaMuxer.addTrack(newFormat, false); + videoTrackIndex = muxer.addTrack(newFormat, false); if (newFormat.containsKey(MediaFormat.KEY_PREPEND_HEADER_TO_SYNC_FRAMES) && newFormat.getInteger(MediaFormat.KEY_PREPEND_HEADER_TO_SYNC_FRAMES) == 1) { ByteBuffer spsBuff = newFormat.getByteBuffer("csd-0"); ByteBuffer ppsBuff = newFormat.getByteBuffer("csd-1"); @@ -706,7 +729,7 @@ public class MediaCodecVideoConvertor { cutOfNalData(outputMimeType, encodedData, info); firstEncode = false; } - long availableSize = mediaMuxer.writeSampleData(videoTrackIndex, encodedData, info, true); + long availableSize = muxer.writeSampleData(videoTrackIndex, encodedData, info, true); if (availableSize != 0) { if (callback != null) { if (info.presentationTimeUs - startTime > currentPts) { @@ -741,7 +764,7 @@ public class MediaCodecVideoConvertor { newFormat.setByteBuffer("csd-0", sps); newFormat.setByteBuffer("csd-1", pps); } - videoTrackIndex = mediaMuxer.addTrack(newFormat, false); + videoTrackIndex = muxer.addTrack(newFormat, false); } } outputDone = (info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0; @@ -881,8 +904,12 @@ public class MediaCodecVideoConvertor { } checkConversionCanceled(); } else { - mediaMuxer = new MP4Builder().createMovie(movie, isSecret, false); - readAndWriteTracks(extractor, mediaMuxer, info, startTime, endTime, duration, cacheFile, bitrate != -1 && !muted); + Mp4Movie movie = new Mp4Movie(); + movie.setCacheFile(cacheFile); + movie.setRotation(0); + movie.setSize(resultWidth, resultHeight); + muxer = new Muxer(new MP4Builder().createMovie(movie, isSecret, false)); + readAndWriteTracks(extractor, muxer, info, startTime, endTime, duration, cacheFile, bitrate != -1 && !muted); } } } catch (Throwable e) { @@ -893,10 +920,10 @@ public class MediaCodecVideoConvertor { if (extractor != null) { extractor.release(); } - if (mediaMuxer != null) { + if (muxer != null) { try { - mediaMuxer.finishMovie(); - endPresentationTime = mediaMuxer.getLastFrameTimestamp(videoTrackIndex); + muxer.finishMovie(); + endPresentationTime = muxer.getLastFrameTimestamp(videoTrackIndex, info); } catch (Throwable e) { FileLog.e(e); } @@ -974,7 +1001,9 @@ public class MediaCodecVideoConvertor { encoder = MediaCodec.createByCodecName(encoderName); } } else { - outputMimeType = "video/avc"; + if (outputMimeType.equals("video/hevc")) { + outputMimeType = "video/avc"; + } encoder = MediaCodec.createEncoderByType(outputMimeType); } // if (encoder != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && "c2.qti.avc.encoder".equals(encoder.getName())) { @@ -1033,8 +1062,77 @@ public class MediaCodecVideoConvertor { return encoder.getName().equals("c2.mtk.avc.encoder"); } - private long readAndWriteTracks(MediaExtractor extractor, MP4Builder mediaMuxer, - MediaCodec.BufferInfo info, long start, long end, long duration, File file, boolean needAudio) throws Exception { + public static class Muxer { + + public final MP4Builder mp4Builder; + public final MediaMuxer mediaMuxer; + + private boolean started = false; + + public Muxer(MP4Builder mp4Builder) { + this.mp4Builder = mp4Builder; + this.mediaMuxer = null; + } + public Muxer(MediaMuxer mediaMuxer) { + this.mp4Builder = null; + this.mediaMuxer = mediaMuxer; + } + + public int addTrack(MediaFormat format, boolean isAudio) { + if (mediaMuxer != null) { + return mediaMuxer.addTrack(format); + } else if (mp4Builder != null) { + return mp4Builder.addTrack(format, isAudio); + } + return 0; + } + + public long writeSampleData(int trackIndex, ByteBuffer byteBuf, MediaCodec.BufferInfo bufferInfo, boolean writeLength) throws Exception { + if (mediaMuxer != null) { + if (!started) { + mediaMuxer.start(); + started = true; + } + mediaMuxer.writeSampleData(trackIndex, byteBuf, bufferInfo); + return 0; + } else if (mp4Builder != null) { + return mp4Builder.writeSampleData(trackIndex, byteBuf, bufferInfo, writeLength); + } + return 0; + } + + public long getLastFrameTimestamp(int trackIndex, MediaCodec.BufferInfo bufferInfo) { + if (mediaMuxer != null) { + return bufferInfo.presentationTimeUs; + } else if (mp4Builder != null) { + return mp4Builder.getLastFrameTimestamp(trackIndex); + } + return 0; + } + + public void start() { + if (mediaMuxer != null) { + mediaMuxer.start(); + } else if (mp4Builder != null) { + + } + } + + public void finishMovie() throws Exception { + if (mediaMuxer != null) { + mediaMuxer.stop(); + mediaMuxer.release(); + } else if (mp4Builder != null) { + mp4Builder.finishMovie(); + } + } + + } + + private long readAndWriteTracks( + MediaExtractor extractor, Muxer mediaMuxer, + MediaCodec.BufferInfo info, long start, long end, long duration, File file, boolean needAudio + ) throws Exception { int videoTrackIndex = MediaController.findTrack(extractor, false); int audioTrackIndex = needAudio ? MediaController.findTrack(extractor, true) : -1; int muxerVideoTrackIndex = -1; @@ -1201,27 +1299,24 @@ public class MediaCodecVideoConvertor { if (external) { String shaderCode; if (hdrInfo.getHDRType() == 1) { - shaderCode = RLottieDrawable.readRes(null, R.raw.yuv_hlg2rgb); + shaderCode = RLottieDrawable.readRes(null, R.raw.hdr2sdr_hlg); } else { - shaderCode = RLottieDrawable.readRes(null, R.raw.yuv_pq2rgb); + shaderCode = RLottieDrawable.readRes(null, R.raw.hdr2sdr_pq); } shaderCode = shaderCode.replace("$dstWidth", dstWidth + ".0"); shaderCode = shaderCode.replace("$dstHeight", dstHeight + ".0"); // TODO(@dkaraush): use minlum/maxlum return shaderCode + "\n" + - "in vec2 vTextureCoord;\n" + - "out vec4 fragColor;\n" + + "varying vec2 vTextureCoord;\n" + "void main() {\n" + - " fragColor = TEX(vTextureCoord);\n" + + " gl_FragColor = TEX(vTextureCoord);\n" + "}"; } else { - return "#version 320 es\n" + - "precision mediump float;\n" + + return "precision mediump float;\n" + "varying vec2 vTextureCoord;\n" + "uniform sampler2D sTexture;\n" + - "out vec4 fragColor;\n" + "void main() {\n" + - "fragColor = texture(sTexture, vTextureCoord);\n" + + " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + "}\n"; } } @@ -1343,12 +1438,14 @@ public class MediaCodecVideoConvertor { Integer gradientTopColor; Integer gradientBottomColor; boolean muted; + float volume; boolean isStory; StoryEntry.HDRInfo hdrInfo; public ArrayList soundInfos = new ArrayList(); int account; boolean isDark; long wallpaperPeerId; + boolean isSticker; private ConvertVideoParams() { @@ -1391,6 +1488,7 @@ public class MediaCodecVideoConvertor { params.gradientTopColor = info.gradientTopColor; params.gradientBottomColor = info.gradientBottomColor; params.muted = info.muted; + params.volume = info.volume; params.isStory = info.isStory; params.hdrInfo = info.hdrInfo; params.isDark = info.isDark; @@ -1399,6 +1497,7 @@ public class MediaCodecVideoConvertor { params.messagePath = info.messagePath; params.messageVideoMaskPath = info.messageVideoMaskPath; params.backgroundPath = info.backgroundPath; + params.isSticker = info.isSticker; return params; } } @@ -1415,4 +1514,5 @@ public class MediaCodecVideoConvertor { this.audioFile = file; } } + } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/video/TextureRenderer.java b/TMessagesProj/src/main/java/org/telegram/messenger/video/TextureRenderer.java index fcd99b717..f27b855b5 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/video/TextureRenderer.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/video/TextureRenderer.java @@ -1207,174 +1207,9 @@ public class TextureRenderer { ) { initStickerEntity(entity); } else if (entity.type == VideoEditedInfo.MediaEntity.TYPE_TEXT) { - EditTextOutline editText = new EditTextOutline(ApplicationLoader.applicationContext); - editText.getPaint().setAntiAlias(true); - editText.drawAnimatedEmojiDrawables = false; - editText.setBackgroundColor(Color.TRANSPARENT); - editText.setPadding(AndroidUtilities.dp(7), AndroidUtilities.dp(7), AndroidUtilities.dp(7), AndroidUtilities.dp(7)); - Typeface typeface; - if (entity.textTypeface != null && (typeface = entity.textTypeface.getTypeface()) != null) { - editText.setTypeface(typeface); - } - editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, entity.fontSize); - SpannableString text = new SpannableString(entity.text); - for (VideoEditedInfo.EmojiEntity e : entity.entities) { - if (e.documentAbsolutePath == null) { - continue; - } - e.entity = new VideoEditedInfo.MediaEntity(); - e.entity.text = e.documentAbsolutePath; - e.entity.subType = e.subType; - AnimatedEmojiSpan span = new AnimatedEmojiSpan(0L, 1f, editText.getPaint().getFontMetricsInt()) { - @Override - public void draw(@NonNull Canvas canvas, CharSequence charSequence, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { - super.draw(canvas, charSequence, start, end, x, top, y, bottom, paint); - - float tcx = entity.x + (editText.getPaddingLeft() + x + measuredSize / 2f) / entity.viewWidth * entity.width; - float tcy = entity.y + (editText.getPaddingTop() + top + (bottom - top) / 2f) / entity.viewHeight * entity.height; - - if (entity.rotation != 0) { - float mx = entity.x + entity.width / 2f; - float my = entity.y + entity.height / 2f; - float ratio = transformedWidth / (float) transformedHeight; - float x1 = tcx - mx; - float y1 = (tcy - my) / ratio; - tcx = (float) (x1 * Math.cos(-entity.rotation) - y1 * Math.sin(-entity.rotation)) + mx; - tcy = (float) (x1 * Math.sin(-entity.rotation) + y1 * Math.cos(-entity.rotation)) * ratio + my; - } - - e.entity.width = (float) measuredSize / entity.viewWidth * entity.width; - e.entity.height = (float) measuredSize / entity.viewHeight * entity.height; - e.entity.x = tcx - e.entity.width / 2f; - e.entity.y = tcy - e.entity.height / 2f; - e.entity.rotation = entity.rotation; - - if (e.entity.bitmap == null) - initStickerEntity(e.entity); - } - }; - text.setSpan(span, e.offset, e.offset + e.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - editText.setText(Emoji.replaceEmoji(text, editText.getPaint().getFontMetricsInt(), (int) (editText.getTextSize() * .8f), false)); - editText.setTextColor(entity.color); - CharSequence text2 = editText.getText(); - if (text2 instanceof Spanned) { - Emoji.EmojiSpan[] spans = ((Spanned) text2).getSpans(0, text2.length(), Emoji.EmojiSpan.class); - for (int i = 0; i < spans.length; ++i) { - spans[i].scale = .85f; - } - } - - - int gravity; - switch (entity.textAlign) { - default: - case PaintTextOptionsView.ALIGN_LEFT: - gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; - break; - case PaintTextOptionsView.ALIGN_CENTER: - gravity = Gravity.CENTER; - break; - case PaintTextOptionsView.ALIGN_RIGHT: - gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL; - break; - } - - editText.setGravity(gravity); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - int textAlign; - switch (entity.textAlign) { - default: - case PaintTextOptionsView.ALIGN_LEFT: - textAlign = LocaleController.isRTL ? View.TEXT_ALIGNMENT_TEXT_END : View.TEXT_ALIGNMENT_TEXT_START; - break; - case PaintTextOptionsView.ALIGN_CENTER: - textAlign = View.TEXT_ALIGNMENT_CENTER; - break; - case PaintTextOptionsView.ALIGN_RIGHT: - textAlign = LocaleController.isRTL ? View.TEXT_ALIGNMENT_TEXT_START : View.TEXT_ALIGNMENT_TEXT_END; - break; - } - editText.setTextAlignment(textAlign); - } - - editText.setHorizontallyScrolling(false); - editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); - editText.setFocusableInTouchMode(true); - editText.setInputType(editText.getInputType() | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES); - if (Build.VERSION.SDK_INT >= 23) { - setBreakStrategy(editText); - } - if (entity.subType == 0) { - editText.setFrameColor(entity.color); - editText.setTextColor(AndroidUtilities.computePerceivedBrightness(entity.color) >= .721f ? Color.BLACK : Color.WHITE); - } else if (entity.subType == 1) { - editText.setFrameColor(AndroidUtilities.computePerceivedBrightness(entity.color) >= .25f ? 0x99000000 : 0x99ffffff); - editText.setTextColor(entity.color); - } else if (entity.subType == 2) { - editText.setFrameColor(AndroidUtilities.computePerceivedBrightness(entity.color) >= .25f ? Color.BLACK : Color.WHITE); - editText.setTextColor(entity.color); - } else if (entity.subType == 3) { - editText.setFrameColor(0); - editText.setTextColor(entity.color); - } - - editText.measure(View.MeasureSpec.makeMeasureSpec(entity.viewWidth, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(entity.viewHeight, View.MeasureSpec.EXACTLY)); - editText.layout(0, 0, entity.viewWidth, entity.viewHeight); - entity.bitmap = Bitmap.createBitmap(entity.viewWidth, entity.viewHeight, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(entity.bitmap); - editText.draw(canvas); + initTextEntity(entity); } else if (entity.type == VideoEditedInfo.MediaEntity.TYPE_LOCATION) { - LocationMarker marker = new LocationMarker(ApplicationLoader.applicationContext, entity.density); - marker.setText(entity.text); - marker.setType(entity.subType, entity.color); - marker.setMaxWidth(entity.viewWidth); - if (entity.entities.size() == 1) { - marker.forceEmoji(); - } - marker.measure(View.MeasureSpec.makeMeasureSpec(entity.viewWidth, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(entity.viewHeight, View.MeasureSpec.EXACTLY)); - marker.layout(0, 0, entity.viewWidth, entity.viewHeight); - float scale = entity.width * transformedWidth / entity.viewWidth; - int w = (int) (entity.viewWidth * scale), h = (int) (entity.viewHeight * scale), pad = 8; - entity.bitmap = Bitmap.createBitmap(w + pad + pad, h + pad + pad, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(entity.bitmap); - canvas.translate(pad, pad); - canvas.scale(scale, scale); - marker.draw(canvas); - entity.additionalWidth = (2 * pad) * scale / transformedWidth; - entity.additionalHeight = (2 * pad) * scale / transformedHeight; - if (entity.entities.size() == 1) { - VideoEditedInfo.EmojiEntity e = entity.entities.get(0); - e.entity = new VideoEditedInfo.MediaEntity(); - e.entity.text = e.documentAbsolutePath; - e.entity.subType = e.subType; - - RectF bounds = new RectF(); - marker.getEmojiBounds(bounds); - - float tcx = entity.x + (bounds.centerX()) / entity.viewWidth * entity.width; - float tcy = entity.y + (bounds.centerY()) / entity.viewHeight * entity.height; - - if (entity.rotation != 0) { - float mx = entity.x + entity.width / 2f; - float my = entity.y + entity.height / 2f; - float ratio = transformedWidth / (float) transformedHeight; - float x1 = tcx - mx; - float y1 = (tcy - my) / ratio; - tcx = (float) (x1 * Math.cos(-entity.rotation) - y1 * Math.sin(-entity.rotation)) + mx; - tcy = (float) (x1 * Math.sin(-entity.rotation) + y1 * Math.cos(-entity.rotation)) * ratio + my; - } - - e.entity.width = (float) bounds.width() / entity.viewWidth * entity.width; - e.entity.height = (float) bounds.height() / entity.viewHeight * entity.height; - e.entity.width *= LocationMarker.SCALE; - e.entity.height *= LocationMarker.SCALE; - e.entity.x = tcx - e.entity.width / 2f; - e.entity.y = tcy - e.entity.height / 2f; - e.entity.rotation = entity.rotation; - - initStickerEntity(e.entity); - } + initLocationEntity(entity); } } } catch (Throwable e) { @@ -1383,6 +1218,179 @@ public class TextureRenderer { } } + private void initTextEntity(VideoEditedInfo.MediaEntity entity) { + EditTextOutline editText = new EditTextOutline(ApplicationLoader.applicationContext); + editText.getPaint().setAntiAlias(true); + editText.drawAnimatedEmojiDrawables = false; + editText.setBackgroundColor(Color.TRANSPARENT); + editText.setPadding(AndroidUtilities.dp(7), AndroidUtilities.dp(7), AndroidUtilities.dp(7), AndroidUtilities.dp(7)); + Typeface typeface; + if (entity.textTypeface != null && (typeface = entity.textTypeface.getTypeface()) != null) { + editText.setTypeface(typeface); + } + editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, entity.fontSize); + SpannableString text = new SpannableString(entity.text); + for (VideoEditedInfo.EmojiEntity e : entity.entities) { + if (e.documentAbsolutePath == null) { + continue; + } + e.entity = new VideoEditedInfo.MediaEntity(); + e.entity.text = e.documentAbsolutePath; + e.entity.subType = e.subType; + AnimatedEmojiSpan span = new AnimatedEmojiSpan(0L, 1f, editText.getPaint().getFontMetricsInt()) { + @Override + public void draw(@NonNull Canvas canvas, CharSequence charSequence, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { + super.draw(canvas, charSequence, start, end, x, top, y, bottom, paint); + + float tcx = entity.x + (editText.getPaddingLeft() + x + measuredSize / 2f) / entity.viewWidth * entity.width; + float tcy = entity.y + (editText.getPaddingTop() + top + (bottom - top) / 2f) / entity.viewHeight * entity.height; + + if (entity.rotation != 0) { + float mx = entity.x + entity.width / 2f; + float my = entity.y + entity.height / 2f; + float ratio = transformedWidth / (float) transformedHeight; + float x1 = tcx - mx; + float y1 = (tcy - my) / ratio; + tcx = (float) (x1 * Math.cos(-entity.rotation) - y1 * Math.sin(-entity.rotation)) + mx; + tcy = (float) (x1 * Math.sin(-entity.rotation) + y1 * Math.cos(-entity.rotation)) * ratio + my; + } + + e.entity.width = (float) measuredSize / entity.viewWidth * entity.width; + e.entity.height = (float) measuredSize / entity.viewHeight * entity.height; + e.entity.x = tcx - e.entity.width / 2f; + e.entity.y = tcy - e.entity.height / 2f; + e.entity.rotation = entity.rotation; + + if (e.entity.bitmap == null) + initStickerEntity(e.entity); + } + }; + text.setSpan(span, e.offset, e.offset + e.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + editText.setText(Emoji.replaceEmoji(text, editText.getPaint().getFontMetricsInt(), (int) (editText.getTextSize() * .8f), false)); + editText.setTextColor(entity.color); + CharSequence text2 = editText.getText(); + if (text2 instanceof Spanned) { + Emoji.EmojiSpan[] spans = ((Spanned) text2).getSpans(0, text2.length(), Emoji.EmojiSpan.class); + for (int i = 0; i < spans.length; ++i) { + spans[i].scale = .85f; + } + } + + + int gravity; + switch (entity.textAlign) { + default: + case PaintTextOptionsView.ALIGN_LEFT: + gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; + break; + case PaintTextOptionsView.ALIGN_CENTER: + gravity = Gravity.CENTER; + break; + case PaintTextOptionsView.ALIGN_RIGHT: + gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL; + break; + } + + editText.setGravity(gravity); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + int textAlign; + switch (entity.textAlign) { + default: + case PaintTextOptionsView.ALIGN_LEFT: + textAlign = LocaleController.isRTL ? View.TEXT_ALIGNMENT_TEXT_END : View.TEXT_ALIGNMENT_TEXT_START; + break; + case PaintTextOptionsView.ALIGN_CENTER: + textAlign = View.TEXT_ALIGNMENT_CENTER; + break; + case PaintTextOptionsView.ALIGN_RIGHT: + textAlign = LocaleController.isRTL ? View.TEXT_ALIGNMENT_TEXT_START : View.TEXT_ALIGNMENT_TEXT_END; + break; + } + editText.setTextAlignment(textAlign); + } + + editText.setHorizontallyScrolling(false); + editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); + editText.setFocusableInTouchMode(true); + editText.setInputType(editText.getInputType() | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES); + if (Build.VERSION.SDK_INT >= 23) { + setBreakStrategy(editText); + } + if (entity.subType == 0) { + editText.setFrameColor(entity.color); + editText.setTextColor(AndroidUtilities.computePerceivedBrightness(entity.color) >= .721f ? Color.BLACK : Color.WHITE); + } else if (entity.subType == 1) { + editText.setFrameColor(AndroidUtilities.computePerceivedBrightness(entity.color) >= .25f ? 0x99000000 : 0x99ffffff); + editText.setTextColor(entity.color); + } else if (entity.subType == 2) { + editText.setFrameColor(AndroidUtilities.computePerceivedBrightness(entity.color) >= .25f ? Color.BLACK : Color.WHITE); + editText.setTextColor(entity.color); + } else if (entity.subType == 3) { + editText.setFrameColor(0); + editText.setTextColor(entity.color); + } + + editText.measure(View.MeasureSpec.makeMeasureSpec(entity.viewWidth, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(entity.viewHeight, View.MeasureSpec.EXACTLY)); + editText.layout(0, 0, entity.viewWidth, entity.viewHeight); + entity.bitmap = Bitmap.createBitmap(entity.viewWidth, entity.viewHeight, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(entity.bitmap); + editText.draw(canvas); + } + + private void initLocationEntity(VideoEditedInfo.MediaEntity entity) { + LocationMarker marker = new LocationMarker(ApplicationLoader.applicationContext, entity.density); + marker.setText(entity.text); + marker.setType(entity.subType, entity.color); + marker.setMaxWidth(entity.viewWidth); + if (entity.entities.size() == 1) { + marker.forceEmoji(); + } + marker.measure(View.MeasureSpec.makeMeasureSpec(entity.viewWidth, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(entity.viewHeight, View.MeasureSpec.EXACTLY)); + marker.layout(0, 0, entity.viewWidth, entity.viewHeight); + float scale = entity.width * transformedWidth / entity.viewWidth; + int w = (int) (entity.viewWidth * scale), h = (int) (entity.viewHeight * scale), pad = 8; + entity.bitmap = Bitmap.createBitmap(w + pad + pad, h + pad + pad, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(entity.bitmap); + canvas.translate(pad, pad); + canvas.scale(scale, scale); + marker.draw(canvas); + entity.additionalWidth = (2 * pad) * scale / transformedWidth; + entity.additionalHeight = (2 * pad) * scale / transformedHeight; + if (entity.entities.size() == 1) { + VideoEditedInfo.EmojiEntity e = entity.entities.get(0); + e.entity = new VideoEditedInfo.MediaEntity(); + e.entity.text = e.documentAbsolutePath; + e.entity.subType = e.subType; + + RectF bounds = new RectF(); + marker.getEmojiBounds(bounds); + + float tcx = entity.x + (bounds.centerX()) / entity.viewWidth * entity.width; + float tcy = entity.y + (bounds.centerY()) / entity.viewHeight * entity.height; + + if (entity.rotation != 0) { + float mx = entity.x + entity.width / 2f; + float my = entity.y + entity.height / 2f; + float ratio = transformedWidth / (float) transformedHeight; + float x1 = tcx - mx; + float y1 = (tcy - my) / ratio; + tcx = (float) (x1 * Math.cos(-entity.rotation) - y1 * Math.sin(-entity.rotation)) + mx; + tcy = (float) (x1 * Math.sin(-entity.rotation) + y1 * Math.cos(-entity.rotation)) * ratio + my; + } + + e.entity.width = (float) bounds.width() / entity.viewWidth * entity.width; + e.entity.height = (float) bounds.height() / entity.viewHeight * entity.height; + e.entity.width *= LocationMarker.SCALE; + e.entity.height *= LocationMarker.SCALE; + e.entity.x = tcx - e.entity.width / 2f; + e.entity.y = tcy - e.entity.height / 2f; + e.entity.rotation = entity.rotation; + + initStickerEntity(e.entity); + } + } + private void initStickerEntity(VideoEditedInfo.MediaEntity entity) { entity.W = (int) (entity.width * transformedWidth); entity.H = (int) (entity.height * transformedHeight); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/video/VideoPlayerHolderBase.java b/TMessagesProj/src/main/java/org/telegram/messenger/video/VideoPlayerHolderBase.java index b54212888..ccca9d828 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/video/VideoPlayerHolderBase.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/video/VideoPlayerHolderBase.java @@ -187,7 +187,7 @@ public class VideoPlayerHolderBase { triesCount--; if (triesCount > 0) { dispatchQueue.postRunnable(initRunnable = () -> { - if (released) { + if (released || uri == null) { return; } videoPlayer.preparePlayer(uri, "other"); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/video/WebmEncoder.java b/TMessagesProj/src/main/java/org/telegram/messenger/video/WebmEncoder.java new file mode 100644 index 000000000..d7d3feddf --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/video/WebmEncoder.java @@ -0,0 +1,490 @@ +package org.telegram.messenger.video; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.RectF; +import android.graphics.Typeface; +import android.opengl.GLES20; +import android.opengl.GLUtils; +import android.os.Build; +import android.text.Layout; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.util.Log; +import android.util.Pair; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.inputmethod.EditorInfo; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + +import com.google.common.collect.BiMap; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.Bitmaps; +import org.telegram.messenger.Emoji; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; +import org.telegram.messenger.VideoEditedInfo; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiSpan; +import org.telegram.ui.Components.AnimatedFileDrawable; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.Paint.Views.EditTextOutline; +import org.telegram.ui.Components.Paint.Views.PaintTextOptionsView; +import org.telegram.ui.Components.RLottieDrawable; + +import java.io.File; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.util.ArrayList; + +import javax.microedition.khronos.opengles.GL10; + +public class WebmEncoder { + + private static native long createEncoder( + String outputPath, + int width, int height, + int fps, long bitrate + ); + private static native boolean writeFrame( + long ptr, + ByteBuffer argbPixels, + int width, int height + ); + public static native void stop(long ptr); + + + public static boolean convert(MediaCodecVideoConvertor.ConvertVideoParams params) { + final int W = params.resultWidth; + final int H = params.resultHeight; + + final long ptr = createEncoder(params.cacheFile.getAbsolutePath(), W, H, params.framerate, params.bitrate); + if (ptr == 0) { + return true; + } + + boolean error = false; + Bitmap bitmap = null; + try { + + bitmap = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888); + ByteBuffer buffer = ByteBuffer.allocateDirect(bitmap.getByteCount()); + + Canvas canvas = new Canvas(bitmap); + FrameDrawer frameDrawer = new FrameDrawer(params); + + final int framesCount = (int) Math.ceil(params.framerate * (params.duration / 1000.0)); + for (int frame = 0; frame < framesCount; ++frame) { + frameDrawer.draw(canvas, frame); + + bitmap.copyPixelsToBuffer(buffer); + buffer.flip(); + + if (!writeFrame(ptr, buffer, W, H)) { + FileLog.d("webm writeFile error at " + frame + "/" + framesCount); + return true; + } + + if (params.callback != null) { + params.callback.didWriteData(params.cacheFile.length(), (float) frame / framesCount); + } + + if (frame % 3 == 0 && params.callback != null) { + params.callback.checkConversionCanceled(); + } + } + } catch (Exception e) { + FileLog.e(e); + error = true; + } finally { + stop(ptr); + if (bitmap != null) { + bitmap.recycle(); + } + } + + if (params.callback != null) { + params.callback.didWriteData(params.cacheFile.length(), 1f); + } + + FileLog.d("webm encoded to " + params.cacheFile + " with size=" + params.cacheFile.length()); + + return error; + } + + public static class FrameDrawer { + + private final int W, H; + private final int fps; + + private final Bitmap photo; + private final ArrayList mediaEntities = new ArrayList<>(); + + private final Paint clearPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); + + public FrameDrawer(MediaCodecVideoConvertor.ConvertVideoParams params) { + this.W = params.resultWidth; + this.H = params.resultHeight; + this.fps = params.framerate; + + photo = BitmapFactory.decodeFile(params.videoPath); + + mediaEntities.addAll(params.mediaEntities); + for (int a = 0, N = mediaEntities.size(); a < N; a++) { + VideoEditedInfo.MediaEntity entity = mediaEntities.get(a); + if ( + entity.type == VideoEditedInfo.MediaEntity.TYPE_STICKER || + entity.type == VideoEditedInfo.MediaEntity.TYPE_PHOTO || + entity.type == VideoEditedInfo.MediaEntity.TYPE_ROUND + ) { + initStickerEntity(entity); + } else if (entity.type == VideoEditedInfo.MediaEntity.TYPE_TEXT) { + initTextEntity(entity); + } + } + + clearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + } + + public void draw(Canvas canvas, int frame) { + canvas.drawPaint(clearPaint); + if (photo != null) { + canvas.drawBitmap(photo, 0, 0, null); + } + final long time = frame * (1_000_000_000L / fps); + for (int a = 0, N = mediaEntities.size(); a < N; a++) { + VideoEditedInfo.MediaEntity entity = mediaEntities.get(a); + drawEntity(canvas, entity, entity.color, time); + } + } + + private void drawEntity(Canvas canvas, VideoEditedInfo.MediaEntity entity, int textColor, long time) { + if (entity.ptr != 0) { + if (entity.bitmap == null || entity.W <= 0 || entity.H <= 0) { + return; + } + RLottieDrawable.getFrame(entity.ptr, (int) entity.currentFrame, entity.bitmap, entity.W, entity.H, entity.bitmap.getRowBytes(), true); + applyRoundRadius(entity, entity.bitmap, (entity.subType & 8) != 0 ? textColor : 0); + + canvas.drawBitmap(entity.bitmap, entity.matrix, bitmapPaint); + + entity.currentFrame += entity.framesPerDraw; + if (entity.currentFrame >= entity.metadata[0]) { + entity.currentFrame = 0; + } + } else if (entity.animatedFileDrawable != null) { + int lastFrame = (int) entity.currentFrame; + float scale = 1f; + entity.currentFrame += entity.framesPerDraw; + int currentFrame = (int) entity.currentFrame; + while (lastFrame != currentFrame) { + entity.animatedFileDrawable.getNextFrame(true); + currentFrame--; + } + Bitmap frameBitmap = entity.animatedFileDrawable.getBackgroundBitmap(); + if (frameBitmap != null) { + canvas.drawBitmap(frameBitmap, entity.matrix, bitmapPaint); + } + } else { + canvas.drawBitmap(entity.bitmap, entity.matrix, bitmapPaint); + if (entity.entities != null && !entity.entities.isEmpty()) { + for (int i = 0; i < entity.entities.size(); ++i) { + VideoEditedInfo.EmojiEntity e = entity.entities.get(i); + if (e == null) { + continue; + } + VideoEditedInfo.MediaEntity entity1 = e.entity; + if (entity1 == null) { + continue; + } + drawEntity(canvas, entity1, entity.color, time); + } + } + } + } + + private void initTextEntity(VideoEditedInfo.MediaEntity entity) { + EditTextOutline editText = new EditTextOutline(ApplicationLoader.applicationContext); + editText.getPaint().setAntiAlias(true); + editText.drawAnimatedEmojiDrawables = false; + editText.setBackgroundColor(Color.TRANSPARENT); + editText.setPadding(AndroidUtilities.dp(7), AndroidUtilities.dp(7), AndroidUtilities.dp(7), AndroidUtilities.dp(7)); + Typeface typeface; + if (entity.textTypeface != null && (typeface = entity.textTypeface.getTypeface()) != null) { + editText.setTypeface(typeface); + } + editText.setTextSize(TypedValue.COMPLEX_UNIT_PX, entity.fontSize); + SpannableString text = new SpannableString(entity.text); + for (VideoEditedInfo.EmojiEntity e : entity.entities) { + if (e.documentAbsolutePath == null) { + continue; + } + e.entity = new VideoEditedInfo.MediaEntity(); + e.entity.text = e.documentAbsolutePath; + e.entity.subType = e.subType; + AnimatedEmojiSpan span = new AnimatedEmojiSpan(0L, 1f, editText.getPaint().getFontMetricsInt()) { + @Override + public void draw(@NonNull Canvas canvas, CharSequence charSequence, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { + super.draw(canvas, charSequence, start, end, x, top, y, bottom, paint); + + float tcx = entity.x + (editText.getPaddingLeft() + x + measuredSize / 2f) / entity.viewWidth * entity.width; + float tcy = entity.y + (editText.getPaddingTop() + top + (bottom - top) / 2f) / entity.viewHeight * entity.height; + + if (entity.rotation != 0) { + float mx = entity.x + entity.width / 2f; + float my = entity.y + entity.height / 2f; + float ratio = W / (float) H; + float x1 = tcx - mx; + float y1 = (tcy - my) / ratio; + tcx = (float) (x1 * Math.cos(-entity.rotation) - y1 * Math.sin(-entity.rotation)) + mx; + tcy = (float) (x1 * Math.sin(-entity.rotation) + y1 * Math.cos(-entity.rotation)) * ratio + my; + } + + e.entity.width = (float) measuredSize / entity.viewWidth * entity.width; + e.entity.height = (float) measuredSize / entity.viewHeight * entity.height; + e.entity.x = tcx - e.entity.width / 2f; + e.entity.y = tcy - e.entity.height / 2f; + e.entity.rotation = entity.rotation; + + if (e.entity.bitmap == null) + initStickerEntity(e.entity); + } + }; + text.setSpan(span, e.offset, e.offset + e.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + editText.setText(Emoji.replaceEmoji(text, editText.getPaint().getFontMetricsInt(), (int) (editText.getTextSize() * .8f), false)); + editText.setTextColor(entity.color); + CharSequence text2 = editText.getText(); + if (text2 instanceof Spanned) { + Emoji.EmojiSpan[] spans = ((Spanned) text2).getSpans(0, text2.length(), Emoji.EmojiSpan.class); + for (int i = 0; i < spans.length; ++i) { + spans[i].scale = .85f; + } + } + + + int gravity; + switch (entity.textAlign) { + default: + case PaintTextOptionsView.ALIGN_LEFT: + gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; + break; + case PaintTextOptionsView.ALIGN_CENTER: + gravity = Gravity.CENTER; + break; + case PaintTextOptionsView.ALIGN_RIGHT: + gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL; + break; + } + + editText.setGravity(gravity); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + int textAlign; + switch (entity.textAlign) { + default: + case PaintTextOptionsView.ALIGN_LEFT: + textAlign = LocaleController.isRTL ? View.TEXT_ALIGNMENT_TEXT_END : View.TEXT_ALIGNMENT_TEXT_START; + break; + case PaintTextOptionsView.ALIGN_CENTER: + textAlign = View.TEXT_ALIGNMENT_CENTER; + break; + case PaintTextOptionsView.ALIGN_RIGHT: + textAlign = LocaleController.isRTL ? View.TEXT_ALIGNMENT_TEXT_START : View.TEXT_ALIGNMENT_TEXT_END; + break; + } + editText.setTextAlignment(textAlign); + } + + editText.setHorizontallyScrolling(false); + editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); + editText.setFocusableInTouchMode(true); + editText.setInputType(editText.getInputType() | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES); + if (Build.VERSION.SDK_INT >= 23) { + setBreakStrategy(editText); + } + if (entity.subType == 0) { + editText.setFrameColor(entity.color); + editText.setTextColor(AndroidUtilities.computePerceivedBrightness(entity.color) >= .721f ? Color.BLACK : Color.WHITE); + } else if (entity.subType == 1) { + editText.setFrameColor(AndroidUtilities.computePerceivedBrightness(entity.color) >= .25f ? 0x99000000 : 0x99ffffff); + editText.setTextColor(entity.color); + } else if (entity.subType == 2) { + editText.setFrameColor(AndroidUtilities.computePerceivedBrightness(entity.color) >= .25f ? Color.BLACK : Color.WHITE); + editText.setTextColor(entity.color); + } else if (entity.subType == 3) { + editText.setFrameColor(0); + editText.setTextColor(entity.color); + } + + editText.measure(View.MeasureSpec.makeMeasureSpec(entity.viewWidth, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(entity.viewHeight, View.MeasureSpec.EXACTLY)); + editText.layout(0, 0, entity.viewWidth, entity.viewHeight); + entity.bitmap = Bitmap.createBitmap(entity.viewWidth, entity.viewHeight, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(entity.bitmap); + editText.draw(canvas); + + setupMatrix(entity); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + public void setBreakStrategy(EditTextOutline editText) { + editText.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); + } + + private void initStickerEntity(VideoEditedInfo.MediaEntity entity) { + entity.W = (int) (entity.width * W); + entity.H = (int) (entity.height * H); + if (entity.W > 512) { + entity.H = (int) (entity.H / (float) entity.W * 512); + entity.W = 512; + } + if (entity.H > 512) { + entity.W = (int) (entity.W / (float) entity.H * 512); + entity.H = 512; + } + if ((entity.subType & 1) != 0) { + if (entity.W <= 0 || entity.H <= 0) { + return; + } + entity.bitmap = Bitmap.createBitmap(entity.W, entity.H, Bitmap.Config.ARGB_8888); + entity.metadata = new int[3]; + entity.ptr = RLottieDrawable.create(entity.text, null, entity.W, entity.H, entity.metadata, false, null, false, 0); + entity.framesPerDraw = entity.metadata[1] / fps; + } else if ((entity.subType & 4) != 0) { + entity.looped = false; + entity.animatedFileDrawable = new AnimatedFileDrawable(new File(entity.text), true, 0, 0, null, null, null, 0, UserConfig.selectedAccount, true, 512, 512, null); + entity.framesPerDraw = entity.animatedFileDrawable.getFps() / fps; + entity.currentFrame = 1; + entity.animatedFileDrawable.getNextFrame(true); + if (entity.type == VideoEditedInfo.MediaEntity.TYPE_ROUND) { + entity.firstSeek = true; + } + } else { + String path = entity.text; + if (!TextUtils.isEmpty(entity.segmentedPath) && (entity.subType & 16) != 0) { + path = entity.segmentedPath; + } + if (Build.VERSION.SDK_INT >= 19) { + BitmapFactory.Options opts = new BitmapFactory.Options(); + if (entity.type == VideoEditedInfo.MediaEntity.TYPE_PHOTO) { + opts.inMutable = true; + } + entity.bitmap = BitmapFactory.decodeFile(path, opts); + } else { + try { + File filePath = new File(path); + RandomAccessFile file = new RandomAccessFile(filePath, "r"); + ByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, filePath.length()); + BitmapFactory.Options bmOptions = new BitmapFactory.Options(); + bmOptions.inJustDecodeBounds = true; + Utilities.loadWebpImage(null, buffer, buffer.limit(), bmOptions, true); + if (entity.type == VideoEditedInfo.MediaEntity.TYPE_PHOTO) { + bmOptions.inMutable = true; + } + entity.bitmap = Bitmaps.createBitmap(bmOptions.outWidth, bmOptions.outHeight, Bitmap.Config.ARGB_8888); + Utilities.loadWebpImage(entity.bitmap, buffer, buffer.limit(), null, true); + file.close(); + } catch (Throwable e) { + FileLog.e(e); + } + } + if (entity.type == VideoEditedInfo.MediaEntity.TYPE_PHOTO && entity.bitmap != null) { + entity.roundRadius = AndroidUtilities.dp(12) / (float) Math.min(entity.viewWidth, entity.viewHeight); + Pair orientation = AndroidUtilities.getImageOrientation(entity.text); + entity.rotation -= Math.toRadians(orientation.first); + if ((orientation.first / 90 % 2) == 1) { + float cx = entity.x + entity.width / 2f, cy = entity.y + entity.height / 2f; + + float w = entity.width * W / H; + entity.width = entity.height * H / W; + entity.height = w; + + entity.x = cx - entity.width / 2f; + entity.y = cy - entity.height / 2f; + } + applyRoundRadius(entity, entity.bitmap, 0); + } else if (entity.bitmap != null) { + float aspect = entity.bitmap.getWidth() / (float) entity.bitmap.getHeight(); + if (aspect > 1) { + float h = entity.height / aspect; + entity.y += (entity.height - h) / 2; + entity.height = h; + } else if (aspect < 1) { + float w = entity.width * aspect; + entity.x += (entity.width - w) / 2; + entity.width = w; + } + } + } + + setupMatrix(entity); + } + + private void setupMatrix(VideoEditedInfo.MediaEntity entity) { + entity.matrix = new Matrix(); + Bitmap bitmap = entity.bitmap; + if (bitmap == null && entity.animatedFileDrawable != null) { + bitmap = entity.animatedFileDrawable.getBackgroundBitmap(); + } + if (bitmap != null) { + entity.matrix.postScale(1f / bitmap.getWidth(), 1f / bitmap.getHeight()); + } + entity.matrix.postScale(entity.width * W, entity.height * H); + entity.matrix.postTranslate(entity.x * W, entity.y * H); + entity.matrix.postRotate((float) (-entity.rotation / Math.PI * 180), (entity.x + entity.width) * W, (entity.x + entity.height) * H); + } + + Path path; + Paint xRefPaint; + Paint textColorPaint; + private void applyRoundRadius(VideoEditedInfo.MediaEntity entity, Bitmap stickerBitmap, int color) { + if (stickerBitmap == null || entity == null || entity.roundRadius == 0 && color == 0) { + return; + } + if (entity.roundRadiusCanvas == null) { + entity.roundRadiusCanvas = new Canvas(stickerBitmap); + } + if (entity.roundRadius != 0) { + if (path == null) { + path = new Path(); + } + if (xRefPaint == null) { + xRefPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + xRefPaint.setColor(0xff000000); + xRefPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + } + float rad = Math.min(stickerBitmap.getWidth(), stickerBitmap.getHeight()) * entity.roundRadius; + path.rewind(); + RectF rect = new RectF(0, 0, stickerBitmap.getWidth(), stickerBitmap.getHeight()); + path.addRoundRect(rect, rad, rad, Path.Direction.CCW); + path.toggleInverseFillType(); + entity.roundRadiusCanvas.drawPath(path, xRefPaint); + } + if (color != 0) { + if (textColorPaint == null) { + textColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + textColorPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); + } + textColorPaint.setColor(color); + entity.roundRadiusCanvas.drawRect(0, 0, stickerBitmap.getWidth(), stickerBitmap.getHeight(), textColorPaint); + } + } + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java index e1e43b15a..f4ade688f 100644 --- a/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java @@ -7,6 +7,8 @@ import android.content.pm.PackageInfo; import android.os.AsyncTask; import android.os.Build; import android.os.SystemClock; +import android.text.SpannableString; +import android.text.Spanned; import android.text.TextUtils; import android.util.Base64; import android.util.LongSparseArray; @@ -23,17 +25,28 @@ import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BaseController; import org.telegram.messenger.BuildVars; import org.telegram.messenger.EmuDetector; +import org.telegram.messenger.FileLoadOperation; +import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; +import org.telegram.messenger.FileUploadOperation; import org.telegram.messenger.KeepAliveJob; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.PushListenerController; +import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.StatsController; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; import org.telegram.messenger.Utilities; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.TypefaceSpan; +import org.telegram.ui.DialogsActivity; +import org.telegram.ui.LaunchActivity; +import org.telegram.ui.PremiumPreviewFragment; import java.io.ByteArrayOutputStream; import java.io.File; @@ -707,7 +720,7 @@ public class ConnectionsManager extends BaseController { buff.reused = true; int constructor = buff.readInt32(true); final TLObject message = TLClassStore.Instance().TLdeserialize(buff, constructor, true); - FileLog.dumpUnparsedMessage(message, messageId); + FileLog.dumpUnparsedMessage(message, messageId, currentAccount); if (message instanceof TLRPC.Updates) { if (BuildVars.LOGS_ENABLED) { FileLog.d("java received " + message); @@ -1563,4 +1576,32 @@ public class ConnectionsManager extends BaseController { } } + + public static long lastPremiumFloodWaitShown = 0; + public static void onPremiumFloodWait(final int currentAccount, final int requestToken, boolean isUpload) { + AndroidUtilities.runOnUIThread(() -> { + if (UserConfig.selectedAccount != currentAccount) { + return; + } + + boolean updated = false; + if (isUpload) { + FileUploadOperation operation = FileLoader.getInstance(currentAccount).findUploadOperationByRequestToken(requestToken); + if (operation != null) { + updated = !operation.caughtPremiumFloodWait; + operation.caughtPremiumFloodWait = true; + } + } else { + FileLoadOperation operation = FileLoader.getInstance(currentAccount).findLoadOperationByRequestToken(requestToken); + if (operation != null) { + updated = !operation.caughtPremiumFloodWait; + operation.caughtPremiumFloodWait = true; + } + } + + if (updated) { + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.premiumFloodWaitReceived); + } + }); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java index f446d588e..c792f6d81 100644 --- a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java @@ -77,158 +77,7 @@ public class TLRPC { public static final int MESSAGE_FLAG_HAS_BOT_ID = 0x00000800; public static final int MESSAGE_FLAG_EDITED = 0x00008000; - public static final int LAYER = 176; - - public static class TL_stats_megagroupStats extends TLObject { - public static final int constructor = 0xef7ff916; - public TL_statsDateRangeDays period; - public TL_statsAbsValueAndPrev members; - public TL_statsAbsValueAndPrev messages; - public TL_statsAbsValueAndPrev viewers; - public TL_statsAbsValueAndPrev posters; - public StatsGraph growth_graph; - public StatsGraph members_graph; - public StatsGraph new_members_by_source_graph; - public StatsGraph languages_graph; - public StatsGraph messages_graph; - public StatsGraph actions_graph; - public StatsGraph top_hours_graph; - public StatsGraph weekdays_graph; - public ArrayList top_posters = new ArrayList<>(); - public ArrayList top_admins = new ArrayList<>(); - public ArrayList top_inviters = new ArrayList<>(); - public ArrayList users = new ArrayList<>(); - - public static TL_stats_megagroupStats TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_stats_megagroupStats.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_stats_megagroupStats", constructor)); - } else { - return null; - } - } - TL_stats_megagroupStats result = new TL_stats_megagroupStats(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - period = TL_statsDateRangeDays.TLdeserialize(stream, stream.readInt32(exception), exception); - members = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - messages = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - viewers = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - posters = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - growth_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - members_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - new_members_by_source_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - languages_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - messages_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - actions_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - top_hours_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - weekdays_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), 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++) { - TL_statsGroupTopPoster object = TL_statsGroupTopPoster.TLdeserialize(stream, stream.readInt32(exception), exception); - if (object == null) { - return; - } - top_posters.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++) { - TL_statsGroupTopAdmin object = TL_statsGroupTopAdmin.TLdeserialize(stream, stream.readInt32(exception), exception); - if (object == null) { - return; - } - top_admins.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++) { - TL_statsGroupTopInviter object = TL_statsGroupTopInviter.TLdeserialize(stream, stream.readInt32(exception), exception); - if (object == null) { - return; - } - top_inviters.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++) { - User object = User.TLdeserialize(stream, stream.readInt32(exception), exception); - if (object == null) { - return; - } - users.add(object); - } - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - period.serializeToStream(stream); - members.serializeToStream(stream); - messages.serializeToStream(stream); - viewers.serializeToStream(stream); - posters.serializeToStream(stream); - growth_graph.serializeToStream(stream); - members_graph.serializeToStream(stream); - new_members_by_source_graph.serializeToStream(stream); - languages_graph.serializeToStream(stream); - messages_graph.serializeToStream(stream); - actions_graph.serializeToStream(stream); - top_hours_graph.serializeToStream(stream); - weekdays_graph.serializeToStream(stream); - stream.writeInt32(0x1cb5c415); - int count = top_posters.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - top_posters.get(a).serializeToStream(stream); - } - stream.writeInt32(0x1cb5c415); - count = top_admins.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - top_admins.get(a).serializeToStream(stream); - } - stream.writeInt32(0x1cb5c415); - count = top_inviters.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - top_inviters.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); - } - } - } + public static final int LAYER = 177; public static abstract class EmailVerifyPurpose extends TLObject { @@ -2484,34 +2333,6 @@ public class TLRPC { } } - public static class TL_dataJSON extends TLObject { - public static final int constructor = 0x7d748d04; - - public String data; - - public static TL_dataJSON TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_dataJSON.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_dataJSON", constructor)); - } else { - return null; - } - } - TL_dataJSON result = new TL_dataJSON(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - data = stream.readString(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeString(data); - } - } - public static class TL_contactStatus extends TLObject { public static final int constructor = 0x16d9703b; @@ -3679,43 +3500,6 @@ public class TLRPC { } } - public static class TL_statsGroupTopAdmin extends TLObject { - public static final int constructor = 0xd7584c87; - - public long user_id; - public int deleted; - public int kicked; - public int banned; - - public static TL_statsGroupTopAdmin TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_statsGroupTopAdmin.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_statsGroupTopAdmin", constructor)); - } else { - return null; - } - } - TL_statsGroupTopAdmin result = new TL_statsGroupTopAdmin(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - user_id = stream.readInt64(exception); - deleted = stream.readInt32(exception); - kicked = stream.readInt32(exception); - banned = stream.readInt32(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt64(user_id); - stream.writeInt32(deleted); - stream.writeInt32(kicked); - stream.writeInt32(banned); - } - } - public static class TL_payments_paymentForm extends TLObject { public static final int constructor = 0xa0058751; @@ -4546,37 +4330,6 @@ public class TLRPC { } } - public static class TL_statsAbsValueAndPrev extends TLObject { - public static final int constructor = 0xcb43acde; - - public double current; - public double previous; - - public static TL_statsAbsValueAndPrev TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_statsAbsValueAndPrev.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_statsAbsValueAndPrev", constructor)); - } else { - return null; - } - } - TL_statsAbsValueAndPrev result = new TL_statsAbsValueAndPrev(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - current = stream.readDouble(exception); - previous = stream.readDouble(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeDouble(current); - stream.writeDouble(previous); - } - } - public static abstract class PollResults extends TLObject { public int flags; @@ -5423,156 +5176,6 @@ public class TLRPC { } } - public static abstract class StatsGraph extends TLObject { - - public static StatsGraph TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - StatsGraph result = null; - switch (constructor) { - case 0x8ea464b6: - result = new TL_statsGraph(); - break; - case 0x4a27eb2d: - result = new TL_statsGraphAsync(); - break; - case 0xbedc9822: - result = new TL_statsGraphError(); - break; - } - if (result == null && exception) { - throw new RuntimeException(String.format("can't parse magic %x in StatsGraph", constructor)); - } - if (result != null) { - result.readParams(stream, exception); - } - return result; - } - } - - public static class TL_statsGraph extends StatsGraph { - public static final int constructor = 0x8ea464b6; - - public int flags; - public TL_dataJSON json; - public String zoom_token; - - public void readParams(AbstractSerializedData stream, boolean exception) { - flags = stream.readInt32(exception); - json = TL_dataJSON.TLdeserialize(stream, stream.readInt32(exception), exception); - if ((flags & 1) != 0) { - zoom_token = stream.readString(exception); - } - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt32(flags); - json.serializeToStream(stream); - if ((flags & 1) != 0) { - stream.writeString(zoom_token); - } - } - } - - public static class TL_statsGraphAsync extends StatsGraph { - public static final int constructor = 0x4a27eb2d; - - public String token; - - public void readParams(AbstractSerializedData stream, boolean exception) { - token = stream.readString(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeString(token); - } - } - - public static class TL_statsGraphError extends StatsGraph { - public static final int constructor = 0xbedc9822; - - public String error; - - public void readParams(AbstractSerializedData stream, boolean exception) { - error = stream.readString(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeString(error); - } - } - - public static abstract class PostInteractionCounters extends TLObject { - - public static PostInteractionCounters TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - PostInteractionCounters result = null; - switch (constructor) { - case TL_postInteractionCountersStory.constructor: - result = new TL_postInteractionCountersStory(); - break; - case TL_postInteractionCountersMessage.constructor: - result = new TL_postInteractionCountersMessage(); - break; - } - if (result == null && exception) { - throw new RuntimeException(String.format("can't parse magic %x in PostInteractionCounters", constructor)); - } - if (result != null) { - result.readParams(stream, exception); - } - return result; - } - } - - public static class TL_postInteractionCountersStory extends PostInteractionCounters { - public final static int constructor = 0x8a480e27; - - public int story_id; - public int views; - public int forwards; - public int reactions; - - public void readParams(AbstractSerializedData stream, boolean exception) { - story_id = stream.readInt32(exception); - views = stream.readInt32(exception); - forwards = stream.readInt32(exception); - reactions = stream.readInt32(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt32(story_id); - stream.writeInt32(views); - stream.writeInt32(forwards); - stream.writeInt32(reactions); - } - } - - public static class TL_postInteractionCountersMessage extends PostInteractionCounters { - public static final int constructor = 0xe7058e7f; - - public int msg_id; - public int views; - public int forwards; - public int reactions; - - public void readParams(AbstractSerializedData stream, boolean exception) { - msg_id = stream.readInt32(exception); - views = stream.readInt32(exception); - forwards = stream.readInt32(exception); - reactions = stream.readInt32(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt32(msg_id); - stream.writeInt32(views); - stream.writeInt32(forwards); - stream.writeInt32(reactions); - } - } - public static abstract class updates_Difference extends TLObject { public ArrayList new_messages = new ArrayList<>(); public ArrayList new_encrypted_messages = new ArrayList<>(); @@ -5884,36 +5487,39 @@ public class TLRPC { public static PrivacyKey TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { PrivacyKey result = null; switch (constructor) { - case 0xbc2eab30: + case TL_privacyKeyStatusTimestamp.constructor: result = new TL_privacyKeyStatusTimestamp(); break; - case 0x39491cc8: + case TL_privacyKeyPhoneP2P.constructor: result = new TL_privacyKeyPhoneP2P(); break; - case 0x500e6dfa: + case TL_privacyKeyChatInvite.constructor: result = new TL_privacyKeyChatInvite(); break; - case 0x42ffd42b: + case TL_privacyKeyAddedByPhone.constructor: result = new TL_privacyKeyAddedByPhone(); break; - case 0x697f414: + case TL_privacyKeyVoiceMessages.constructor: result = new TL_privacyKeyVoiceMessages(); break; - case 0xa486b761: + case TL_privacyKeyAbout.constructor: result = new TL_privacyKeyAbout(); break; - case 0x3d662b7b: + case TL_privacyKeyPhoneCall.constructor: result = new TL_privacyKeyPhoneCall(); break; - case 0x69ec56a3: + case TL_privacyKeyForwards.constructor: result = new TL_privacyKeyForwards(); break; - case 0xd19ae46d: + case TL_privacyKeyPhoneNumber.constructor: result = new TL_privacyKeyPhoneNumber(); break; - case 0x96151fed: + case TL_privacyKeyProfilePhoto.constructor: result = new TL_privacyKeyProfilePhoto(); break; + case TL_privacyKeyBirthday.constructor: + result = new TL_privacyKeyBirthday(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in PrivacyKey", constructor)); @@ -6015,6 +5621,15 @@ public class TLRPC { } } + public static class TL_privacyKeyBirthday extends PrivacyKey { + public static final int constructor = 0x2000a518; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static abstract class GeoPoint extends TLObject { public int flags; public double _long; @@ -7492,8 +7107,8 @@ public class TLRPC { } } - public static class TL_peerSettings extends TLObject { - public static final int constructor = 0xa518110d; + + public static class PeerSettings extends TLObject { public int flags; public boolean report_spam; @@ -7508,19 +7123,98 @@ public class TLRPC { public int geo_distance; public String request_chat_title; public int request_chat_date; + public boolean business_bot_paused; + public boolean business_bot_can_reply; + public long business_bot_id; + public String business_bot_manage_url; - public static TL_peerSettings TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_peerSettings.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_peerSettings", constructor)); - } else { - return null; - } + public static PeerSettings TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + PeerSettings result = null; + switch (constructor) { + case TL_peerSettings.constructor: + result = new TL_peerSettings(); + break; + case TL_peerSettings_layer176.constructor: + result = new TL_peerSettings_layer176(); + break; + } + if (result == null && exception) { + throw new RuntimeException(String.format("can't parse magic %x in PeerSettings", constructor)); + } + if (result != null) { + result.readParams(stream, exception); } - TL_peerSettings result = new TL_peerSettings(); - result.readParams(stream, exception); return result; } + } + + public static class TL_peerSettings extends PeerSettings { + public static final int constructor = 0xacd66c5e; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + report_spam = (flags & 1) != 0; + add_contact = (flags & 2) != 0; + block_contact = (flags & 4) != 0; + share_contact = (flags & 8) != 0; + need_contacts_exception = (flags & 16) != 0; + report_geo = (flags & 32) != 0; + autoarchived = (flags & 128) != 0; + invite_members = (flags & 256) != 0; + request_chat_broadcast = (flags & 1024) != 0; + business_bot_paused = (flags & 2048) != 0; + business_bot_can_reply = (flags & 4096) != 0; + if ((flags & 64) != 0) { + geo_distance = stream.readInt32(exception); + } + if ((flags & 512) != 0) { + request_chat_title = stream.readString(exception); + } + if ((flags & 512) != 0) { + request_chat_date = stream.readInt32(exception); + } + if ((flags & 8192) != 0) { + business_bot_id = stream.readInt64(exception); + } + if ((flags & 8192) != 0) { + business_bot_manage_url = stream.readString(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = report_spam ? (flags | 1) : (flags &~ 1); + flags = add_contact ? (flags | 2) : (flags &~ 2); + flags = block_contact ? (flags | 4) : (flags &~ 4); + flags = share_contact ? (flags | 8) : (flags &~ 8); + flags = need_contacts_exception ? (flags | 16) : (flags &~ 16); + flags = report_geo ? (flags | 32) : (flags &~ 32); + flags = autoarchived ? (flags | 128) : (flags &~ 128); + flags = invite_members ? (flags | 256) : (flags &~ 256); + flags = request_chat_broadcast ? (flags | 1024) : (flags &~ 1024); + flags = business_bot_paused ? (flags | 2048) : (flags &~ 2048); + flags = business_bot_can_reply ? (flags | 4096) : (flags &~ 4096); + stream.writeInt32(flags); + if ((flags & 64) != 0) { + stream.writeInt32(geo_distance); + } + if ((flags & 512) != 0) { + stream.writeString(request_chat_title); + } + if ((flags & 512) != 0) { + stream.writeInt32(request_chat_date); + } + if ((flags & 8192) != 0) { + stream.writeInt64(business_bot_id); + } + if ((flags & 8192) != 0) { + stream.writeString(business_bot_manage_url); + } + } + } + + public static class TL_peerSettings_layer176 extends TL_peerSettings { + public static final int constructor = 0xa518110d; public void readParams(AbstractSerializedData stream, boolean exception) { flags = stream.readInt32(exception); @@ -7599,37 +7293,6 @@ public class TLRPC { } } - public static class TL_statsGroupTopInviter extends TLObject { - public static final int constructor = 0x535f779d; - - public long user_id; - public int invitations; - - public static TL_statsGroupTopInviter TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_statsGroupTopInviter.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_statsGroupTopInviter", constructor)); - } else { - return null; - } - } - TL_statsGroupTopInviter result = new TL_statsGroupTopInviter(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - user_id = stream.readInt64(exception); - invitations = stream.readInt32(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt64(user_id); - stream.writeInt32(invitations); - } - } - public static abstract class InputDialogPeer extends TLObject { public static InputDialogPeer TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -8112,6 +7775,9 @@ public class TLRPC { case 0xf7e8d89b: result = new TL_privacyValueAllowCloseFriends(); break; + case 0xece9814b: + result = new TL_privacyValueAllowPremium(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in PrivacyRule", constructor)); @@ -8288,6 +7954,15 @@ public class TLRPC { } } + public static class TL_privacyValueAllowPremium extends PrivacyRule { + public static final int constructor = 0xece9814b; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_pageTableCell extends TLObject { public static final int constructor = 0x34566b6a; @@ -12625,36 +12300,39 @@ public class TLRPC { public static InputPrivacyKey TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { InputPrivacyKey result = null; switch (constructor) { - case 0x4f96cb18: + case TL_inputPrivacyKeyStatusTimestamp.constructor: result = new TL_inputPrivacyKeyStatusTimestamp(); break; - case 0xbdfb0426: + case TL_inputPrivacyKeyChatInvite.constructor: result = new TL_inputPrivacyKeyChatInvite(); break; - case 0xfabadc5f: + case TL_inputPrivacyKeyPhoneCall.constructor: result = new TL_inputPrivacyKeyPhoneCall(); break; - case 0xa4dd4c08: + case TL_inputPrivacyKeyForwards.constructor: result = new TL_inputPrivacyKeyForwards(); break; - case 0x5719bacc: + case TL_inputPrivacyKeyProfilePhoto.constructor: result = new TL_inputPrivacyKeyProfilePhoto(); break; - case 0x352dafa: + case TL_inputPrivacyKeyPhoneNumber.constructor: result = new TL_inputPrivacyKeyPhoneNumber(); break; - case 0xd1219bdd: + case TL_inputPrivacyKeyAddedByPhone.constructor: result = new TL_inputPrivacyKeyAddedByPhone(); break; - case 0xaee69d68: + case TL_inputPrivacyKeyVoiceMessages.constructor: result = new TL_inputPrivacyKeyVoiceMessages(); break; - case 0xdb9e70d2: + case TL_inputPrivacyKeyPhoneP2P.constructor: result = new TL_inputPrivacyKeyPhoneP2P(); break; - case 0x3823cc40: + case TL_inputPrivacyKeyAbout.constructor: result = new TL_inputPrivacyKeyAbout(); break; + case TL_inputPrivacyKeyBirthday.constructor: + result = new TL_inputPrivacyKeyBirthday(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in InputPrivacyKey", constructor)); @@ -12738,6 +12416,15 @@ public class TLRPC { } } + public static class TL_inputPrivacyKeyBirthday extends InputPrivacyKey { + public static final int constructor = 0xd65a11cc; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_inputPrivacyKeyProfilePhoto extends InputPrivacyKey { public static final int constructor = 0x5719bacc; @@ -13099,24 +12786,29 @@ public class TLRPC { public boolean translations_disabled; public boolean stories_pinned_available; public boolean view_forum_as_messages; + public boolean restricted_sponsored; public ChatReactions available_reactions; public TL_stories.PeerStories stories; public WallPaper wallpaper; public int boosts_applied; public int boosts_unrestrict; public StickerSet emojiset; + public boolean can_view_revenue; public long inviterId; //custom public int invitesCount; //custom public static ChatFull TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { ChatFull result = null; switch (constructor) { - case 0xc9d31138: + case TL_chatFull.constructor: result = new TL_chatFull(); break; case TL_channelFull.constructor: result = new TL_channelFull(); break; + case TL_channelFull_layer176.constructor: + result = new TL_channelFull_layer176(); + break; case TL_channelFull_layer167.constructor: result = new TL_channelFull_layer167(); break; @@ -15573,6 +15265,307 @@ public class TLRPC { public static class TL_channelFull extends ChatFull { public static final int constructor = 0x44c054a7; + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + can_view_participants = (flags & 8) != 0; + can_set_username = (flags & 64) != 0; + can_set_stickers = (flags & 128) != 0; + hidden_prehistory = (flags & 1024) != 0; + can_set_location = (flags & 65536) != 0; + has_scheduled = (flags & 524288) != 0; + can_view_stats = (flags & 1048576) != 0; + blocked = (flags & 4194304) != 0; + flags2 = stream.readInt32(exception); + can_delete_channel = (flags2 & 1) != 0; + antispam = (flags2 & 2) != 0; + participants_hidden = (flags2 & 4) != 0; + translations_disabled = (flags2 & 8) != 0; + stories_pinned_available = (flags2 & 32) != 0; + view_forum_as_messages = (flags2 & 64) != 0; + restricted_sponsored = (flags2 & 2048) != 0; + can_view_revenue = (flags2 & 4096) != 0; + id = stream.readInt64(exception); + about = stream.readString(exception); + if ((flags & 1) != 0) { + participants_count = stream.readInt32(exception); + } + if ((flags & 2) != 0) { + admins_count = stream.readInt32(exception); + } + if ((flags & 4) != 0) { + kicked_count = stream.readInt32(exception); + } + if ((flags & 4) != 0) { + banned_count = stream.readInt32(exception); + } + if ((flags & 8192) != 0) { + online_count = stream.readInt32(exception); + } + read_inbox_max_id = stream.readInt32(exception); + read_outbox_max_id = stream.readInt32(exception); + unread_count = stream.readInt32(exception); + chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 8388608) != 0) { + exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), 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++) { + BotInfo object = BotInfo.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + bot_info.add(object); + } + if ((flags & 16) != 0) { + migrated_from_chat_id = stream.readInt64(exception); + } + if ((flags & 16) != 0) { + migrated_from_max_id = stream.readInt32(exception); + } + if ((flags & 32) != 0) { + pinned_msg_id = stream.readInt32(exception); + } + if ((flags & 256) != 0) { + stickerset = StickerSet.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 512) != 0) { + available_min_id = stream.readInt32(exception); + } + if ((flags & 2048) != 0) { + folder_id = stream.readInt32(exception); + } + if ((flags & 16384) != 0) { + linked_chat_id = stream.readInt64(exception); + } + if ((flags & 32768) != 0) { + location = ChannelLocation.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 131072) != 0) { + slowmode_seconds = stream.readInt32(exception); + } + if ((flags & 262144) != 0) { + slowmode_next_send_date = stream.readInt32(exception); + } + if ((flags & 4096) != 0) { + stats_dc = stream.readInt32(exception); + } + pts = stream.readInt32(exception); + if ((flags & 2097152) != 0) { + call = TL_inputGroupCall.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 16777216) != 0) { + ttl_period = stream.readInt32(exception); + } + if ((flags & 33554432) != 0) { + 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++) { + pending_suggestions.add(stream.readString(exception)); + } + } + if ((flags & 67108864) != 0) { + groupcall_default_join_as = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 134217728) != 0) { + theme_emoticon = stream.readString(exception); + } + if ((flags & 268435456) != 0) { + requests_pending = stream.readInt32(exception); + } + if ((flags & 268435456) != 0) { + 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++) { + recent_requesters.add(stream.readInt64(exception)); + } + } + if ((flags & 536870912) != 0) { + default_send_as = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 1073741824) != 0) { + available_reactions = ChatReactions.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 16) != 0) { + stories = TL_stories.PeerStories.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 128) != 0) { + wallpaper = WallPaper.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 256) != 0) { + boosts_applied = stream.readInt32(exception); + } + if ((flags2 & 512) != 0) { + boosts_unrestrict = stream.readInt32(exception); + } + if ((flags2 & 1024) != 0) { + emojiset = StickerSet.TLdeserialize(stream, stream.readInt32(exception), exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = can_view_participants ? (flags | 8) : (flags &~ 8); + flags = can_set_username ? (flags | 64) : (flags &~ 64); + flags = can_set_stickers ? (flags | 128) : (flags &~ 128); + flags = hidden_prehistory ? (flags | 1024) : (flags &~ 1024); + flags = can_set_location ? (flags | 65536) : (flags &~ 65536); + flags = has_scheduled ? (flags | 524288) : (flags &~ 524288); + flags = can_view_stats ? (flags | 1048576) : (flags &~ 1048576); + flags = blocked ? (flags | 4194304) : (flags &~ 4194304); + stream.writeInt32(flags); + flags2 = can_delete_channel ? (flags2 | 1) : (flags2 &~ 1); + flags2 = antispam ? (flags2 | 2) : (flags2 &~ 2); + flags2 = participants_hidden ? (flags2 | 4) : (flags2 &~ 4); + flags2 = translations_disabled ? (flags2 | 8) : (flags2 &~ 8); + flags2 = stories_pinned_available ? (flags2 | 32) : (flags2 &~ 32); + flags2 = view_forum_as_messages ? (flags2 | 64) : (flags2 &~ 64); + flags2 = restricted_sponsored ? (flags2 | 2048) : (flags2 &~ 2048); + flags2 = can_view_revenue ? (flags2 | 4096) : (flags2 &~ 4096); + stream.writeInt32(flags2); + stream.writeInt64(id); + stream.writeString(about); + if ((flags & 1) != 0) { + stream.writeInt32(participants_count); + } + if ((flags & 2) != 0) { + stream.writeInt32(admins_count); + } + if ((flags & 4) != 0) { + stream.writeInt32(kicked_count); + } + if ((flags & 4) != 0) { + stream.writeInt32(banned_count); + } + if ((flags & 8192) != 0) { + stream.writeInt32(online_count); + } + stream.writeInt32(read_inbox_max_id); + stream.writeInt32(read_outbox_max_id); + stream.writeInt32(unread_count); + chat_photo.serializeToStream(stream); + notify_settings.serializeToStream(stream); + if ((flags & 8388608) != 0) { + exported_invite.serializeToStream(stream); + } + stream.writeInt32(0x1cb5c415); + int count = bot_info.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + bot_info.get(a).serializeToStream(stream); + } + if ((flags & 16) != 0) { + stream.writeInt64(migrated_from_chat_id); + } + if ((flags & 16) != 0) { + stream.writeInt32(migrated_from_max_id); + } + if ((flags & 32) != 0) { + stream.writeInt32(pinned_msg_id); + } + if ((flags & 256) != 0) { + stickerset.serializeToStream(stream); + } + if ((flags & 512) != 0) { + stream.writeInt32(available_min_id); + } + if ((flags & 2048) != 0) { + stream.writeInt32(folder_id); + } + if ((flags & 16384) != 0) { + stream.writeInt64(linked_chat_id); + } + if ((flags & 32768) != 0) { + location.serializeToStream(stream); + } + if ((flags & 131072) != 0) { + stream.writeInt32(slowmode_seconds); + } + if ((flags & 262144) != 0) { + stream.writeInt32(slowmode_next_send_date); + } + if ((flags & 4096) != 0) { + stream.writeInt32(stats_dc); + } + stream.writeInt32(pts); + if ((flags & 2097152) != 0) { + call.serializeToStream(stream); + } + if ((flags & 16777216) != 0) { + stream.writeInt32(ttl_period); + } + if ((flags & 33554432) != 0) { + stream.writeInt32(0x1cb5c415); + count = pending_suggestions.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + stream.writeString(pending_suggestions.get(a)); + } + } + if ((flags & 67108864) != 0) { + groupcall_default_join_as.serializeToStream(stream); + } + if ((flags & 134217728) != 0) { + stream.writeString(theme_emoticon); + } + if ((flags & 268435456) != 0) { + stream.writeInt32(requests_pending); + } + if ((flags & 268435456) != 0) { + stream.writeInt32(0x1cb5c415); + count = recent_requesters.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + stream.writeInt64(recent_requesters.get(a)); + } + } + if ((flags & 536870912) != 0) { + default_send_as.serializeToStream(stream); + } + if ((flags & 1073741824) != 0) { + available_reactions.serializeToStream(stream); + } + if ((flags2 & 16) != 0) { + stories.serializeToStream(stream); + } + if ((flags2 & 128) != 0) { + wallpaper.serializeToStream(stream); + } + if ((flags2 & 256) != 0) { + stream.writeInt32(boosts_applied); + } + if ((flags2 & 512) != 0) { + stream.writeInt32(boosts_unrestrict); + } + if ((flags2 & 1024) != 0) { + emojiset.serializeToStream(stream); + } + } + } + + + public static class TL_channelFull_layer176 extends TL_channelFull { + public static final int constructor = 0x680b773c; + public void readParams(AbstractSerializedData stream, boolean exception) { flags = stream.readInt32(exception); can_view_participants = (flags & 8) != 0; @@ -19711,37 +19704,6 @@ public class TLRPC { } } - public static class TL_stats_messageStats extends TLObject { - public final static int constructor = 0x7fe91c14; - - public StatsGraph views_graph; - public StatsGraph reactions_by_emotion_graph; - - public static TL_stats_messageStats TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_stats_messageStats.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_stats_messageStats", constructor)); - } else { - return null; - } - } - TL_stats_messageStats result = new TL_stats_messageStats(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - views_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - reactions_by_emotion_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - views_graph.serializeToStream(stream); - reactions_by_emotion_graph.serializeToStream(stream); - } - } - public static abstract class BaseTheme extends TLObject { public static BaseTheme TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -24252,6 +24214,7 @@ public class TLRPC { public byte[] g_a_hash; public byte[] g_b; public int receive_date; + public TL_dataJSON custom_parameters; public static PhoneCall TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { PhoneCall result = null; @@ -24259,9 +24222,12 @@ public class TLRPC { case 0x14b0ed0c: result = new TL_phoneCallRequested(); break; - case 0x967f7c67: + case 0x30535af5: result = new TL_phoneCall(); break; + case 0x967f7c67: + result = new TL_phoneCall_layer176(); + break; case 0x5366c915: result = new TL_phoneCallEmpty(); break; @@ -24316,6 +24282,69 @@ public class TLRPC { } public static class TL_phoneCall extends PhoneCall { + public static final int constructor = 0x30535af5; + + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + p2p_allowed = (flags & 32) != 0; + video = (flags & 64) != 0; + id = stream.readInt64(exception); + access_hash = stream.readInt64(exception); + date = stream.readInt32(exception); + admin_id = stream.readInt64(exception); + participant_id = stream.readInt64(exception); + g_a_or_b = stream.readByteArray(exception); + key_fingerprint = stream.readInt64(exception); + protocol = PhoneCallProtocol.TLdeserialize(stream, stream.readInt32(exception), 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++) { + PhoneConnection object = PhoneConnection.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + connections.add(object); + } + start_date = stream.readInt32(exception); + if ((flags & 128) != 0) { + custom_parameters = TL_dataJSON.TLdeserialize(stream, stream.readInt32(exception), exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = p2p_allowed ? (flags | 32) : (flags &~ 32); + flags = video ? (flags | 64) : (flags &~ 64); + stream.writeInt32(flags); + stream.writeInt64(id); + stream.writeInt64(access_hash); + stream.writeInt32(date); + stream.writeInt64(admin_id); + stream.writeInt64(participant_id); + stream.writeByteArray(g_a_or_b); + stream.writeInt64(key_fingerprint); + protocol.serializeToStream(stream); + stream.writeInt32(0x1cb5c415); + int count = connections.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + connections.get(a).serializeToStream(stream); + } + stream.writeInt32(start_date); + if ((flags & 128) != 0) { + custom_parameters.serializeToStream(stream); + } + } + } + + public static class TL_phoneCall_layer176 extends TL_phoneCall { public static final int constructor = 0x967f7c67; @@ -24571,6 +24600,7 @@ public class TLRPC { public boolean bot_chat_history; public boolean bot_nochats; public boolean bot_can_edit; + public boolean bot_business; public boolean verified; public boolean restricted; public boolean min; @@ -24779,6 +24809,7 @@ public class TLRPC { stories_hidden = (flags2 & 8) != 0; stories_unavailable = (flags2 & 16) != 0; contact_require_premium = (flags2 & 1024) != 0; + bot_business = (flags2 & 2048) != 0; id = stream.readInt64(exception); if ((flags & 1) != 0) { access_hash = stream.readInt64(exception); @@ -24891,6 +24922,7 @@ public class TLRPC { flags2 = stories_hidden ? (flags2 | 8) : (flags2 &~ 8); flags2 = stories_unavailable ? (flags2 | 16) : (flags2 &~ 16); flags2 = contact_require_premium ? (flags2 | 1024) : (flags2 &~ 1024); + flags2 = bot_business ? (flags2 | 2048) : (flags2 &~ 2048); stream.writeInt32(flags2); stream.writeInt64(id); if ((flags & 1) != 0) { @@ -26611,71 +26643,6 @@ public class TLRPC { } } - public static class TL_statsGroupTopPoster extends TLObject { - public static final int constructor = 0x9d04af9b; - - public long user_id; - public int messages; - public int avg_chars; - - public static TL_statsGroupTopPoster TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_statsGroupTopPoster.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_statsGroupTopPoster", constructor)); - } else { - return null; - } - } - TL_statsGroupTopPoster result = new TL_statsGroupTopPoster(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - user_id = stream.readInt64(exception); - messages = stream.readInt32(exception); - avg_chars = stream.readInt32(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt64(user_id); - stream.writeInt32(messages); - stream.writeInt32(avg_chars); - } - } - - public static class TL_statsDateRangeDays extends TLObject { - public static final int constructor = 0xb637edaf; - - public int min_date; - public int max_date; - - public static TL_statsDateRangeDays TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_statsDateRangeDays.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_statsDateRangeDays", constructor)); - } else { - return null; - } - } - TL_statsDateRangeDays result = new TL_statsDateRangeDays(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - min_date = stream.readInt32(exception); - max_date = stream.readInt32(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt32(min_date); - stream.writeInt32(max_date); - } - } - public static class TL_payments_bankCardData extends TLObject { public static final int constructor = 0x3e24e573; @@ -30787,116 +30754,6 @@ public class TLRPC { } } - public static class TL_stats_broadcastStats extends TLObject { - public static int constructor = 0x396ca5fc; - - public TL_statsDateRangeDays period; - public TL_statsAbsValueAndPrev followers; - public TL_statsAbsValueAndPrev views_per_post; - public TL_statsAbsValueAndPrev shares_per_post; - public TL_statsAbsValueAndPrev reactions_per_post; - public TL_statsAbsValueAndPrev views_per_story; - public TL_statsAbsValueAndPrev shares_per_story; - public TL_statsAbsValueAndPrev reactions_per_story; - public TL_statsPercentValue enabled_notifications; - public StatsGraph growth_graph; - public StatsGraph followers_graph; - public StatsGraph mute_graph; - public StatsGraph top_hours_graph; - public StatsGraph interactions_graph; - public StatsGraph iv_interactions_graph; - public StatsGraph views_by_source_graph; - public StatsGraph new_followers_by_source_graph; - public StatsGraph languages_graph; - public StatsGraph reactions_by_emotion_graph; - public StatsGraph story_interactions_graph; - public StatsGraph story_reactions_by_emotion_graph; - public ArrayList recent_posts_interactions = new ArrayList<>(); - - public static TL_stats_broadcastStats TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_stats_broadcastStats.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_stats_broadcastStats", constructor)); - } else { - return null; - } - } - TL_stats_broadcastStats result = new TL_stats_broadcastStats(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - period = TL_statsDateRangeDays.TLdeserialize(stream, stream.readInt32(exception), exception); - followers = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - views_per_post = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - shares_per_post = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - reactions_per_post = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - views_per_story = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - shares_per_story = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - reactions_per_story = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); - enabled_notifications = TL_statsPercentValue.TLdeserialize(stream, stream.readInt32(exception), exception); - growth_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - followers_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - mute_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - top_hours_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - interactions_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - iv_interactions_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - views_by_source_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - new_followers_by_source_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - languages_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - reactions_by_emotion_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - story_interactions_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - story_reactions_by_emotion_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), 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++) { - PostInteractionCounters object = PostInteractionCounters.TLdeserialize(stream, stream.readInt32(exception), exception); - if (object == null) { - return; - } - recent_posts_interactions.add(object); - } - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - period.serializeToStream(stream); - followers.serializeToStream(stream); - views_per_post.serializeToStream(stream); - shares_per_post.serializeToStream(stream); - reactions_per_post.serializeToStream(stream); - views_per_story.serializeToStream(stream); - shares_per_story.serializeToStream(stream); - reactions_per_story.serializeToStream(stream); - enabled_notifications.serializeToStream(stream); - growth_graph.serializeToStream(stream); - followers_graph.serializeToStream(stream); - mute_graph.serializeToStream(stream); - top_hours_graph.serializeToStream(stream); - interactions_graph.serializeToStream(stream); - iv_interactions_graph.serializeToStream(stream); - views_by_source_graph.serializeToStream(stream); - new_followers_by_source_graph.serializeToStream(stream); - languages_graph.serializeToStream(stream); - reactions_by_emotion_graph.serializeToStream(stream); - story_interactions_graph.serializeToStream(stream); - story_reactions_by_emotion_graph.serializeToStream(stream); - stream.writeInt32(0x1cb5c415); - int count = recent_posts_interactions.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - recent_posts_interactions.get(a).serializeToStream(stream); - } - } - } - public static abstract class SecureValueType extends TLObject { public static SecureValueType TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -32742,6 +32599,9 @@ public class TLRPC { case 0x2f453e49: result = new TL_inputPrivacyValueAllowCloseFriends(); break; + case 0x77cdc9f1: + result = new TL_inputPrivacyValueAllowPremium(); + break; } if (result == null && exception) { throw new RuntimeException(String.format("can't parse magic %x in InputPrivacyRule", constructor)); @@ -32925,6 +32785,14 @@ public class TLRPC { } } + public static class TL_inputPrivacyValueAllowPremium extends InputPrivacyRule { + public static final int constructor = 0x77cdc9f1; + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_maskCoords extends TLObject { public static final int constructor = 0xaed6dbb2; @@ -34425,7 +34293,7 @@ public class TLRPC { public static class TL_messages_peerSettings extends TLObject { public static final int constructor = 0x6880b94d; - public TL_peerSettings settings; + public PeerSettings settings; public ArrayList chats = new ArrayList<>(); public ArrayList users = new ArrayList<>(); @@ -34443,7 +34311,7 @@ public class TLRPC { } public void readParams(AbstractSerializedData stream, boolean exception) { - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -35087,9 +34955,6 @@ public class TLRPC { case TL_updateUser.constructor: result = new TL_updateUser(); break; - case TL_updateGroupInvitePrivacyForbidden.constructor: - result = new TL_updateGroupInvitePrivacyForbidden(); - break; case TL_updateAttachMenuBots.constructor: result = new TL_updateAttachMenuBots(); break; @@ -35600,11 +35465,11 @@ public class TLRPC { public static final int constructor = 0x6a7e7366; public Peer peer; - public TL_peerSettings settings; + public PeerSettings settings; public void readParams(AbstractSerializedData stream, boolean exception) { peer = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); } public void serializeToStream(AbstractSerializedData stream) { @@ -42034,6 +41899,7 @@ public class TLRPC { public int flags; public boolean recommended; public boolean show_peer_photo; + public boolean can_report; public byte[] random_id; public Peer from_id; public ChatInvite chat_invite; @@ -42065,6 +41931,7 @@ public class TLRPC { flags = stream.readInt32(exception); recommended = (flags & 32) != 0; show_peer_photo = (flags & 64) != 0; + can_report = (flags & 4096) != 0; random_id = stream.readByteArray(exception); if ((flags & 8) != 0) { from_id = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); @@ -42120,6 +41987,7 @@ public class TLRPC { stream.writeInt32(constructor); flags = recommended ? (flags | 32) : (flags &~ 32); flags = show_peer_photo ? (flags | 64) : (flags &~ 64); + flags = can_report ? (flags | 4096) : (flags &~ 4096); stream.writeInt32(flags); stream.writeByteArray(random_id); if ((flags & 8) != 0) { @@ -42164,6 +42032,134 @@ public class TLRPC { } } + public static class TL_sponsoredMessageReportOption extends TLObject { + public static int constructor = 0x430d3150; + + public String text; + public byte[] option; + + public static TL_sponsoredMessageReportOption TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_sponsoredMessageReportOption.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_sponsoredMessageReportOption", constructor)); + } else { + return null; + } + } + TL_sponsoredMessageReportOption result = new TL_sponsoredMessageReportOption(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + text = stream.readString(exception); + option = stream.readByteArray(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(text); + stream.writeByteArray(option); + } + } + + public static abstract class channels_SponsoredMessageReportResult extends TLObject { + + public static channels_SponsoredMessageReportResult TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + channels_SponsoredMessageReportResult result = null; + switch (constructor) { + case 0x846f9e42: + result = new TL_channels_sponsoredMessageReportResultChooseOption(); + break; + case 0x3e3bcf2f: + result = new TL_channels_sponsoredMessageReportResultAdsHidden(); + break; + case 0xad798849: + result = new TL_channels_sponsoredMessageReportResultReported(); + break; + } + if (result == null && exception) { + throw new RuntimeException(String.format("can't parse magic %x in channels_SponsoredMessageReportResult", constructor)); + } + if (result != null) { + result.readParams(stream, exception); + } + return result; + } + } + + public static class TL_channels_sponsoredMessageReportResultChooseOption extends channels_SponsoredMessageReportResult { + public static final int constructor = 0x846f9e42; + + public String title; + public ArrayList options = new ArrayList<>(); + + public void readParams(AbstractSerializedData stream, boolean exception) { + title = stream.readString(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++) { + TL_sponsoredMessageReportOption object = TL_sponsoredMessageReportOption.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + options.add(object); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(title); + stream.writeInt32(0x1cb5c415); + int count = options.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + options.get(a).serializeToStream(stream); + } + } + } + + public static class TL_channels_sponsoredMessageReportResultAdsHidden extends channels_SponsoredMessageReportResult { + public static final int constructor = 0x3e3bcf2f; + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + + public static class TL_channels_sponsoredMessageReportResultReported extends channels_SponsoredMessageReportResult { + public static final int constructor = 0xad798849; + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + + public static class TL_channels_reportSponsoredMessage extends TLObject { + public static final int constructor = 0xaf8ff6b9; + + public InputChannel channel; + public byte[] random_id; + public byte[] option; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return channels_SponsoredMessageReportResult.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + channel.serializeToStream(stream); + stream.writeByteArray(random_id); + stream.writeByteArray(option); + } + } + public static class TL_account_authorizationForm extends TLObject { public static final int constructor = 0xad2e1cd8; @@ -46691,37 +46687,6 @@ public class TLRPC { } } - public static class TL_statsPercentValue extends TLObject { - public static final int constructor = 0xcbce2fe0; - - public double part; - public double total; - - public static TL_statsPercentValue TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_statsPercentValue.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_statsPercentValue", constructor)); - } else { - return null; - } - } - TL_statsPercentValue result = new TL_statsPercentValue(); - result.readParams(stream, exception); - return result; - } - - public void readParams(AbstractSerializedData stream, boolean exception) { - part = stream.readDouble(exception); - total = stream.readDouble(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeDouble(part); - stream.writeDouble(total); - } - } - public static class TL_autoDownloadSettings extends TLObject { public static final int constructor = 0xbaa57628; @@ -49515,9 +49480,7 @@ public class TLRPC { public boolean installed; public boolean archived; public boolean official; - public boolean animated; public boolean masks; - public boolean videos; public boolean emojis; public boolean text_color; public boolean channel_emoji_status; @@ -49533,6 +49496,7 @@ public class TLRPC { public int thumb_version; public long thumb_document_id; public boolean gifs; + public boolean creator; public static StickerSet TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { StickerSet result = null; @@ -49600,11 +49564,10 @@ public class TLRPC { archived = (flags & 2) != 0; official = (flags & 4) != 0; masks = (flags & 8) != 0; - animated = (flags & 32) != 0; - videos = (flags & 64) != 0; emojis = (flags & 128) != 0; text_color = (flags & 512) != 0; channel_emoji_status = (flags & 1024) != 0; + creator = (flags & 2048) != 0; if ((flags & 1) != 0) { installed_date = stream.readInt32(exception); } @@ -49647,11 +49610,10 @@ public class TLRPC { flags = archived ? (flags | 2) : (flags &~ 2); flags = official ? (flags | 4) : (flags &~ 4); flags = masks ? (flags | 8) : (flags &~ 8); - flags = animated ? (flags | 32) : (flags &~ 32); - flags = videos ? (flags | 64) : (flags &~ 64); flags = emojis ? (flags | 128) : (flags &~ 128); flags = text_color ? (flags | 512) : (flags &~ 512); flags = channel_emoji_status ? (flags | 1024) : (flags &~ 1024); + flags = creator ? (flags | 2048) : (flags &~ 2048); stream.writeInt32(flags); if ((flags & 1) != 0) { stream.writeInt32(installed_date); @@ -49690,8 +49652,6 @@ public class TLRPC { archived = (flags & 2) != 0; official = (flags & 4) != 0; masks = (flags & 8) != 0; - animated = (flags & 32) != 0; - videos = (flags & 64) != 0; emojis = (flags & 128) != 0; if ((flags & 1) != 0) { installed_date = stream.readInt32(exception); @@ -49735,8 +49695,6 @@ public class TLRPC { flags = archived ? (flags | 2) : (flags &~ 2); flags = official ? (flags | 4) : (flags &~ 4); flags = masks ? (flags | 8) : (flags &~ 8); - flags = animated ? (flags | 32) : (flags &~ 32); - flags = videos ? (flags | 64) : (flags &~ 64); flags = emojis ? (flags | 128) : (flags &~ 128); stream.writeInt32(flags); if ((flags & 1) != 0) { @@ -49862,7 +49820,6 @@ public class TLRPC { archived = (flags & 2) != 0; official = (flags & 4) != 0; masks = (flags & 8) != 0; - animated = (flags & 32) != 0; if ((flags & 1) != 0) { installed_date = stream.readInt32(exception); } @@ -49899,7 +49856,6 @@ public class TLRPC { flags = archived ? (flags | 2) : (flags &~ 2); flags = official ? (flags | 4) : (flags &~ 4); flags = masks ? (flags | 8) : (flags &~ 8); - flags = animated ? (flags | 32) : (flags &~ 32); stream.writeInt32(flags); if ((flags & 1) != 0) { stream.writeInt32(installed_date); @@ -49933,7 +49889,6 @@ public class TLRPC { archived = (flags & 2) != 0; official = (flags & 4) != 0; masks = (flags & 8) != 0; - animated = (flags & 32) != 0; if ((flags & 1) != 0) { installed_date = stream.readInt32(exception); } @@ -49959,7 +49914,6 @@ public class TLRPC { flags = archived ? (flags | 2) : (flags &~ 2); flags = official ? (flags | 4) : (flags &~ 4); flags = masks ? (flags | 8) : (flags &~ 8); - flags = animated ? (flags | 32) : (flags &~ 32); stream.writeInt32(flags); if ((flags & 1) != 0) { stream.writeInt32(installed_date); @@ -52261,7 +52215,7 @@ public class TLRPC { public int common_chats_count; public int folder_id; public int ttl_period; - public TL_peerSettings settings; + public PeerSettings settings; public String theme_emoticon; public long id; public String private_forward_name; @@ -52275,6 +52229,10 @@ public class TLRPC { public TL_businessLocation business_location; public TL_businessGreetingMessage business_greeting_message; public TL_businessAwayMessage business_away_message; + public TL_businessIntro business_intro; + public TL_birthday birthday; + public long personal_channel_id; + public int personal_channel_message; public static UserFull TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { UserFull result = null; @@ -52282,6 +52240,15 @@ public class TLRPC { case TL_userFull.constructor: result = new TL_userFull(); break; + case TL_userFull_layer176_3.constructor: + result = new TL_userFull_layer176_3(); + break; + case TL_userFull_layer176_2.constructor: + result = new TL_userFull_layer176_2(); + break; + case TL_userFull_layer176.constructor: + result = new TL_userFull_layer176(); + break; case TL_userFull_layer175.constructor: result = new TL_userFull_layer175(); break; @@ -52333,6 +52300,590 @@ public class TLRPC { } public static class TL_userFull extends UserFull { + public static final int constructor = 0xcc997720; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + blocked = (flags & 1) != 0; + phone_calls_available = (flags & 16) != 0; + phone_calls_private = (flags & 32) != 0; + can_pin_message = (flags & 128) != 0; + has_scheduled = (flags & 4096) != 0; + video_calls_available = (flags & 8192) != 0; + voice_messages_forbidden = (flags & 1048576) != 0; + translations_disabled = (flags & 8388608) != 0; + stories_pinned_available = (flags & 67108864) != 0; + blocked_my_stories_from = (flags & 134217728) != 0; + wallpaper_overridden = (flags & 268435456) != 0; + contact_require_premium = (flags & 536870912) != 0; + read_dates_private = (flags & 1073741824) != 0; + flags2 = stream.readInt32(exception); + id = stream.readInt64(exception); + if ((flags & 2) != 0) { + about = stream.readString(exception); + } + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 2097152) != 0) { + personal_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 4) != 0) { + profile_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 4194304) != 0) { + fallback_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 8) != 0) { + bot_info = BotInfo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 64) != 0) { + pinned_msg_id = stream.readInt32(exception); + } + common_chats_count = stream.readInt32(exception); + if ((flags & 2048) != 0) { + folder_id = stream.readInt32(exception); + } + if ((flags & 16384) != 0) { + ttl_period = stream.readInt32(exception); + } + if ((flags & 32768) != 0) { + theme_emoticon = stream.readString(exception); + } + if ((flags & 65536) != 0) { + private_forward_name = stream.readString(exception); + } + if ((flags & 131072) != 0) { + bot_group_admin_rights = TL_chatAdminRights.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 262144) != 0) { + bot_broadcast_admin_rights = TL_chatAdminRights.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 524288) != 0) { + 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++) { + TL_premiumGiftOption object = TL_premiumGiftOption.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + premium_gifts.add(object); + } + } + if ((flags & 16777216) != 0) { + wallpaper = WallPaper.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 33554432) != 0) { + stories = TL_stories.PeerStories.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 1) != 0) { + business_work_hours = TL_businessWorkHours.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 2) != 0) { + business_location = TL_businessLocation.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 4) != 0) { + business_greeting_message = TL_businessGreetingMessage.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 8) != 0) { + business_away_message = TL_businessAwayMessage.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 16) != 0) { + business_intro = TL_businessIntro.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 32) != 0) { + birthday = TL_birthday.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 64) != 0) { + personal_channel_id = stream.readInt64(exception); + personal_channel_message = stream.readInt32(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = blocked ? (flags | 1) : (flags &~ 1); + flags = phone_calls_available ? (flags | 16) : (flags &~ 16); + flags = phone_calls_private ? (flags | 32) : (flags &~ 32); + flags = can_pin_message ? (flags | 128) : (flags &~ 128); + flags = has_scheduled ? (flags | 4096) : (flags &~ 4096); + flags = video_calls_available ? (flags | 8192) : (flags &~ 8192); + flags = voice_messages_forbidden ? (flags | 1048576) : (flags &~ 1048576); + flags = translations_disabled ? (flags | 8388608) : (flags &~ 8388608); + flags = stories_pinned_available ? (flags | 67108864) : (flags &~ 67108864); + flags = blocked_my_stories_from ? (flags | 134217728) : (flags &~ 134217728); + flags = wallpaper_overridden ? (flags | 268435456) : (flags &~ 268435456); + flags = contact_require_premium ? (flags | 536870912) : (flags &~ 536870912); + flags = read_dates_private ? (flags | 1073741824) : (flags &~ 1073741824); + stream.writeInt32(flags); + stream.writeInt32(flags2); + stream.writeInt64(id); + if ((flags & 2) != 0) { + stream.writeString(about); + } + settings.serializeToStream(stream); + if ((flags & 2097152) != 0) { + personal_photo.serializeToStream(stream); + } + if ((flags & 4) != 0) { + profile_photo.serializeToStream(stream); + } + if ((flags & 4194304) != 0) { + fallback_photo.serializeToStream(stream); + } + notify_settings.serializeToStream(stream); + if ((flags & 8) != 0) { + bot_info.serializeToStream(stream); + } + if ((flags & 64) != 0) { + stream.writeInt32(pinned_msg_id); + } + stream.writeInt32(common_chats_count); + if ((flags & 2048) != 0) { + stream.writeInt32(folder_id); + } + if ((flags & 16384) != 0) { + stream.writeInt32(ttl_period); + } + if ((flags & 32768) != 0) { + stream.writeString(theme_emoticon); + } + if ((flags & 65536) != 0) { + stream.writeString(private_forward_name); + } + if ((flags & 131072) != 0) { + bot_group_admin_rights.serializeToStream(stream); + } + if ((flags & 262144) != 0) { + bot_broadcast_admin_rights.serializeToStream(stream); + } + if ((flags & 524288) != 0) { + stream.writeInt32(0x1cb5c415); + int count = premium_gifts.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + premium_gifts.get(a).serializeToStream(stream); + } + } + if ((flags & 16777216) != 0) { + wallpaper.serializeToStream(stream); + } + if ((flags & 33554432) != 0) { + stories.serializeToStream(stream); + } + if ((flags2 & 1) != 0) { + business_work_hours.serializeToStream(stream); + } + if ((flags2 & 2) != 0) { + business_location.serializeToStream(stream); + } + if ((flags2 & 4) != 0) { + business_greeting_message.serializeToStream(stream); + } + if ((flags2 & 8) != 0) { + business_away_message.serializeToStream(stream); + } + if ((flags2 & 16) != 0) { + business_intro.serializeToStream(stream); + } + if ((flags2 & 32) != 0) { + birthday.serializeToStream(stream); + } + if ((flags2 & 64) != 0) { + stream.writeInt64(personal_channel_id); + stream.writeInt32(personal_channel_message); + } + } + } + + public static class TL_userFull_layer176_3 extends TL_userFull { + public static final int constructor = 0xecdadceb; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + blocked = (flags & 1) != 0; + phone_calls_available = (flags & 16) != 0; + phone_calls_private = (flags & 32) != 0; + can_pin_message = (flags & 128) != 0; + has_scheduled = (flags & 4096) != 0; + video_calls_available = (flags & 8192) != 0; + voice_messages_forbidden = (flags & 1048576) != 0; + translations_disabled = (flags & 8388608) != 0; + stories_pinned_available = (flags & 67108864) != 0; + blocked_my_stories_from = (flags & 134217728) != 0; + wallpaper_overridden = (flags & 268435456) != 0; + contact_require_premium = (flags & 536870912) != 0; + read_dates_private = (flags & 1073741824) != 0; + flags2 = stream.readInt32(exception); + id = stream.readInt64(exception); + if ((flags & 2) != 0) { + about = stream.readString(exception); + } + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 2097152) != 0) { + personal_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 4) != 0) { + profile_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 4194304) != 0) { + fallback_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 8) != 0) { + bot_info = BotInfo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 64) != 0) { + pinned_msg_id = stream.readInt32(exception); + } + common_chats_count = stream.readInt32(exception); + if ((flags & 2048) != 0) { + folder_id = stream.readInt32(exception); + } + if ((flags & 16384) != 0) { + ttl_period = stream.readInt32(exception); + } + if ((flags & 32768) != 0) { + theme_emoticon = stream.readString(exception); + } + if ((flags & 65536) != 0) { + private_forward_name = stream.readString(exception); + } + if ((flags & 131072) != 0) { + bot_group_admin_rights = TL_chatAdminRights.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 262144) != 0) { + bot_broadcast_admin_rights = TL_chatAdminRights.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 524288) != 0) { + 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++) { + TL_premiumGiftOption object = TL_premiumGiftOption.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + premium_gifts.add(object); + } + } + if ((flags & 16777216) != 0) { + wallpaper = WallPaper.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 33554432) != 0) { + stories = TL_stories.PeerStories.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 1) != 0) { + business_work_hours = TL_businessWorkHours.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 2) != 0) { + business_location = TL_businessLocation.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 4) != 0) { + business_greeting_message = TL_businessGreetingMessage.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 8) != 0) { + business_away_message = TL_businessAwayMessage.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 16) != 0) { + business_intro = TL_businessIntro.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 32) != 0) { + birthday = TL_birthday.TLdeserialize(stream, stream.readInt32(exception), exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = blocked ? (flags | 1) : (flags &~ 1); + flags = phone_calls_available ? (flags | 16) : (flags &~ 16); + flags = phone_calls_private ? (flags | 32) : (flags &~ 32); + flags = can_pin_message ? (flags | 128) : (flags &~ 128); + flags = has_scheduled ? (flags | 4096) : (flags &~ 4096); + flags = video_calls_available ? (flags | 8192) : (flags &~ 8192); + flags = voice_messages_forbidden ? (flags | 1048576) : (flags &~ 1048576); + flags = translations_disabled ? (flags | 8388608) : (flags &~ 8388608); + flags = stories_pinned_available ? (flags | 67108864) : (flags &~ 67108864); + flags = blocked_my_stories_from ? (flags | 134217728) : (flags &~ 134217728); + flags = wallpaper_overridden ? (flags | 268435456) : (flags &~ 268435456); + flags = contact_require_premium ? (flags | 536870912) : (flags &~ 536870912); + flags = read_dates_private ? (flags | 1073741824) : (flags &~ 1073741824); + stream.writeInt32(flags); + stream.writeInt32(flags2); + stream.writeInt64(id); + if ((flags & 2) != 0) { + stream.writeString(about); + } + settings.serializeToStream(stream); + if ((flags & 2097152) != 0) { + personal_photo.serializeToStream(stream); + } + if ((flags & 4) != 0) { + profile_photo.serializeToStream(stream); + } + if ((flags & 4194304) != 0) { + fallback_photo.serializeToStream(stream); + } + notify_settings.serializeToStream(stream); + if ((flags & 8) != 0) { + bot_info.serializeToStream(stream); + } + if ((flags & 64) != 0) { + stream.writeInt32(pinned_msg_id); + } + stream.writeInt32(common_chats_count); + if ((flags & 2048) != 0) { + stream.writeInt32(folder_id); + } + if ((flags & 16384) != 0) { + stream.writeInt32(ttl_period); + } + if ((flags & 32768) != 0) { + stream.writeString(theme_emoticon); + } + if ((flags & 65536) != 0) { + stream.writeString(private_forward_name); + } + if ((flags & 131072) != 0) { + bot_group_admin_rights.serializeToStream(stream); + } + if ((flags & 262144) != 0) { + bot_broadcast_admin_rights.serializeToStream(stream); + } + if ((flags & 524288) != 0) { + stream.writeInt32(0x1cb5c415); + int count = premium_gifts.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + premium_gifts.get(a).serializeToStream(stream); + } + } + if ((flags & 16777216) != 0) { + wallpaper.serializeToStream(stream); + } + if ((flags & 33554432) != 0) { + stories.serializeToStream(stream); + } + if ((flags2 & 1) != 0) { + business_work_hours.serializeToStream(stream); + } + if ((flags2 & 2) != 0) { + business_location.serializeToStream(stream); + } + if ((flags2 & 4) != 0) { + business_greeting_message.serializeToStream(stream); + } + if ((flags2 & 8) != 0) { + business_away_message.serializeToStream(stream); + } + if ((flags2 & 16) != 0) { + business_intro.serializeToStream(stream); + } + if ((flags2 & 32) != 0) { + birthday.serializeToStream(stream); + } + } + } + + public static class TL_userFull_layer176_2 extends TL_userFull { + public static final int constructor = 0x670bbc9c; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + blocked = (flags & 1) != 0; + phone_calls_available = (flags & 16) != 0; + phone_calls_private = (flags & 32) != 0; + can_pin_message = (flags & 128) != 0; + has_scheduled = (flags & 4096) != 0; + video_calls_available = (flags & 8192) != 0; + voice_messages_forbidden = (flags & 1048576) != 0; + translations_disabled = (flags & 8388608) != 0; + stories_pinned_available = (flags & 67108864) != 0; + blocked_my_stories_from = (flags & 134217728) != 0; + wallpaper_overridden = (flags & 268435456) != 0; + contact_require_premium = (flags & 536870912) != 0; + read_dates_private = (flags & 1073741824) != 0; + flags2 = stream.readInt32(exception); + id = stream.readInt64(exception); + if ((flags & 2) != 0) { + about = stream.readString(exception); + } + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 2097152) != 0) { + personal_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 4) != 0) { + profile_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 4194304) != 0) { + fallback_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 8) != 0) { + bot_info = BotInfo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 64) != 0) { + pinned_msg_id = stream.readInt32(exception); + } + common_chats_count = stream.readInt32(exception); + if ((flags & 2048) != 0) { + folder_id = stream.readInt32(exception); + } + if ((flags & 16384) != 0) { + ttl_period = stream.readInt32(exception); + } + if ((flags & 32768) != 0) { + theme_emoticon = stream.readString(exception); + } + if ((flags & 65536) != 0) { + private_forward_name = stream.readString(exception); + } + if ((flags & 131072) != 0) { + bot_group_admin_rights = TL_chatAdminRights.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 262144) != 0) { + bot_broadcast_admin_rights = TL_chatAdminRights.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 524288) != 0) { + 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++) { + TL_premiumGiftOption object = TL_premiumGiftOption.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + premium_gifts.add(object); + } + } + if ((flags & 16777216) != 0) { + wallpaper = WallPaper.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 33554432) != 0) { + stories = TL_stories.PeerStories.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 1) != 0) { + business_work_hours = TL_businessWorkHours.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 2) != 0) { + business_location = TL_businessLocation.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 4) != 0) { + business_greeting_message = TL_businessGreetingMessage.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 8) != 0) { + business_away_message = TL_businessAwayMessage.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags2 & 16) != 0) { + business_intro = TL_businessIntro.TLdeserialize(stream, stream.readInt32(exception), exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = blocked ? (flags | 1) : (flags &~ 1); + flags = phone_calls_available ? (flags | 16) : (flags &~ 16); + flags = phone_calls_private ? (flags | 32) : (flags &~ 32); + flags = can_pin_message ? (flags | 128) : (flags &~ 128); + flags = has_scheduled ? (flags | 4096) : (flags &~ 4096); + flags = video_calls_available ? (flags | 8192) : (flags &~ 8192); + flags = voice_messages_forbidden ? (flags | 1048576) : (flags &~ 1048576); + flags = translations_disabled ? (flags | 8388608) : (flags &~ 8388608); + flags = stories_pinned_available ? (flags | 67108864) : (flags &~ 67108864); + flags = blocked_my_stories_from ? (flags | 134217728) : (flags &~ 134217728); + flags = wallpaper_overridden ? (flags | 268435456) : (flags &~ 268435456); + flags = contact_require_premium ? (flags | 536870912) : (flags &~ 536870912); + flags = read_dates_private ? (flags | 1073741824) : (flags &~ 1073741824); + stream.writeInt32(flags); + stream.writeInt32(flags2); + stream.writeInt64(id); + if ((flags & 2) != 0) { + stream.writeString(about); + } + settings.serializeToStream(stream); + if ((flags & 2097152) != 0) { + personal_photo.serializeToStream(stream); + } + if ((flags & 4) != 0) { + profile_photo.serializeToStream(stream); + } + if ((flags & 4194304) != 0) { + fallback_photo.serializeToStream(stream); + } + notify_settings.serializeToStream(stream); + if ((flags & 8) != 0) { + bot_info.serializeToStream(stream); + } + if ((flags & 64) != 0) { + stream.writeInt32(pinned_msg_id); + } + stream.writeInt32(common_chats_count); + if ((flags & 2048) != 0) { + stream.writeInt32(folder_id); + } + if ((flags & 16384) != 0) { + stream.writeInt32(ttl_period); + } + if ((flags & 32768) != 0) { + stream.writeString(theme_emoticon); + } + if ((flags & 65536) != 0) { + stream.writeString(private_forward_name); + } + if ((flags & 131072) != 0) { + bot_group_admin_rights.serializeToStream(stream); + } + if ((flags & 262144) != 0) { + bot_broadcast_admin_rights.serializeToStream(stream); + } + if ((flags & 524288) != 0) { + stream.writeInt32(0x1cb5c415); + int count = premium_gifts.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + premium_gifts.get(a).serializeToStream(stream); + } + } + if ((flags & 16777216) != 0) { + wallpaper.serializeToStream(stream); + } + if ((flags & 33554432) != 0) { + stories.serializeToStream(stream); + } + if ((flags2 & 1) != 0) { + business_work_hours.serializeToStream(stream); + } + if ((flags2 & 2) != 0) { + business_location.serializeToStream(stream); + } + if ((flags2 & 4) != 0) { + business_greeting_message.serializeToStream(stream); + } + if ((flags2 & 8) != 0) { + business_away_message.serializeToStream(stream); + } + if ((flags2 & 16) != 0) { + business_intro.serializeToStream(stream); + } + } + } + + public static class TL_userFull_layer176 extends TL_userFull { public static final int constructor = 0x22ff3e85; public void readParams(AbstractSerializedData stream, boolean exception) { @@ -52355,7 +52906,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 2097152) != 0) { personal_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -52513,7 +53064,6 @@ public class TLRPC { } } } - public static class TL_userFull_layer175 extends TL_userFull { public static final int constructor = 0xb9b12c6c; @@ -52536,7 +53086,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 2097152) != 0) { personal_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -52689,7 +53239,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 2097152) != 0) { personal_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -52837,7 +53387,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 2097152) != 0) { personal_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -52977,7 +53527,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 2097152) != 0) { personal_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -53110,7 +53660,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 2097152) != 0) { personal_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -53236,7 +53786,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 4) != 0) { profile_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -53355,7 +53905,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 4) != 0) { profile_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -53448,7 +53998,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 4) != 0) { profile_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -53530,7 +54080,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 4) != 0) { profile_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -53720,7 +54270,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 4) != 0) { profile_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -53790,7 +54340,7 @@ public class TLRPC { if ((flags & 2) != 0) { about = stream.readString(exception); } - settings = TL_peerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); + settings = PeerSettings.TLdeserialize(stream, stream.readInt32(exception), exception); if ((flags & 4) != 0) { profile_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -58510,7 +59060,7 @@ public class TLRPC { public int fwd_limit; public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return Updates.TLdeserialize(stream, constructor, exception); + return TL_messages_invitedUsers.TLdeserialize(stream, constructor, exception); } public void serializeToStream(AbstractSerializedData stream) { @@ -58551,7 +59101,7 @@ public class TLRPC { public int ttl_period; public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return Updates.TLdeserialize(stream, constructor, exception); + return TL_messages_invitedUsers.TLdeserialize(stream, constructor, exception); } public void serializeToStream(AbstractSerializedData stream) { @@ -63489,7 +64039,7 @@ public class TLRPC { public ArrayList users = new ArrayList<>(); public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return Updates.TLdeserialize(stream, constructor, exception); + return TL_messages_invitedUsers.TLdeserialize(stream, constructor, exception); } public void serializeToStream(AbstractSerializedData stream) { @@ -63565,6 +64115,7 @@ public class TLRPC { public int flags; public boolean by_location; public boolean check_limit; + public boolean for_personal; public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { return messages_Chats.TLdeserialize(stream, constructor, exception); @@ -63574,6 +64125,7 @@ public class TLRPC { stream.writeInt32(constructor); flags = by_location ? (flags | 1) : (flags &~ 1); flags = check_limit ? (flags | 2) : (flags &~ 2); + flags = for_personal ? (flags | 4) : (flags &~ 4); stream.writeInt32(flags); } } @@ -63815,8 +64367,6 @@ public class TLRPC { public int flags; public boolean masks; - public boolean animated; - public boolean videos; public boolean emojis; public InputUser user_id; public String title; @@ -63832,8 +64382,6 @@ public class TLRPC { public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); flags = masks ? (flags | 1) : (flags &~ 1); - flags = animated ? (flags | 2) : (flags &~ 2); - flags = videos ? (flags | 16) : (flags &~ 16); flags = emojis ? (flags | 32) : (flags &~ 32); stream.writeInt32(flags); user_id.serializeToStream(stream); @@ -63854,6 +64402,225 @@ public class TLRPC { } } + public static class TL_stickers_removeStickerFromSet extends TLObject { + public static int constructor = 0xf7760f51; + + public InputDocument sticker; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return messages_StickerSet.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + sticker.serializeToStream(stream); + } + } + + public static class TL_stickers_changeStickerPosition extends TLObject { + public static int constructor = 0xffb6d4ca; + + public InputDocument sticker; + public int position; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return messages_StickerSet.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + sticker.serializeToStream(stream); + stream.writeInt32(position); + } + } + + public static class TL_stickers_addStickerToSet extends TLObject { + public static int constructor = 0x8653febe; + + public InputStickerSet stickerset; + public TL_inputStickerSetItem sticker; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return messages_StickerSet.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stickerset.serializeToStream(stream); + sticker.serializeToStream(stream); + } + } + + public static class TL_stickers_setStickerSetThumb extends TLObject { + public static final int constructor = 0xa76a5392; + + public int flags; + public InputStickerSet stickerset; + public InputDocument thumb; + public long thumb_document_id; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return messages_StickerSet.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stickerset.serializeToStream(stream); + if ((flags & 1) != 0) { + thumb.serializeToStream(stream); + } + if ((flags & 2) != 0) { + stream.writeInt64(thumb_document_id); + } + } + } + + public static class TL_stickers_changeSticker extends TLObject { + public static final int constructor = 0xf5537ebc; + + public int flags; + public InputDocument sticker; + public String emoji; + public TL_maskCoords mask_coords; + public String keywords; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return messages_StickerSet.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + sticker.serializeToStream(stream); + if ((flags & 1) != 0) { + stream.writeString(emoji); + } + if ((flags & 2) != 0) { + mask_coords.serializeToStream(stream); + } + if ((flags & 4) != 0) { + stream.writeString(keywords); + } + } + } + + public static class TL_stickers_renameStickerSet extends TLObject { + public static final int constructor = 0x124b1c00; + + public InputStickerSet stickerset; + public String title; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return messages_StickerSet.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stickerset.serializeToStream(stream); + stream.writeString(title); + } + } + + public static class TL_stickers_deleteStickerSet extends TLObject { + public static final int constructor = 0x87704394; + + public InputStickerSet stickerset; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stickerset.serializeToStream(stream); + } + } + + public static class TL_stickers_replaceSticker extends TLObject { + public static final int constructor = 0x4696459a; + + public InputDocument sticker; + public TL_inputStickerSetItem new_sticker; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return messages_StickerSet.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + sticker.serializeToStream(stream); + new_sticker.serializeToStream(stream); + } + } + + public static class TL_messages_getMyStickers extends TLObject { + public static final int constructor = 0xd0b5e1fc; + + public long offset_id; + public int limit; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_messages_myStickers.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(offset_id); + stream.writeInt32(limit); + } + } + + public static class TL_messages_myStickers extends TLObject { + public static final int constructor = 0xfaff629d; + + public int count; + public ArrayList sets = new ArrayList<>(); + + public static TL_messages_myStickers TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_messages_myStickers.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_messages_myStickers", constructor)); + } else { + return null; + } + } + TL_messages_myStickers result = new TL_messages_myStickers(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean 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++) { + StickerSetCovered object = StickerSetCovered.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + sets.add(object); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(count); + stream.writeInt32(0x1cb5c415); + int count = sets.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + sets.get(a).serializeToStream(stream); + } + } + } + public static class TL_stickers_checkShortName extends TLObject { public static final int constructor = 0x284b3639; @@ -65059,269 +65826,6 @@ public class TLRPC { } } - public static class TL_stats_getBroadcastStats extends TLObject { - public static final int constructor = 0xab42441a; - - public int flags; - public boolean dark; - public InputChannel channel; - - public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return TL_stats_broadcastStats.TLdeserialize(stream, constructor, exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - flags = dark ? (flags | 1) : (flags &~ 1); - stream.writeInt32(flags); - channel.serializeToStream(stream); - } - } - - public static class TL_stats_loadAsyncGraph extends TLObject { - public static final int constructor = 0x621d5fa0; - - public int flags; - public String token; - public long x; - - public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return StatsGraph.TLdeserialize(stream, constructor, exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt32(flags); - stream.writeString(token); - if ((flags & 1) != 0) { - stream.writeInt64(x); - } - } - } - - public static class TL_stats_getMegagroupStats extends TLObject { - public static final int constructor = 0xdcdf8607; - - public int flags; - public boolean dark; - public InputChannel channel; - - public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return TL_stats_megagroupStats.TLdeserialize(stream, constructor, exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - flags = dark ? (flags | 1) : (flags &~ 1); - stream.writeInt32(flags); - channel.serializeToStream(stream); - } - } - - public static class TL_stats_getMessagePublicForwards extends TLObject { - public static final int constructor = 0x5f150144; - - public InputChannel channel; - public int msg_id; - public String offset; - public int limit; - - public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return TL_stats_publicForwards.TLdeserialize(stream, constructor, exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - channel.serializeToStream(stream); - stream.writeInt32(msg_id); - stream.writeString(offset); - stream.writeInt32(limit); - } - } - - public static class TL_stats_getMessageStats extends TLObject { - public static final int constructor = 0xb6e0a3f5; - - public int flags; - public boolean dark; - public InputChannel channel; - public int msg_id; - - public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return TL_stats_messageStats.TLdeserialize(stream, constructor, exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - flags = dark ? (flags | 1) : (flags &~ 1); - stream.writeInt32(flags); - channel.serializeToStream(stream); - stream.writeInt32(msg_id); - } - } - - public static class TL_stats_getStoryPublicForwards extends TLObject { - public static final int constructor = 0xa6437ef6; - - public InputPeer peer; - public int id; - public String offset; - public int limit; - - public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return TL_stats_publicForwards.TLdeserialize(stream, constructor, exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - peer.serializeToStream(stream); - stream.writeInt32(id); - stream.writeString(offset); - stream.writeInt32(limit); - } - } - - public static class TL_stats_publicForwards extends TLObject { - public static final int constructor = 0x93037e20; - - public int flags; - public int count; - public ArrayList forwards = new ArrayList<>(); - public String next_offset; - public ArrayList chats = new ArrayList<>(); - public ArrayList users = new ArrayList<>(); - - public static TL_stats_publicForwards TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - if (TL_stats_publicForwards.constructor != constructor) { - if (exception) { - throw new RuntimeException(String.format("can't parse magic %x in TL_stats_publicForwards", constructor)); - } else { - return null; - } - } - TL_stats_publicForwards result = new TL_stats_publicForwards(); - result.readParams(stream, exception); - return result; - } - - 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++) { - PublicForward object = PublicForward.TLdeserialize(stream, stream.readInt32(exception), exception); - if (object == null) { - return; - } - forwards.add(object); - } - if ((flags & 1) != 0) { - next_offset = stream.readString(exception); - } - 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++) { - Chat object = 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++) { - User object = User.TLdeserialize(stream, stream.readInt32(exception), exception); - if (object == null) { - return; - } - users.add(object); - } - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt32(flags); - stream.writeInt32(count); - stream.writeInt32(0x1cb5c415); - int count = forwards.size(); - stream.writeInt32(count); - for (int a = 0; a < count; a++) { - forwards.get(a).serializeToStream(stream); - } - if ((flags & 1) != 0) { - stream.writeString(next_offset); - } - 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); - } - } - } - - public static abstract class PublicForward extends TLObject { - - public static PublicForward TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - PublicForward result = null; - switch (constructor) { - case TL_publicForwardMessage.constructor: - result = new TL_publicForwardMessage(); - break; - case TL_stories.TL_publicForwardStory.constructor: - result = new TL_stories.TL_publicForwardStory(); - break; - } - if (result == null && exception) { - throw new RuntimeException(String.format("can't parse magic %x in PublicForward", constructor)); - } - if (result != null) { - result.readParams(stream, exception); - } - return result; - } - } - - public static class TL_publicForwardMessage extends PublicForward { - public static final int constructor = 0x1f2bf4a; - - public Message message; - - public void readParams(AbstractSerializedData stream, boolean exception) { - message = Message.TLdeserialize(stream, stream.readInt32(exception), exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - message.serializeToStream(stream); - } - } - //manually created public static class TL_photoPathSize extends PhotoSize { @@ -66167,6 +66671,7 @@ public class TLRPC { public String message; public MessageMedia media; public int flags; + public int flags2; public boolean mentioned; public boolean media_unread; public boolean out; @@ -66186,6 +66691,7 @@ public class TLRPC { public boolean pinned; public MessageFwdHeader fwd_from; public long via_bot_id; + public long via_business_bot_id; public MessageReplyHeader reply_to; public String post_author; public long grouped_id; @@ -66195,6 +66701,7 @@ public class TLRPC { public int quick_reply_shortcut_id; public boolean noforwards; public boolean invert_media; + public boolean offline; public int send_state = 0; //custom public int fwd_msg_id = 0; //custom public String attachPath = ""; //custom @@ -66311,9 +66818,13 @@ public class TLRPC { case 0x85d6cbe2: result = new TL_message_layer135(); break; + case 0xa4e97f37: case TL_message.constructor: result = new TL_message(); break; + case TL_message_layer176.constructor: + result = new TL_message_layer176(); + break; case TL_message_layer175.constructor: result = new TL_message_layer175(); break; @@ -67023,6 +67534,218 @@ public class TLRPC { } public static class TL_message extends Message { + public static final int constructor = 0x2357bf25; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + out = (flags & 2) != 0; + mentioned = (flags & 16) != 0; + media_unread = (flags & 32) != 0; + silent = (flags & 8192) != 0; + post = (flags & 16384) != 0; + from_scheduled = (flags & 262144) != 0; + legacy = (flags & 524288) != 0; + edit_hide = (flags & 2097152) != 0; + pinned = (flags & 16777216) != 0; + noforwards = (flags & 67108864) != 0; + invert_media = (flags & 134217728) != 0; + flags2 = stream.readInt32(exception); + offline = (flags2 & 2) != 0; + id = stream.readInt32(exception); + if ((flags & 256) != 0) { + from_id = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 536870912) != 0) { + from_boosts_applied = stream.readInt32(exception); + } + peer_id = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 268435456) != 0) { + saved_peer_id = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 4) != 0) { + fwd_from = MessageFwdHeader.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 2048) != 0) { + via_bot_id = stream.readInt64(exception); + } + if ((flags2 & 1) != 0) { + via_business_bot_id = stream.readInt64(exception); + } + if ((flags & 8) != 0) { + reply_to = MessageReplyHeader.TLdeserialize(stream, stream.readInt32(exception), exception); + } + date = stream.readInt32(exception); + message = stream.readString(exception); + if ((flags & 512) != 0) { + media = MessageMedia.TLdeserialize(stream, stream.readInt32(exception), exception); + if (media != null) { + ttl = media.ttl_seconds; + } + if (media != null && !TextUtils.isEmpty(media.captionLegacy)) { + message = media.captionLegacy; + } + } + if ((flags & 64) != 0) { + reply_markup = ReplyMarkup.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 128) != 0) { + 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++) { + MessageEntity object = MessageEntity.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + entities.add(object); + } + } + if ((flags & 1024) != 0) { + views = stream.readInt32(exception); + } + if ((flags & 1024) != 0) { + forwards = stream.readInt32(exception); + } + if ((flags & 8388608) != 0) { + replies = MessageReplies.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 32768) != 0) { + edit_date = stream.readInt32(exception); + } + if ((flags & 65536) != 0) { + post_author = stream.readString(exception); + } + if ((flags & 131072) != 0) { + grouped_id = stream.readInt64(exception); + } + if ((flags & 1048576) != 0) { + reactions = MessageReactions.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 4194304) != 0) { + 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++) { + TL_restrictionReason object = TL_restrictionReason.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + restriction_reason.add(object); + } + } + if ((flags & 33554432) != 0) { + ttl_period = stream.readInt32(exception); + } + if ((flags & 1073741824) != 0) { + quick_reply_shortcut_id = stream.readInt32(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = out ? (flags | 2) : (flags &~ 2); + flags = mentioned ? (flags | 16) : (flags &~ 16); + flags = media_unread ? (flags | 32) : (flags &~ 32); + flags = silent ? (flags | 8192) : (flags &~ 8192); + flags = post ? (flags | 16384) : (flags &~ 16384); + flags = from_scheduled ? (flags | 262144) : (flags &~ 262144); + flags = legacy ? (flags | 524288) : (flags &~ 524288); + flags = edit_hide ? (flags | 2097152) : (flags &~ 2097152); + flags = pinned ? (flags | 16777216) : (flags &~ 16777216); + flags = noforwards ? (flags | 67108864) : (flags &~ 67108864); + flags = invert_media ? (flags | 134217728) : (flags &~ 134217728); + stream.writeInt32(flags); + flags2 = offline ? (flags2 | 2) : (flags2 &~ 2); + stream.writeInt32(flags2); + stream.writeInt32(id); + if ((flags & 256) != 0) { + from_id.serializeToStream(stream); + } + if ((flags & 536870912) != 0) { + stream.writeInt32(from_boosts_applied); + } + peer_id.serializeToStream(stream); + if ((flags & 268435456) != 0) { + saved_peer_id.serializeToStream(stream); + } + if ((flags & 4) != 0) { + fwd_from.serializeToStream(stream); + } + if ((flags & 2048) != 0) { + stream.writeInt64(via_bot_id); + } + if ((flags2 & 1) != 0) { + stream.writeInt64(via_business_bot_id); + } + if ((flags & 8) != 0) { + reply_to.serializeToStream(stream); + } + stream.writeInt32(date); + stream.writeString(message); + if ((flags & 512) != 0) { + media.serializeToStream(stream); + } + if ((flags & 64) != 0) { + reply_markup.serializeToStream(stream); + } + if ((flags & 128) != 0) { + stream.writeInt32(0x1cb5c415); + int count = entities.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + entities.get(a).serializeToStream(stream); + } + } + if ((flags & 1024) != 0) { + stream.writeInt32(views); + } + if ((flags & 1024) != 0) { + stream.writeInt32(forwards); + } + if ((flags & 8388608) != 0) { + replies.serializeToStream(stream); + } + if ((flags & 32768) != 0) { + stream.writeInt32(edit_date); + } + if ((flags & 65536) != 0) { + stream.writeString(post_author); + } + if ((flags & 131072) != 0) { + stream.writeInt64(grouped_id); + } + if ((flags & 1048576) != 0) { + reactions.serializeToStream(stream); + } + if ((flags & 4194304) != 0) { + stream.writeInt32(0x1cb5c415); + int count = restriction_reason.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + restriction_reason.get(a).serializeToStream(stream); + } + } + if ((flags & 33554432) != 0) { + stream.writeInt32(ttl_period); + } + if ((flags & 1073741824) != 0) { + stream.writeInt32(quick_reply_shortcut_id); + } + writeAttachPath(stream); + } + } + + public static class TL_message_layer176 extends TL_message { public static final int constructor = 0xa66c7efc; public void readParams(AbstractSerializedData stream, boolean exception) { @@ -74196,21 +74919,6 @@ public class TLRPC { } } - public static class TL_updateGroupInvitePrivacyForbidden extends Update { - public static final int constructor = 0xccf08ad6; - - public long user_id; - - public void readParams(AbstractSerializedData stream, boolean exception) { - user_id = stream.readInt64(exception); - } - - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt64(user_id); - } - } - public static class TL_updateChannelViewForumAsMessages extends Update { public static final int constructor = 0x7b68920; @@ -77140,10 +77848,12 @@ public class TLRPC { } public static class TL_messages_sendQuickReplyMessages extends TLObject { - public static final int constructor = 0x33153ad4; + public static final int constructor = 0x6c750de1; public InputPeer peer; public int shortcut_id; + public ArrayList id = new ArrayList<>(); + public ArrayList random_id = new ArrayList<>(); @Override public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { @@ -77155,6 +77865,18 @@ public class TLRPC { stream.writeInt32(constructor); peer.serializeToStream(stream); stream.writeInt32(shortcut_id); + stream.writeInt32(0x1cb5c415); + int count = id.size(); + stream.writeInt32(count); + for (int i = 0; i < count; ++i) { + stream.writeInt32(id.get(i)); + } + stream.writeInt32(0x1cb5c415); + count = random_id.size(); + stream.writeInt32(count); + for (int i = 0; i < count; ++i) { + stream.writeInt64(random_id.get(i)); + } } } @@ -77432,6 +78154,182 @@ public class TLRPC { } } + public static class TL_inputBusinessBotRecipients extends TLObject { + public static final int constructor = 0xc4e5921e; + + public int flags; + public boolean existing_chats; + public boolean new_chats; + public boolean contacts; + public boolean non_contacts; + public boolean exclude_selected; + public ArrayList users = new ArrayList<>(); + public ArrayList exclude_users = new ArrayList<>(); + + public static TL_inputBusinessRecipients TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_inputBusinessRecipients.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_inputBusinessRecipients", constructor)); + } + return null; + } + TL_inputBusinessRecipients result = new TL_inputBusinessRecipients(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + existing_chats = (flags & 1) != 0; + new_chats = (flags & 2) != 0; + contacts = (flags & 4) != 0; + non_contacts = (flags & 8) != 0; + exclude_selected = (flags & 32) != 0; + if ((flags & 16) != 0) { + 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 i = 0; i < count; ++i) { + users.add(InputUser.TLdeserialize(stream, stream.readInt32(exception), exception)); + } + } + if ((flags & 64) != 0) { + 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 i = 0; i < count; ++i) { + exclude_users.add(InputUser.TLdeserialize(stream, stream.readInt32(exception), exception)); + } + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = existing_chats ? (flags | 1) : (flags &~ 1); + flags = new_chats ? (flags | 2) : (flags &~ 2); + flags = contacts ? (flags | 4) : (flags &~ 4); + flags = non_contacts ? (flags | 8) : (flags &~ 8); + flags = exclude_selected ? (flags | 32) : (flags &~ 32); + stream.writeInt32(flags); + if ((flags & 16) != 0) { + stream.writeInt32(0x1cb5c415); + final int count = users.size(); + stream.writeInt32(count); + for (int i = 0; i < count; ++i) { + users.get(i).serializeToStream(stream); + } + } + if ((flags & 64) != 0) { + stream.writeInt32(0x1cb5c415); + final int count = exclude_users.size(); + stream.writeInt32(count); + for (int i = 0; i < count; ++i) { + exclude_users.get(i).serializeToStream(stream); + } + } + } + } + + public static class TL_businessBotRecipients extends TLObject { + public static final int constructor = 0xb88cf373; + + public int flags; + public boolean existing_chats; + public boolean new_chats; + public boolean contacts; + public boolean non_contacts; + public boolean exclude_selected; + public ArrayList users = new ArrayList<>(); + public ArrayList exclude_users = new ArrayList<>(); + + public static TL_businessBotRecipients TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_businessBotRecipients.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_businessBotRecipients", constructor)); + } + return null; + } + TL_businessBotRecipients result = new TL_businessBotRecipients(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + existing_chats = (flags & 1) != 0; + new_chats = (flags & 2) != 0; + contacts = (flags & 4) != 0; + non_contacts = (flags & 8) != 0; + exclude_selected = (flags & 32) != 0; + if ((flags & 16) != 0) { + 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 i = 0; i < count; ++i) { + users.add(stream.readInt64(exception)); + } + } + if ((flags & 64) != 0) { + 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 i = 0; i < count; ++i) { + exclude_users.add(stream.readInt64(exception)); + } + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = existing_chats ? (flags | 1) : (flags &~ 1); + flags = new_chats ? (flags | 2) : (flags &~ 2); + flags = contacts ? (flags | 4) : (flags &~ 4); + flags = non_contacts ? (flags | 8) : (flags &~ 8); + flags = exclude_selected ? (flags | 32) : (flags &~ 32); + stream.writeInt32(flags); + if ((flags & 16) != 0) { + stream.writeInt32(0x1cb5c415); + final int count = users.size(); + stream.writeInt32(count); + for (int i = 0; i < count; ++i) { + stream.writeInt64(users.get(i)); + } + } + if ((flags & 64) != 0) { + stream.writeInt32(0x1cb5c415); + final int count = exclude_users.size(); + stream.writeInt32(count); + for (int i = 0; i < count; ++i) { + stream.writeInt64(exclude_users.get(i)); + } + } + } + } + public static class TL_inputBusinessRecipients extends TLObject { public static final int constructor = 0x6f8b32aa; @@ -77565,12 +78463,12 @@ public class TLRPC { } public static class TL_connectedBot extends TLObject { - public static int constructor = 0xe7e999e7; + public static int constructor = 0xbd068601; public int flags; public boolean can_reply; public long bot_id; - public TL_businessRecipients recipients; + public TL_businessBotRecipients recipients; public static TL_connectedBot TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { if (constructor != TL_connectedBot.constructor) { @@ -77589,7 +78487,7 @@ public class TLRPC { flags = stream.readInt32(exception); can_reply = (flags & 1) != 0; bot_id = stream.readInt64(exception); - recipients = TL_businessRecipients.TLdeserialize(stream, stream.readInt32(exception), exception); + recipients = TL_businessBotRecipients.TLdeserialize(stream, stream.readInt32(exception), exception); } @Override @@ -77665,13 +78563,13 @@ public class TLRPC { } public static class TL_account_updateConnectedBot extends TLObject { - public static int constructor = 0x9c2d527d; + public static int constructor = 0x43d8521d; public int flags; public boolean can_reply; public boolean deleted; public InputUser bot; - public TL_inputBusinessRecipients recipients; + public TL_inputBusinessBotRecipients recipients; @Override public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { @@ -77725,4 +78623,872 @@ public class TLRPC { public ArrayList objects = new ArrayList<>(); } + public static class TL_account_toggleConnectedBotPaused extends TLObject { + public static final int constructor = 0x646E1097; + + public InputPeer peer; + public boolean paused; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + peer.serializeToStream(stream); + stream.writeBool(paused); + } + } + + public static class TL_account_disablePeerConnectedBot extends TLObject { + public static final int constructor = 0x5e437ed9; + + public InputPeer peer; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + peer.serializeToStream(stream); + } + } + + public static class TL_businessIntro extends TLObject { + public static int constructor = 0x5a0a066d; + + public int flags; + public String title; + public String description; + public Document sticker; + + public static TL_businessIntro TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_businessIntro.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_businessIntro", constructor)); + } + return null; + } + TL_businessIntro result = new TL_businessIntro(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + title = stream.readString(exception); + description = stream.readString(exception); + if ((flags & 1) != 0) { + sticker = Document.TLdeserialize(stream, stream.readInt32(exception), exception); + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeString(title); + stream.writeString(description); + if ((flags & 1) != 0) { + sticker.serializeToStream(stream); + } + } + } + + public static class TL_inputBusinessIntro extends TLObject { + public static int constructor = 0x9c469cd; + + public int flags; + public String title; + public String description; + public InputDocument sticker; + + public static TL_inputBusinessIntro TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_inputBusinessIntro.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_inputBusinessIntro", constructor)); + } + return null; + } + TL_inputBusinessIntro result = new TL_inputBusinessIntro(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + title = stream.readString(exception); + description = stream.readString(exception); + if ((flags & 1) != 0) { + sticker = InputDocument.TLdeserialize(stream, stream.readInt32(exception), exception); + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeString(title); + stream.writeString(description); + if ((flags & 1) != 0) { + sticker.serializeToStream(stream); + } + } + } + + public static class TL_account_updateBusinessIntro extends TLObject { + public static final int constructor = 0xa614d034; + + public int flags; + public TL_inputBusinessIntro intro; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + if ((flags & 1) != 0) { + intro.serializeToStream(stream); + } + } + } + + public static class TL_birthday extends TLObject { + public static final int constructor = 0x6c8e1e06; + + public int flags; + public int day; + public int month; + public int year; + + public static TL_birthday TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_birthday.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_birthday", constructor)); + } + return null; + } + TL_birthday result = new TL_birthday(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + day = stream.readInt32(exception); + month = stream.readInt32(exception); + if ((flags & 1) != 0) { + year = stream.readInt32(exception); + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeInt32(day); + stream.writeInt32(month); + if ((flags & 1) != 0) { + stream.writeInt32(year); + } + } + } + + public static class TL_contactBirthday extends TLObject { + public static final int constructor = 0x1d998733; + + public long contact_id; + public TL_birthday birthday; + + public static TL_contactBirthday TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_contactBirthday.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_contactBirthday", constructor)); + } + return null; + } + TL_contactBirthday result = new TL_contactBirthday(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + contact_id = stream.readInt64(exception); + birthday = TL_birthday.TLdeserialize(stream, stream.readInt32(exception), exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(contact_id); + birthday.serializeToStream(stream); + } + } + + public static class TL_contacts_contactBirthdays extends TLObject { + public static final int constructor = 0x114ff30d; + + public ArrayList contacts = new ArrayList<>(); + public ArrayList users = new ArrayList<>(); + + public static TL_contacts_contactBirthdays TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_contacts_contactBirthdays.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_contacts_contactBirthdays", constructor)); + } + return null; + } + TL_contacts_contactBirthdays result = new TL_contacts_contactBirthdays(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean 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 i = 0; i < count; ++i) { + contacts.add(TL_contactBirthday.TLdeserialize(stream, stream.readInt32(exception), exception)); + } + 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 i = 0; i < count; ++i) { + users.add(User.TLdeserialize(stream, stream.readInt32(exception), exception)); + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(0x1cb5c415); + int count = contacts.size(); + stream.writeInt32(count); + for (int i = 0; i < count; ++i) { + contacts.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); + } + } + } + + public static class TL_account_updateBirthday extends TLObject { + public static final int constructor = 0xcc6e0c11; + + public int flags; + public TL_birthday birthday; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + if ((flags & 1) != 0) { + birthday.serializeToStream(stream); + } + } + } + + public static class TL_account_getBirthdays extends TLObject { + public static final int constructor = 0xdaeda864; + + public int flags; + public TL_birthday birthday; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_contacts_contactBirthdays.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + + public static class TL_missingInvitee extends TLObject { + public static final int constructor = 0x628c9224; + + public int flags; + public boolean premium_would_allow_invite; + public boolean premium_required_for_pm; + public long user_id; + + public static TL_missingInvitee TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_missingInvitee.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_missingInvitee", constructor)); + } + return null; + } + TL_missingInvitee result = new TL_missingInvitee(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + premium_would_allow_invite = (flags & 1) != 0; + premium_required_for_pm = (flags & 2) != 0; + user_id = stream.readInt64(exception); + } + + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = premium_would_allow_invite ? (flags | 1) : (flags &~ 1); + flags = premium_required_for_pm ? (flags | 2) : (flags &~ 2); + stream.writeInt32(flags); + stream.writeInt64(user_id); + } + } + + public static class TL_messages_invitedUsers extends TLObject { + public static final int constructor = 0x7f5defa6; + + public Updates updates; + public ArrayList missing_invitees = new ArrayList<>(); + + public static TL_messages_invitedUsers TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (constructor != TL_messages_invitedUsers.constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_messages_invitedUsers", constructor)); + } + return null; + } + TL_messages_invitedUsers result = new TL_messages_invitedUsers(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + updates = Updates.TLdeserialize(stream, stream.readInt32(exception), 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++) { + TL_missingInvitee object = TL_missingInvitee.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + missing_invitees.add(object); + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + updates.serializeToStream(stream); + stream.writeInt32(0x1cb5c415); + int count = missing_invitees.size(); + stream.writeInt32(count); + } + } + + public static class TL_account_updatePersonalChannel extends TLObject { + public static final int constructor = 0xd94305e0; + + public InputChannel channel; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + channel.serializeToStream(stream); + } + } + + public static class TL_channels_restrictSponsoredMessages extends TLObject { + public static final int constructor = 0x9ae91519; + + public InputChannel channel; + public boolean restricted; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Updates.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + channel.serializeToStream(stream); + stream.writeBool(restricted); + } + } + + public static class TL_dataJSON extends TLObject { + public static final int constructor = 0x7d748d04; + + public String data; + + public static TL_dataJSON TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_dataJSON.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_dataJSON", constructor)); + } else { + return null; + } + } + TL_dataJSON result = new TL_dataJSON(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + data = stream.readString(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(data); + } + } + + public static class TL_inputBusinessChatLink extends TLObject { + public static final int constructor = 0x11679fa7; + + public int flags; + public String message; + public ArrayList entities = new ArrayList<>(); + public String title; + + public static TL_inputBusinessChatLink TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_inputBusinessChatLink.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_inputBusinessChatLink", constructor)); + } else { + return null; + } + } + TL_inputBusinessChatLink result = new TL_inputBusinessChatLink(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + message = stream.readString(exception); + if ((flags & 1) != 0) { + 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++) { + MessageEntity object = MessageEntity.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + entities.add(object); + } + } + if ((flags & 2) != 0) { + title = stream.readString(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeString(message); + if ((flags & 1) != 0) { + stream.writeInt32(0x1cb5c415); + int count = entities.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + entities.get(a).serializeToStream(stream); + } + } + if ((flags & 2) != 0) { + stream.writeString(title); + } + } + } + + public static class TL_businessChatLink extends TLObject { + public static final int constructor = 0xb4ae666f; + + public int flags; + public String link; + public String message; + public ArrayList entities = new ArrayList<>(); + public String title; + public int views; + + public static TL_businessChatLink TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_businessChatLink.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_businessChatLink", constructor)); + } else { + return null; + } + } + TL_businessChatLink result = new TL_businessChatLink(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + link = stream.readString(exception); + message = stream.readString(exception); + if ((flags & 1) != 0) { + 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++) { + MessageEntity object = MessageEntity.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + entities.add(object); + } + } + if ((flags & 2) != 0) { + title = stream.readString(exception); + } + views = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeString(link); + stream.writeString(message); + if ((flags & 1) != 0) { + stream.writeInt32(0x1cb5c415); + int count = entities.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + entities.get(a).serializeToStream(stream); + } + } + if ((flags & 2) != 0) { + stream.writeString(title); + } + stream.writeInt32(views); + } + } + + public static class TL_account_businessChatLinks extends TLObject { + public static final int constructor = 0xec43a2d1; + + public ArrayList links = new ArrayList<>(); + public ArrayList chats = new ArrayList<>(); + public ArrayList users = new ArrayList<>(); + + public static TL_account_businessChatLinks TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_account_businessChatLinks.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_account_businessChatLinks", constructor)); + } else { + return null; + } + } + TL_account_businessChatLinks result = new TL_account_businessChatLinks(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean 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++) { + TL_businessChatLink object = TL_businessChatLink.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + links.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++) { + Chat object = 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++) { + User object = User.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + users.add(object); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(0x1cb5c415); + int count = links.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + links.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); + } + } + } + + public static class TL_account_resolvedBusinessChatLinks extends TLObject { + public static final int constructor = 0x9a23af21; + + public int flags; + public Peer peer; + public String message; + public ArrayList entities = new ArrayList<>(); + public ArrayList chats = new ArrayList<>(); + public ArrayList users = new ArrayList<>(); + + public static TL_account_resolvedBusinessChatLinks TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_account_resolvedBusinessChatLinks.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_account_businessChatLinks", constructor)); + } else { + return null; + } + } + TL_account_resolvedBusinessChatLinks result = new TL_account_resolvedBusinessChatLinks(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + peer = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); + message = stream.readString(exception); + if ((flags & 1) != 0) { + 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++) { + MessageEntity object = MessageEntity.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + entities.add(object); + } + } + 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++) { + Chat object = 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++) { + User object = User.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + users.add(object); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + peer.serializeToStream(stream); + stream.writeString(message); + if ((flags & 1) != 0) { + stream.writeInt32(0x1cb5c415); + int count = entities.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + entities.get(a).serializeToStream(stream); + } + } + stream.writeInt32(0x1cb5c415); + int 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); + } + } + } + + public static class TL_account_createBusinessChatLink extends TLObject { + public static final int constructor = 0x8851e68e; + + public TL_inputBusinessChatLink link; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_businessChatLink.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + link.serializeToStream(stream); + } + } + + public static class TL_account_editBusinessChatLink extends TLObject { + public static final int constructor = 0x8c3410af; + + public String slug; + public TL_inputBusinessChatLink link; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_businessChatLink.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(slug); + link.serializeToStream(stream); + } + } + + public static class TL_account_deleteBusinessChatLink extends TLObject { + public static final int constructor = 0x60073674; + + public String slug; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(slug); + } + } + + public static class TL_account_getBusinessChatLinks extends TLObject { + public static final int constructor = 0x6f70dde1; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_account_businessChatLinks.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + + public static class TL_account_resolveBusinessChatLink extends TLObject { + public static final int constructor = 0x5492e5ee; + + public String slug; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_account_resolvedBusinessChatLinks.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(slug); + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_fragment.java b/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_fragment.java new file mode 100644 index 000000000..8bbc3b9cf --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_fragment.java @@ -0,0 +1,126 @@ +package org.telegram.tgnet.tl; + +import org.telegram.tgnet.AbstractSerializedData; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; + +public class TL_fragment { + + public static class InputCollectible extends TLObject { + public static InputCollectible TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + InputCollectible result = null; + switch (constructor) { + case TL_inputCollectibleUsername.constructor: + result = new TL_inputCollectibleUsername(); + break; + case TL_inputCollectiblePhone.constructor: + result = new TL_inputCollectiblePhone(); + break; + } + if (result == null && exception) { + throw new RuntimeException(String.format("can't parse magic %x in InputCollectible", constructor)); + } + if (result != null) { + result.readParams(stream, exception); + } + return result; + } + } + + public static class TL_inputCollectibleUsername extends InputCollectible { + public static final int constructor = 0xe39460a9; + + public String username; + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(username); + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + username = stream.readString(exception); + } + } + + public static class TL_inputCollectiblePhone extends InputCollectible { + public static final int constructor = 0xa2e214a4; + + public String phone; + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(phone); + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + phone = stream.readString(exception); + } + } + + public static class TL_collectibleInfo extends TLObject { + public static final int constructor = 0x6ebdff91; + + public int purchase_date; + public String currency; + public long amount; + public String crypto_currency; + public long crypto_amount; + public String url; + + public static TL_collectibleInfo TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_collectibleInfo.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_collectibleInfo", constructor)); + } else { + return null; + } + } + TL_collectibleInfo result = new TL_collectibleInfo(); + result.readParams(stream, exception); + return result; + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(purchase_date); + stream.writeString(currency); + stream.writeInt64(amount); + stream.writeString(crypto_currency); + stream.writeInt64(crypto_amount); + stream.writeString(url); + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + purchase_date = stream.readInt32(exception); + currency = stream.readString(exception); + amount = stream.readInt64(exception); + crypto_currency = stream.readString(exception); + crypto_amount = stream.readInt64(exception); + url = stream.readString(exception); + } + } + + public static class TL_getCollectibleInfo extends TLObject { + public static final int constructor = 0xbe1e85ba; + + public InputCollectible collectible; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_collectibleInfo.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + collectible.serializeToStream(stream); + } + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_stats.java b/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_stats.java new file mode 100644 index 000000000..2b34ec8fa --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_stats.java @@ -0,0 +1,1207 @@ +package org.telegram.tgnet.tl; + +import org.telegram.tgnet.AbstractSerializedData; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; + +import java.util.ArrayList; + +public class TL_stats { + public static class TL_megagroupStats extends TLObject { + public static final int constructor = 0xef7ff916; + public TL_statsDateRangeDays period; + public TL_statsAbsValueAndPrev members; + public TL_statsAbsValueAndPrev messages; + public TL_statsAbsValueAndPrev viewers; + public TL_statsAbsValueAndPrev posters; + public StatsGraph growth_graph; + public StatsGraph members_graph; + public StatsGraph new_members_by_source_graph; + public StatsGraph languages_graph; + public StatsGraph messages_graph; + public StatsGraph actions_graph; + public StatsGraph top_hours_graph; + public StatsGraph weekdays_graph; + public ArrayList top_posters = new ArrayList<>(); + public ArrayList top_admins = new ArrayList<>(); + public ArrayList top_inviters = new ArrayList<>(); + public ArrayList users = new ArrayList<>(); + + public static TL_megagroupStats TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_megagroupStats.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_stats_megagroupStats", constructor)); + } else { + return null; + } + } + TL_megagroupStats result = new TL_megagroupStats(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + period = TL_statsDateRangeDays.TLdeserialize(stream, stream.readInt32(exception), exception); + members = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + messages = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + viewers = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + posters = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + growth_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + members_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + new_members_by_source_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + languages_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + messages_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + actions_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + top_hours_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + weekdays_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), 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++) { + TL_statsGroupTopPoster object = TL_statsGroupTopPoster.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + top_posters.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++) { + TL_statsGroupTopAdmin object = TL_statsGroupTopAdmin.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + top_admins.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++) { + TL_statsGroupTopInviter object = TL_statsGroupTopInviter.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + top_inviters.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); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + period.serializeToStream(stream); + members.serializeToStream(stream); + messages.serializeToStream(stream); + viewers.serializeToStream(stream); + posters.serializeToStream(stream); + growth_graph.serializeToStream(stream); + members_graph.serializeToStream(stream); + new_members_by_source_graph.serializeToStream(stream); + languages_graph.serializeToStream(stream); + messages_graph.serializeToStream(stream); + actions_graph.serializeToStream(stream); + top_hours_graph.serializeToStream(stream); + weekdays_graph.serializeToStream(stream); + stream.writeInt32(0x1cb5c415); + int count = top_posters.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + top_posters.get(a).serializeToStream(stream); + } + stream.writeInt32(0x1cb5c415); + count = top_admins.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + top_admins.get(a).serializeToStream(stream); + } + stream.writeInt32(0x1cb5c415); + count = top_inviters.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + top_inviters.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); + } + } + } + + public static abstract class StatsGraph extends TLObject { + + public float rate; // custom + + public static StatsGraph TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + StatsGraph result = null; + switch (constructor) { + case TL_statsGraph.constructor: + result = new TL_statsGraph(); + break; + case TL_statsGraphAsync.constructor: + result = new TL_statsGraphAsync(); + break; + case TL_statsGraphError.constructor: + result = new TL_statsGraphError(); + break; + } + if (result == null && exception) { + throw new RuntimeException(String.format("can't parse magic %x in StatsGraph", constructor)); + } + if (result != null) { + result.readParams(stream, exception); + } + return result; + } + } + + public static class TL_statsGraph extends StatsGraph { + public static final int constructor = 0x8ea464b6; + + public int flags; + public TLRPC.TL_dataJSON json; + public String zoom_token; + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + json = TLRPC.TL_dataJSON.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 1) != 0) { + zoom_token = stream.readString(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + json.serializeToStream(stream); + if ((flags & 1) != 0) { + stream.writeString(zoom_token); + } + } + } + + public static class TL_statsGraphAsync extends StatsGraph { + public static final int constructor = 0x4a27eb2d; + + public String token; + + public void readParams(AbstractSerializedData stream, boolean exception) { + token = stream.readString(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(token); + } + } + + public static class TL_statsGraphError extends StatsGraph { + public static final int constructor = 0xbedc9822; + + public String error; + + public void readParams(AbstractSerializedData stream, boolean exception) { + error = stream.readString(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(error); + } + } + + public static abstract class PostInteractionCounters extends TLObject { + + public static PostInteractionCounters TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + PostInteractionCounters result = null; + switch (constructor) { + case TL_postInteractionCountersStory.constructor: + result = new TL_postInteractionCountersStory(); + break; + case TL_postInteractionCountersMessage.constructor: + result = new TL_postInteractionCountersMessage(); + break; + } + if (result == null && exception) { + throw new RuntimeException(String.format("can't parse magic %x in PostInteractionCounters", constructor)); + } + if (result != null) { + result.readParams(stream, exception); + } + return result; + } + } + + public static class TL_postInteractionCountersStory extends PostInteractionCounters { + public final static int constructor = 0x8a480e27; + + public int story_id; + public int views; + public int forwards; + public int reactions; + + public void readParams(AbstractSerializedData stream, boolean exception) { + story_id = stream.readInt32(exception); + views = stream.readInt32(exception); + forwards = stream.readInt32(exception); + reactions = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(story_id); + stream.writeInt32(views); + stream.writeInt32(forwards); + stream.writeInt32(reactions); + } + } + + public static class TL_postInteractionCountersMessage extends PostInteractionCounters { + public static final int constructor = 0xe7058e7f; + + public int msg_id; + public int views; + public int forwards; + public int reactions; + + public void readParams(AbstractSerializedData stream, boolean exception) { + msg_id = stream.readInt32(exception); + views = stream.readInt32(exception); + forwards = stream.readInt32(exception); + reactions = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(msg_id); + stream.writeInt32(views); + stream.writeInt32(forwards); + stream.writeInt32(reactions); + } + } + + public static class TL_messageStats extends TLObject { + public final static int constructor = 0x7fe91c14; + + public StatsGraph views_graph; + public StatsGraph reactions_by_emotion_graph; + + public static TL_messageStats TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_messageStats.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_stats_messageStats", constructor)); + } else { + return null; + } + } + TL_messageStats result = new TL_messageStats(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + views_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + reactions_by_emotion_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + views_graph.serializeToStream(stream); + reactions_by_emotion_graph.serializeToStream(stream); + } + } + + public static class TL_statsGroupTopPoster extends TLObject { + public static final int constructor = 0x9d04af9b; + + public long user_id; + public int messages; + public int avg_chars; + + public static TL_statsGroupTopPoster TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_statsGroupTopPoster.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_statsGroupTopPoster", constructor)); + } else { + return null; + } + } + TL_statsGroupTopPoster result = new TL_statsGroupTopPoster(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + user_id = stream.readInt64(exception); + messages = stream.readInt32(exception); + avg_chars = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(user_id); + stream.writeInt32(messages); + stream.writeInt32(avg_chars); + } + } + + public static class TL_statsDateRangeDays extends TLObject { + public static final int constructor = 0xb637edaf; + + public int min_date; + public int max_date; + + public static TL_statsDateRangeDays TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_statsDateRangeDays.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_statsDateRangeDays", constructor)); + } else { + return null; + } + } + TL_statsDateRangeDays result = new TL_statsDateRangeDays(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + min_date = stream.readInt32(exception); + max_date = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(min_date); + stream.writeInt32(max_date); + } + } + + public static class TL_broadcastStats extends TLObject { + public static int constructor = 0x396ca5fc; + + public TL_statsDateRangeDays period; + public TL_statsAbsValueAndPrev followers; + public TL_statsAbsValueAndPrev views_per_post; + public TL_statsAbsValueAndPrev shares_per_post; + public TL_statsAbsValueAndPrev reactions_per_post; + public TL_statsAbsValueAndPrev views_per_story; + public TL_statsAbsValueAndPrev shares_per_story; + public TL_statsAbsValueAndPrev reactions_per_story; + public TL_statsPercentValue enabled_notifications; + public StatsGraph growth_graph; + public StatsGraph followers_graph; + public StatsGraph mute_graph; + public StatsGraph top_hours_graph; + public StatsGraph interactions_graph; + public StatsGraph iv_interactions_graph; + public StatsGraph views_by_source_graph; + public StatsGraph new_followers_by_source_graph; + public StatsGraph languages_graph; + public StatsGraph reactions_by_emotion_graph; + public StatsGraph story_interactions_graph; + public StatsGraph story_reactions_by_emotion_graph; + public ArrayList recent_posts_interactions = new ArrayList<>(); + + public static TL_broadcastStats TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_broadcastStats.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_stats_broadcastStats", constructor)); + } else { + return null; + } + } + TL_broadcastStats result = new TL_broadcastStats(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + period = TL_statsDateRangeDays.TLdeserialize(stream, stream.readInt32(exception), exception); + followers = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + views_per_post = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + shares_per_post = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + reactions_per_post = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + views_per_story = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + shares_per_story = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + reactions_per_story = TL_statsAbsValueAndPrev.TLdeserialize(stream, stream.readInt32(exception), exception); + enabled_notifications = TL_statsPercentValue.TLdeserialize(stream, stream.readInt32(exception), exception); + growth_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + followers_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + mute_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + top_hours_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + interactions_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + iv_interactions_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + views_by_source_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + new_followers_by_source_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + languages_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + reactions_by_emotion_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + story_interactions_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + story_reactions_by_emotion_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), 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++) { + PostInteractionCounters object = PostInteractionCounters.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + recent_posts_interactions.add(object); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + period.serializeToStream(stream); + followers.serializeToStream(stream); + views_per_post.serializeToStream(stream); + shares_per_post.serializeToStream(stream); + reactions_per_post.serializeToStream(stream); + views_per_story.serializeToStream(stream); + shares_per_story.serializeToStream(stream); + reactions_per_story.serializeToStream(stream); + enabled_notifications.serializeToStream(stream); + growth_graph.serializeToStream(stream); + followers_graph.serializeToStream(stream); + mute_graph.serializeToStream(stream); + top_hours_graph.serializeToStream(stream); + interactions_graph.serializeToStream(stream); + iv_interactions_graph.serializeToStream(stream); + views_by_source_graph.serializeToStream(stream); + new_followers_by_source_graph.serializeToStream(stream); + languages_graph.serializeToStream(stream); + reactions_by_emotion_graph.serializeToStream(stream); + story_interactions_graph.serializeToStream(stream); + story_reactions_by_emotion_graph.serializeToStream(stream); + stream.writeInt32(0x1cb5c415); + int count = recent_posts_interactions.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + recent_posts_interactions.get(a).serializeToStream(stream); + } + } + } + + public static class TL_getBroadcastStats extends TLObject { + public static final int constructor = 0xab42441a; + + public int flags; + public boolean dark; + public TLRPC.InputChannel channel; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_broadcastStats.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = dark ? (flags | 1) : (flags & ~1); + stream.writeInt32(flags); + channel.serializeToStream(stream); + } + } + + public static class TL_loadAsyncGraph extends TLObject { + public static final int constructor = 0x621d5fa0; + + public int flags; + public String token; + public long x; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return StatsGraph.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeString(token); + if ((flags & 1) != 0) { + stream.writeInt64(x); + } + } + } + + public static class TL_getMegagroupStats extends TLObject { + public static final int constructor = 0xdcdf8607; + + public int flags; + public boolean dark; + public TLRPC.InputChannel channel; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_megagroupStats.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = dark ? (flags | 1) : (flags & ~1); + stream.writeInt32(flags); + channel.serializeToStream(stream); + } + } + + public static class TL_getMessagePublicForwards extends TLObject { + public static final int constructor = 0x5f150144; + + public TLRPC.InputChannel channel; + public int msg_id; + public String offset; + public int limit; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_publicForwards.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + channel.serializeToStream(stream); + stream.writeInt32(msg_id); + stream.writeString(offset); + stream.writeInt32(limit); + } + } + + public static class TL_getMessageStats extends TLObject { + public static final int constructor = 0xb6e0a3f5; + + public int flags; + public boolean dark; + public TLRPC.InputChannel channel; + public int msg_id; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_messageStats.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = dark ? (flags | 1) : (flags & ~1); + stream.writeInt32(flags); + channel.serializeToStream(stream); + stream.writeInt32(msg_id); + } + } + + public static class TL_getStoryPublicForwards extends TLObject { + public static final int constructor = 0xa6437ef6; + + public TLRPC.InputPeer peer; + public int id; + public String offset; + public int limit; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_publicForwards.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + peer.serializeToStream(stream); + stream.writeInt32(id); + stream.writeString(offset); + stream.writeInt32(limit); + } + } + + public static class TL_publicForwards extends TLObject { + public static final int constructor = 0x93037e20; + + public int flags; + public int count; + public ArrayList forwards = new ArrayList<>(); + public String next_offset; + public ArrayList chats = new ArrayList<>(); + public ArrayList users = new ArrayList<>(); + + public static TL_publicForwards TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_publicForwards.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_stats_publicForwards", constructor)); + } else { + return null; + } + } + TL_publicForwards result = new TL_publicForwards(); + result.readParams(stream, exception); + return result; + } + + 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++) { + PublicForward object = PublicForward.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + forwards.add(object); + } + if ((flags & 1) != 0) { + next_offset = stream.readString(exception); + } + 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); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeInt32(count); + stream.writeInt32(0x1cb5c415); + int count = forwards.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + forwards.get(a).serializeToStream(stream); + } + if ((flags & 1) != 0) { + stream.writeString(next_offset); + } + 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); + } + } + } + + public static abstract class PublicForward extends TLObject { + + public static PublicForward TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + PublicForward result = null; + switch (constructor) { + case TL_stats.TL_publicForwardMessage.constructor: + result = new TL_stats.TL_publicForwardMessage(); + break; + case TL_stories.TL_publicForwardStory.constructor: + result = new TL_stories.TL_publicForwardStory(); + break; + } + if (result == null && exception) { + throw new RuntimeException(String.format("can't parse magic %x in PublicForward", constructor)); + } + if (result != null) { + result.readParams(stream, exception); + } + return result; + } + } + + public static class TL_publicForwardMessage extends PublicForward { + public static final int constructor = 0x1f2bf4a; + + public TLRPC.Message message; + + public void readParams(AbstractSerializedData stream, boolean exception) { + message = TLRPC.Message.TLdeserialize(stream, stream.readInt32(exception), exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + message.serializeToStream(stream); + } + } + + public static class TL_broadcastRevenueStats extends TLObject { + public static final int constructor = 0xd07b4bad; + + public StatsGraph top_hours_graph; + public StatsGraph revenue_graph; + public long current_balance; + public long available_balance; + public long overall_revenue; + public double usd_rate; + + public static TL_broadcastRevenueStats TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_broadcastRevenueStats.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_stats_broadcastRevenueStats", constructor)); + } else { + return null; + } + } + TL_broadcastRevenueStats result = new TL_broadcastRevenueStats(); + result.readParams(stream, exception); + return result; + } + + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + top_hours_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + revenue_graph = StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + current_balance = stream.readInt64(exception); + available_balance = stream.readInt64(exception); + overall_revenue = stream.readInt64(exception); + usd_rate = stream.readDouble(exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + top_hours_graph.serializeToStream(stream); + revenue_graph.serializeToStream(stream); + stream.writeInt64(current_balance); + stream.writeInt64(available_balance); + stream.writeInt64(overall_revenue); + stream.writeDouble(usd_rate); + } + } + + public static class TL_broadcastRevenueWithdrawalUrl extends TLObject { + public static final int constructor = 0xec659737; + + public String url; + + public static TL_broadcastRevenueWithdrawalUrl TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_broadcastRevenueWithdrawalUrl.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_stats_broadcastRevenueWithdrawalUrl", constructor)); + } else { + return null; + } + } + TL_broadcastRevenueWithdrawalUrl result = new TL_broadcastRevenueWithdrawalUrl(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + url = stream.readString(exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(url); + } + } + + public static class BroadcastRevenueTransaction extends TLObject { + public static BroadcastRevenueTransaction TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + BroadcastRevenueTransaction result = null; + switch (constructor) { + case TL_broadcastRevenueTransactionProceeds.constructor: + result = new TL_broadcastRevenueTransactionProceeds(); + break; + case TL_broadcastRevenueTransactionWithdrawal.constructor: + result = new TL_broadcastRevenueTransactionWithdrawal(); + break; + case TL_broadcastRevenueTransactionRefund.constructor: + result = new TL_broadcastRevenueTransactionRefund(); + break; + } + if (result == null && exception) { + throw new RuntimeException(String.format("can't parse magic %x in BroadcastRevenueTransaction", constructor)); + } + if (result != null) { + result.readParams(stream, exception); + } + return result; + } + } + + public static class TL_broadcastRevenueTransactionProceeds extends BroadcastRevenueTransaction { + public static final int constructor = 0x557e2cc4; + + public long amount; + public int from_date; + public int to_date; + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + amount = stream.readInt64(exception); + from_date = stream.readInt32(exception); + to_date = stream.readInt32(exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(amount); + stream.writeInt32(from_date); + stream.writeInt32(to_date); + } + } + + public static class TL_broadcastRevenueTransactionWithdrawal extends BroadcastRevenueTransaction { + public static final int constructor = 0x5a590978; + + public int flags; + public boolean pending; + public boolean failed; + public long amount; + public int date; + public String provider; + public int transaction_date; + public String transaction_url; + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + pending = (flags & 1) != 0; + failed = (flags & 4) != 0; + amount = stream.readInt64(exception); + date = stream.readInt32(exception); + provider = stream.readString(exception); + if ((flags & 2) != 0) { + transaction_date = stream.readInt32(exception); + transaction_url = stream.readString(exception); + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = pending ? (flags | 1) : (flags & ~1); + flags = failed ? (flags | 1) : (flags & ~1); + stream.writeInt64(amount); + stream.writeInt32(date); + stream.writeString(provider); + if ((flags & 2) != 0) { + stream.writeInt32(transaction_date); + stream.writeString(transaction_url); + } + } + } + + public static class TL_broadcastRevenueTransactionRefund extends BroadcastRevenueTransaction { + public static final int constructor = 0x42d30d2e; + + public long amount; + public int from_date; + public String provider; + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + amount = stream.readInt64(exception); + from_date = stream.readInt32(exception); + provider = stream.readString(exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(amount); + stream.writeInt32(from_date); + stream.writeString(provider); + } + } + + public static class TL_broadcastRevenueTransactions extends TLObject { + public static final int constructor = 0x87158466; + + public int count; + public ArrayList transactions = new ArrayList<>(); + + public static TL_broadcastRevenueTransactions TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_broadcastRevenueTransactions.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_stats_broadcastRevenueTransactions", constructor)); + } else { + return null; + } + } + TL_broadcastRevenueTransactions result = new TL_broadcastRevenueTransactions(); + result.readParams(stream, exception); + return result; + } + + @Override + public void readParams(AbstractSerializedData stream, boolean exception) { + this.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 i = 0; i < count; ++i) { + transactions.add(BroadcastRevenueTransaction.TLdeserialize(stream, stream.readInt32(exception), exception)); + } + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(this.count); + stream.writeInt32(0x1cb5c415); + int count = transactions.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + transactions.get(a).serializeToStream(stream); + } + } + } + + public static class TL_getBroadcastRevenueStats extends TLObject { + public static final int constructor = 0x75dfb671; + + public int flags; + public boolean dark; + public TLRPC.InputChannel channel; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_broadcastRevenueStats.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = dark ? (flags | 1) : (flags & ~1); + stream.writeInt32(flags); + channel.serializeToStream(stream); + } + } + + public static class TL_getBroadcastRevenueWithdrawalUrl extends TLObject { + public static final int constructor = 0x2a65ef73; + + public TLRPC.InputChannel channel; + public TLRPC.InputCheckPasswordSRP password; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_broadcastRevenueWithdrawalUrl.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + channel.serializeToStream(stream); + password.serializeToStream(stream); + } + } + + public static class TL_getBroadcastRevenueTransactions extends TLObject { + public static final int constructor = 0x69280f; + + public TLRPC.InputChannel channel; + public int offset; + public int limit; + + @Override + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_broadcastRevenueTransactions.TLdeserialize(stream, constructor, exception); + } + + @Override + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + channel.serializeToStream(stream); + stream.writeInt32(offset); + stream.writeInt32(limit); + } + } + + public static class TL_statsAbsValueAndPrev extends TLObject { + public static final int constructor = 0xcb43acde; + + public double current; + public double previous; + + public static TL_statsAbsValueAndPrev TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_statsAbsValueAndPrev.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_statsAbsValueAndPrev", constructor)); + } else { + return null; + } + } + TL_statsAbsValueAndPrev result = new TL_statsAbsValueAndPrev(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + current = stream.readDouble(exception); + previous = stream.readDouble(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeDouble(current); + stream.writeDouble(previous); + } + } + + public static class TL_statsGroupTopAdmin extends TLObject { + public static final int constructor = 0xd7584c87; + + public long user_id; + public int deleted; + public int kicked; + public int banned; + + public static TL_statsGroupTopAdmin TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_statsGroupTopAdmin.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_statsGroupTopAdmin", constructor)); + } else { + return null; + } + } + TL_statsGroupTopAdmin result = new TL_statsGroupTopAdmin(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + user_id = stream.readInt64(exception); + deleted = stream.readInt32(exception); + kicked = stream.readInt32(exception); + banned = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(user_id); + stream.writeInt32(deleted); + stream.writeInt32(kicked); + stream.writeInt32(banned); + } + } + + public static class TL_statsGroupTopInviter extends TLObject { + public static final int constructor = 0x535f779d; + + public long user_id; + public int invitations; + + public static TL_statsGroupTopInviter TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_statsGroupTopInviter.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_statsGroupTopInviter", constructor)); + } else { + return null; + } + } + TL_statsGroupTopInviter result = new TL_statsGroupTopInviter(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + user_id = stream.readInt64(exception); + invitations = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(user_id); + stream.writeInt32(invitations); + } + } + + public static class TL_statsPercentValue extends TLObject { + public static final int constructor = 0xcbce2fe0; + + public double part; + public double total; + + public static TL_statsPercentValue TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_statsPercentValue.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_statsPercentValue", constructor)); + } else { + return null; + } + } + TL_statsPercentValue result = new TL_statsPercentValue(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + part = stream.readDouble(exception); + total = stream.readDouble(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeDouble(part); + stream.writeDouble(total); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_stories.java b/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_stories.java index cb0a88566..823d1895f 100644 --- a/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_stories.java +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/tl/TL_stories.java @@ -4,7 +4,7 @@ import org.telegram.messenger.DialogObject; import org.telegram.tgnet.AbstractSerializedData; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; -import org.telegram.tgnet.TLRPC.TL_statsPercentValue; +import org.telegram.tgnet.tl.TL_stats.TL_statsPercentValue; import org.telegram.ui.Stories.recorder.StoryPrivacyBottomSheet; import java.util.ArrayList; @@ -1621,7 +1621,7 @@ public class TL_stories { next_level_boosts = stream.readInt32(exception); } if ((flags & 2) != 0) { - premium_audience = TL_statsPercentValue.TLdeserialize(stream, stream.readInt32(exception), exception); + premium_audience = TL_stats.TL_statsPercentValue.TLdeserialize(stream, stream.readInt32(exception), exception); } boost_url = stream.readString(exception); if ((flags & 8) != 0) { @@ -2166,7 +2166,7 @@ public class TL_stories { } } - public static class TL_publicForwardStory extends TLRPC.PublicForward { + public static class TL_publicForwardStory extends TL_stats.PublicForward { public static final int constructor = 0xedf3add0; public TLRPC.Peer peer; @@ -3050,8 +3050,8 @@ public class TL_stories { public static class TL_stats_storyStats extends TLObject { public final static int constructor = 0x50cd067c; - public TLRPC.StatsGraph views_graph; - public TLRPC.StatsGraph reactions_by_emotion_graph; + public TL_stats.StatsGraph views_graph; + public TL_stats.StatsGraph reactions_by_emotion_graph; public static TL_stats_storyStats TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { if (TL_stats_storyStats.constructor != constructor) { @@ -3067,8 +3067,8 @@ public class TL_stories { } public void readParams(AbstractSerializedData stream, boolean exception) { - views_graph = TLRPC.StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); - reactions_by_emotion_graph = TLRPC.StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + views_graph = TL_stats.StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); + reactions_by_emotion_graph = TL_stats.StatsGraph.TLdeserialize(stream, stream.readInt32(exception), exception); } public void serializeToStream(AbstractSerializedData stream) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java index fc86dea16..0f2893589 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java @@ -76,7 +76,7 @@ public class ActionBar extends FrameLayout { } private INavigationLayout.BackButtonState backButtonState = INavigationLayout.BackButtonState.BACK; - private ImageView backButtonImageView; + public ImageView backButtonImageView; private BackupImageView avatarSearchImageView; private Drawable backButtonDrawable; private SimpleTextView[] titleTextView = new SimpleTextView[2]; @@ -719,6 +719,9 @@ public class ActionBar extends FrameLayout { if (occupyStatusBar && actionModeTop != null && !SharedConfig.noStatusBar) { animators.add(ObjectAnimator.ofFloat(actionModeTop, View.ALPHA, 0.0f, 1.0f)); } + if (actionModeExtraView != null) { + animators.add(ObjectAnimator.ofFloat(actionModeExtraView, View.TRANSLATION_Y, 0)); + } if (SharedConfig.noStatusBar) { if (ColorUtils.calculateLuminance(actionModeColor) < 0.7f) { AndroidUtilities.setLightStatusBar(((Activity) getContext()).getWindow(), false); @@ -807,6 +810,9 @@ public class ActionBar extends FrameLayout { actionModeTranslationView = translationView; } actionModeExtraView = extraView; + if (actionModeExtraView != null) { + actionModeExtraView.setTranslationY(0); + } actionModeShowingView = showingView; actionModeHidingViews = hidingViews; if (occupyStatusBar && actionModeTop != null && !SharedConfig.noStatusBar) { @@ -877,6 +883,9 @@ public class ActionBar extends FrameLayout { if (occupyStatusBar && actionModeTop != null && !SharedConfig.noStatusBar) { animators.add(ObjectAnimator.ofFloat(actionModeTop, View.ALPHA, 0.0f)); } + if (actionModeExtraView != null) { + animators.add(ObjectAnimator.ofFloat(actionModeExtraView, View.TRANSLATION_Y, actionModeExtraView.getMeasuredHeight())); + } if (SharedConfig.noStatusBar) { if (actionBarColor == 0) { NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needCheckSystemBarColors); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java index 7ca6957e9..b45d2fde9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java @@ -55,7 +55,7 @@ import org.telegram.messenger.MessagesController; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.ui.Components.BackButtonMenu; -import org.telegram.ui.Components.BotWebViewSheet; +import org.telegram.ui.bots.BotWebViewSheet; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.ChatAttachAlert; import org.telegram.ui.Components.CubicBezierInterpolator; @@ -64,7 +64,6 @@ import org.telegram.ui.Components.FloatingDebug.FloatingDebugProvider; import org.telegram.ui.Components.GroupCallPip; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.LaunchActivity; -import org.telegram.ui.LogoutActivity; import org.telegram.ui.Stories.StoryViewer; import java.util.ArrayList; @@ -88,7 +87,7 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F if (!fragmentsStack.isEmpty()) { lastFragment = fragmentsStack.get(fragmentsStack.size() - 1); } - return lastFragment != null && lastFragment.storyViewer != null && lastFragment.storyViewer.attachedToParent(); + return lastFragment != null && lastFragment.getLastStoryViewer() != null && lastFragment.getLastStoryViewer().attachedToParent(); } public class LayoutContainer extends FrameLayout { @@ -113,7 +112,7 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F if (!fragmentsStack.isEmpty()) { lastFragment = fragmentsStack.get(fragmentsStack.size() - 1); } - if (storyViewerAttached() && lastFragment.storyViewer.isFullyVisible() && !lastFragment.isStoryViewer(child)) { + if (storyViewerAttached() && lastFragment != null && lastFragment.getLastStoryViewer() != null && lastFragment.getLastStoryViewer().isFullyVisible() && lastFragment.getLastStoryViewer().windowView != child) { return true; } if (child instanceof ActionBar) { @@ -295,9 +294,7 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F if (shouldBeEnabled != enabled) { ripple.setState(shouldBeEnabled ? new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled} : new int[]{}); if (shouldBeEnabled) { - try { - button.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(button); } } } else if (event.getAction() == MotionEvent.ACTION_UP) { @@ -2606,11 +2603,8 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F @Override public boolean dispatchTouchEvent(MotionEvent ev) { - if (getLastFragment() != null && getLastFragment().overlayStoryViewer != null && getLastFragment().overlayStoryViewer.attachedToParent()) { - return getLastFragment().overlayStoryViewer.windowView.dispatchTouchEvent(ev); - } - if (getLastFragment() != null && getLastFragment().storyViewer != null && getLastFragment().storyViewer.attachedToParent()) { - return getLastFragment().storyViewer.windowView.dispatchTouchEvent(ev); + if (getLastFragment() != null && getLastFragment().getLastStoryViewer() != null && getLastFragment().getLastStoryViewer().attachedToParent()) { + return getLastFragment().getLastStoryViewer().windowView.dispatchTouchEvent(ev); } return super.dispatchTouchEvent(ev); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java index 8474f5acf..92c46ceec 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java @@ -22,7 +22,6 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; -import android.util.Log; import android.view.Menu; import android.view.MotionEvent; import android.view.View; @@ -54,7 +53,6 @@ import org.telegram.messenger.SendMessagesHelper; import org.telegram.messenger.UserConfig; import org.telegram.tgnet.ConnectionsManager; import org.telegram.ui.Components.LayoutHelper; -import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.LaunchActivity; import org.telegram.ui.Stories.StoryViewer; @@ -64,7 +62,7 @@ public abstract class BaseFragment { protected boolean isFinished; protected boolean finishing; - protected Dialog visibleDialog; + public Dialog visibleDialog; protected int currentAccount = UserConfig.selectedAccount; public View fragmentView; @@ -83,8 +81,31 @@ public abstract class BaseFragment { private boolean removingFromStack; private PreviewDelegate previewDelegate; protected Theme.ResourcesProvider resourceProvider; - public StoryViewer storyViewer; - public StoryViewer overlayStoryViewer; + public ArrayList storyViewerStack; + + public StoryViewer getLastStoryViewer() { + if (storyViewerStack == null || storyViewerStack.isEmpty()) + return null; + for (int i = storyViewerStack.size() - 1; i >= 0; --i) { + if (storyViewerStack.get(i).isShown()) { + return storyViewerStack.get(i); + } + } + return null; + } + + public boolean hasStoryViewer() { + return storyViewerStack != null && !storyViewerStack.isEmpty(); + } + + public void clearStoryViewers() { + if (storyViewerStack == null || storyViewerStack.isEmpty()) + return; + for (int i = storyViewerStack.size() - 1; i >= 0; --i) { + storyViewerStack.get(i).release(); + } + storyViewerStack.clear(); + } public BaseFragment() { classGuid = ConnectionsManager.generateClassGuid(); @@ -216,14 +237,7 @@ public abstract class BaseFragment { } actionBar = null; } - if (storyViewer != null) { - storyViewer.release(); - storyViewer = null; - } - if (overlayStoryViewer != null) { - overlayStoryViewer.release(); - overlayStoryViewer = null; - } + clearStoryViewers(); parentLayout = null; } @@ -252,14 +266,7 @@ public abstract class BaseFragment { } if (parentLayout != null && parentLayout.getView().getContext() != fragmentView.getContext()) { fragmentView = null; - if (storyViewer != null) { - storyViewer.release(); - storyViewer = null; - } - if (overlayStoryViewer != null) { - overlayStoryViewer.release(); - overlayStoryViewer = null; - } + clearStoryViewers(); } } if (actionBar != null) { @@ -394,12 +401,9 @@ public abstract class BaseFragment { if (actionBar != null) { actionBar.onResume(); } - if (storyViewer != null) { - storyViewer.onResume(); - storyViewer.updatePlayingMode(); - } - if (overlayStoryViewer != null) { - overlayStoryViewer.updatePlayingMode(); + if (getLastStoryViewer() != null) { + getLastStoryViewer().onResume(); + getLastStoryViewer().updatePlayingMode(); } } @@ -417,12 +421,9 @@ public abstract class BaseFragment { } catch (Exception e) { FileLog.e(e); } - if (storyViewer != null) { - storyViewer.onPause(); - storyViewer.updatePlayingMode(); - } - if (overlayStoryViewer != null) { - overlayStoryViewer.updatePlayingMode(); + if (getLastStoryViewer() != null) { + getLastStoryViewer().onPause(); + getLastStoryViewer().updatePlayingMode(); } } @@ -461,11 +462,12 @@ public abstract class BaseFragment { } public boolean closeStoryViewer() { - if (overlayStoryViewer != null && overlayStoryViewer.isShown()) { - return overlayStoryViewer.onBackPressed(); - } - if (storyViewer != null && storyViewer.isShown()) { - return storyViewer.onBackPressed(); + if (storyViewerStack != null) { + for (int i = storyViewerStack.size() - 1; i >= 0; --i) { + if (storyViewerStack.get(i).isShown()) { + return storyViewerStack.get(i).onBackPressed(); + } + } } return false; } @@ -650,13 +652,13 @@ public abstract class BaseFragment { if (dialog == null || parentLayout == null || parentLayout.isTransitionAnimationInProgress() || parentLayout.isSwipeInProgress() || !allowInTransition && parentLayout.checkTransitionAnimation()) { return null; } - if (overlayStoryViewer != null && overlayStoryViewer.isShown()) { - overlayStoryViewer.showDialog(dialog); - return dialog; - } - if (storyViewer != null && storyViewer.isShown()) { - storyViewer.showDialog(dialog); - return dialog; + if (storyViewerStack != null) { + for (int i = storyViewerStack.size() - 1; i >= 0; --i) { + if (storyViewerStack.get(i).isShown()) { + storyViewerStack.get(i).showDialog(dialog); + return dialog; + } + } } try { if (visibleDialog != null) { @@ -946,8 +948,13 @@ public abstract class BaseFragment { public int getNavigationBarColor() { int color = Theme.getColor(Theme.key_windowBackgroundGray, getResourceProvider()); - if (storyViewer != null && storyViewer.attachedToParent()) { - return storyViewer.getNavigationBarColor(color); + if (storyViewerStack != null) { + for (int i = storyViewerStack.size() - 1; i >= 0; --i) { + StoryViewer storyViewer = storyViewerStack.get(i); + if (storyViewer.attachedToParent()) { + color = storyViewer.getNavigationBarColor(color); + } + } } return color; } @@ -994,7 +1001,7 @@ public abstract class BaseFragment { } public boolean isLightStatusBar() { - if (storyViewer != null && storyViewer.isShown()) { + if (getLastStoryViewer() != null && getLastStoryViewer().isShown()) { return false; } if (hasForceLightStatusBar() && !Theme.getCurrentTheme().isDark()) { @@ -1051,41 +1058,48 @@ public abstract class BaseFragment { } public void attachStoryViewer(ActionBarLayout.LayoutContainer parentLayout) { - if (storyViewer != null && storyViewer.attachedToParent()) { - AndroidUtilities.removeFromParent(storyViewer.windowView); - parentLayout.addView(storyViewer.windowView); - } - if (overlayStoryViewer != null && overlayStoryViewer.attachedToParent()) { - AndroidUtilities.removeFromParent(overlayStoryViewer.windowView); - parentLayout.addView(overlayStoryViewer.windowView); + if (storyViewerStack != null) { + for (int i = 0; i < storyViewerStack.size(); ++i) { + StoryViewer storyViewer = storyViewerStack.get(i); + if (storyViewer != null && storyViewer.attachedToParent()) { + AndroidUtilities.removeFromParent(storyViewer.windowView); + parentLayout.addView(storyViewer.windowView); + } + } } } public void detachStoryViewer() { - if (storyViewer != null && storyViewer.attachedToParent()) { - AndroidUtilities.removeFromParent(storyViewer.windowView); - } - if (overlayStoryViewer != null && overlayStoryViewer.attachedToParent()) { - AndroidUtilities.removeFromParent(overlayStoryViewer.windowView); + if (storyViewerStack != null) { + for (int i = 0; i < storyViewerStack.size(); ++i) { + StoryViewer storyViewer = storyViewerStack.get(i); + if (storyViewer != null && storyViewer.attachedToParent()) { + AndroidUtilities.removeFromParent(storyViewer.windowView); + } + } } } public boolean isStoryViewer(View child) { - if (storyViewer != null && child == storyViewer.windowView) { - return true; - } - if (overlayStoryViewer != null && child == overlayStoryViewer.windowView) { - return true; + if (storyViewerStack != null) { + for (int i = 0; i < storyViewerStack.size(); ++i) { + StoryViewer storyViewer = storyViewerStack.get(i); + if (storyViewer != null && child == storyViewer.windowView) { + return true; + } + } } return false; } public void setKeyboardHeightFromParent(int keyboardHeight) { - if (storyViewer != null) { - storyViewer.setKeyboardHeightFromParent(keyboardHeight); - } - if (overlayStoryViewer != null) { - overlayStoryViewer.setKeyboardHeightFromParent(keyboardHeight); + if (storyViewerStack != null) { + for (int i = 0; i < storyViewerStack.size(); ++i) { + StoryViewer storyViewer = storyViewerStack.get(i); + if (storyViewer != null) { + storyViewer.setKeyboardHeightFromParent(keyboardHeight); + } + } } } @@ -1094,20 +1108,29 @@ public abstract class BaseFragment { } public StoryViewer getOrCreateStoryViewer() { - if (storyViewer == null) { - storyViewer = new StoryViewer(this); + if (storyViewerStack == null) { + storyViewerStack = new ArrayList<>(); + } + if (storyViewerStack.isEmpty()) { + StoryViewer storyViewer = new StoryViewer(this); if (parentLayout != null && parentLayout.isSheet()) { storyViewer.fromBottomSheet = true; } + storyViewerStack.add(storyViewer); } - return storyViewer; + return storyViewerStack.get(0); } - public StoryViewer getOrCreateOverlayStoryViewer() { - if (overlayStoryViewer == null) { - overlayStoryViewer = new StoryViewer(this); + public StoryViewer createOverlayStoryViewer() { + if (storyViewerStack == null) { + storyViewerStack = new ArrayList<>(); } - return overlayStoryViewer; + StoryViewer storyViewer = new StoryViewer(this); + if (parentLayout != null && parentLayout.isSheet()) { + storyViewer.fromBottomSheet = true; + } + storyViewerStack.add(storyViewer); + return storyViewer; } public void onBottomSheetCreated() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java index 8a4b06a9b..3e171181f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java @@ -82,6 +82,7 @@ public class BottomSheet extends Dialog { public boolean scrollNavBar; public boolean occupyNavigationBar; protected boolean waitingKeyboard; + public FrameLayout topBulletinContainer; protected boolean useSmoothKeyboard; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java index ac1671763..d42327a6b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java @@ -448,7 +448,7 @@ public class DrawerLayoutContainer extends FrameLayout { return true; } - if ((allowOpenDrawerBySwipe || drawerOpened) && allowOpenDrawer && parentActionBarLayout.getFragmentStack().size() == 1 && (parentActionBarLayout.getLastFragment().storyViewer == null || !parentActionBarLayout.getLastFragment().storyViewer.attachedToParent())) { + if ((allowOpenDrawerBySwipe || drawerOpened) && allowOpenDrawer && parentActionBarLayout.getFragmentStack().size() == 1 && (parentActionBarLayout.getLastFragment().getLastStoryViewer() == null || !parentActionBarLayout.getLastFragment().getLastStoryViewer().attachedToParent())) { if (ev != null && (ev.getAction() == MotionEvent.ACTION_DOWN || ev.getAction() == MotionEvent.ACTION_MOVE) && !startedTracking && !maybeStartTracking) { View scrollingChild = findScrollingChild(this, ev.getX(),ev.getY()); if (scrollingChild != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/OKLCH.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/OKLCH.java index 4766642bc..a26549690 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/OKLCH.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/OKLCH.java @@ -130,8 +130,11 @@ public class OKLCH { double[] hueoklch = rgb2oklch(rgb(hueColor)); double[] oklch = rgb2oklch(rgb(baseColor)); oklch[2] = hueoklch[2]; - if (Double.isNaN(hueoklch[2])) { + if (Double.isNaN(hueoklch[2]) || hueoklch[1] < .08f) { oklch[1] = hueoklch[1]; + if (!Theme.isCurrentThemeDark() && oklch[0] < .8f) { + oklch[0] = Utilities.clamp(oklch[0] - .1, 1, 0); + } } return ColorUtils.setAlphaComponent(rgb(oklch2rgb(oklch)), Color.alpha(baseColor)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java index 1d1925651..166006f22 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java @@ -3238,6 +3238,7 @@ public class Theme { public static TextPaint chat_replyNamePaint; public static TextPaint chat_replyTextPaint; public static TextPaint chat_quoteTextPaint; + public static TextPaint chat_titleLabelTextPaint; public static TextPaint chat_topicTextPaint; public static TextPaint chat_commentTextPaint; public static TextPaint chat_contextResult_titleTextPaint; @@ -3309,6 +3310,7 @@ public class Theme { public static Drawable chat_shareIconDrawable; public static Drawable chat_replyIconDrawable; public static Drawable chat_closeIconDrawable; + public static Drawable chat_moreIconDrawable; public static Drawable chat_goIconDrawable; public static Drawable chat_botLinkDrawable; public static Drawable chat_botCardDrawable; @@ -4195,6 +4197,7 @@ public class Theme { public static final String key_drawable_replyIcon = "drawableReplyIcon"; public static final String key_drawable_shareIcon = "drawableShareIcon"; public static final String key_drawable_closeIcon = "drawableCloseIcon"; + public static final String key_drawable_moreIcon = "drawableMoreIcon"; public static final String key_drawable_muteIconDrawable = "drawableMuteIcon"; public static final String key_drawable_lockIconDrawable = "drawableLockIcon"; public static final String key_drawable_chat_pollHintDrawableOut = "drawable_chat_pollHintDrawableOut"; @@ -6017,6 +6020,27 @@ public class Theme { return stateListDrawable; } } + + public static Drawable createRadSelectorDrawable(int color, int rippleColor, int topRad, int bottomRad) { + if (Build.VERSION.SDK_INT >= 21) { + maskPaint.setColor(0xffffffff); + Drawable maskDrawable = new RippleRadMaskDrawable(topRad, bottomRad); + ColorStateList colorStateList = new ColorStateList( + new int[][]{StateSet.WILD_CARD}, + new int[]{rippleColor} + ); + return new RippleDrawable(colorStateList, createRoundRectDrawable(dp(topRad), dp(bottomRad), color), maskDrawable); + } else { + Drawable backgroundDrawable = createRoundRectDrawable(dp(topRad), dp(bottomRad), color); + Drawable pressedDrawable = new LayerDrawable(new Drawable[]{backgroundDrawable, createRoundRectDrawable(dp(topRad), dp(bottomRad), rippleColor)}); + StateListDrawable stateListDrawable = new StateListDrawable(); + stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, pressedDrawable); + stateListDrawable.addState(new int[]{android.R.attr.state_selected}, pressedDrawable); + stateListDrawable.addState(StateSet.WILD_CARD, backgroundDrawable); + return stateListDrawable; + } + } + public static Drawable createRadSelectorDrawable(int color, int topLeftRad, int topRightRad, int bottomRightRad, int bottomLeftRad) { if (Build.VERSION.SDK_INT >= 21) { maskPaint.setColor(0xffffffff); @@ -8447,6 +8471,7 @@ public class Theme { chat_replyNamePaint.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); chat_replyTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); chat_quoteTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); + chat_titleLabelTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); chat_topicTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); chat_topicTextPaint.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); chat_forwardNamePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); @@ -8478,6 +8503,7 @@ public class Theme { chat_replyTextPaint.setTextSize(dp(smallerDp)); chat_quoteTextPaint.setTextSize(dp(smallerDp - 1)); chat_topicTextPaint.setTextSize(dp(smallerDp - 1)); + chat_titleLabelTextPaint.setTextSize(dp(smallerDp - 2)); chat_forwardNamePaint.setTextSize(dp(smallerDp)); chat_adminPaint.setTextSize(dp(smallerDp - 1)); chat_msgTextCodePaint.setTextSize(dp(Math.max(Math.min(10, SharedConfig.fontSize - 1), SharedConfig.fontSize - 2))); @@ -8542,6 +8568,7 @@ public class Theme { chat_replyTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); chat_topicTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); chat_topicTextPaint.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + chat_titleLabelTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); chat_commentTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); chat_instantViewPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); chat_instantViewPaint.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); @@ -8708,6 +8735,7 @@ public class Theme { chat_shareIconDrawable = resources.getDrawable(R.drawable.filled_button_share).mutate(); chat_replyIconDrawable = resources.getDrawable(R.drawable.filled_button_reply); chat_closeIconDrawable = resources.getDrawable(R.drawable.msg_voiceclose).mutate(); + chat_moreIconDrawable = resources.getDrawable(R.drawable.media_more).mutate(); chat_goIconDrawable = resources.getDrawable(R.drawable.filled_open_message); int rad = dp(2); @@ -8803,6 +8831,7 @@ public class Theme { addChatDrawable(key_drawable_msgStickerViews, chat_msgStickerViewsDrawable, key_chat_serviceText); addChatDrawable(key_drawable_replyIcon, chat_replyIconDrawable, key_chat_serviceIcon); addChatDrawable(key_drawable_closeIcon, chat_closeIconDrawable, key_chat_serviceIcon); + addChatDrawable(key_drawable_moreIcon, chat_moreIconDrawable, key_chat_serviceIcon); addChatDrawable(key_drawable_shareIcon, chat_shareIconDrawable, key_chat_serviceIcon); addChatDrawable(key_drawable_muteIconDrawable, chat_muteIconDrawable, key_chat_muteIcon); addChatDrawable(key_drawable_lockIconDrawable, chat_lockIconDrawable, key_chat_lockIcon); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionIntroActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionIntroActivity.java index b8cddf34b..3d68b090a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionIntroActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionIntroActivity.java @@ -70,7 +70,7 @@ public class ActionIntroActivity extends BaseFragment implements LocationControl private TextView titleTextView; private TextView descriptionText; private LinearLayout descriptionLayout; - private TextView[] desctiptionLines = new TextView[6]; + private TextView[] descriptionLines = new TextView[6]; private TextView descriptionText2; private Drawable drawable1; private Drawable drawable2; @@ -521,43 +521,43 @@ public class ActionIntroActivity extends BaseFragment implements LocationControl linearLayout.setOrientation(LinearLayout.HORIZONTAL); descriptionLayout.addView(linearLayout, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, 0, 0, a != 2 ? 7 : 0)); - desctiptionLines[a * 2] = new TextView(context); - desctiptionLines[a * 2].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); - desctiptionLines[a * 2].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - desctiptionLines[a * 2].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - desctiptionLines[a * 2].setText(String.format(LocaleController.isRTL ? ".%d" : "%d.", a + 1)); - desctiptionLines[a * 2].setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + descriptionLines[a * 2] = new TextView(context); + descriptionLines[a * 2].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + descriptionLines[a * 2].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + descriptionLines[a * 2].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + descriptionLines[a * 2].setText(String.format(LocaleController.isRTL ? ".%d" : "%d.", a + 1)); + descriptionLines[a * 2].setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); - desctiptionLines[a * 2 + 1] = new TextView(context); - desctiptionLines[a * 2 + 1].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); - desctiptionLines[a * 2 + 1].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - desctiptionLines[a * 2 + 1].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + descriptionLines[a * 2 + 1] = new TextView(context); + descriptionLines[a * 2 + 1].setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + descriptionLines[a * 2 + 1].setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + descriptionLines[a * 2 + 1].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); if (a == 0) { - desctiptionLines[a * 2 + 1].setLinkTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkText)); - desctiptionLines[a * 2 + 1].setHighlightColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkSelection)); + descriptionLines[a * 2 + 1].setLinkTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkText)); + descriptionLines[a * 2 + 1].setHighlightColor(Theme.getColor(Theme.key_windowBackgroundWhiteLinkSelection)); String text = LocaleController.getString("AuthAnotherClientInfo1", R.string.AuthAnotherClientInfo1); SpannableStringBuilder spanned = new SpannableStringBuilder(text); int index1 = text.indexOf('*'); int index2 = text.lastIndexOf('*'); if (index1 != -1 && index2 != -1 && index1 != index2) { - desctiptionLines[a * 2 + 1].setMovementMethod(new AndroidUtilities.LinkMovementMethodMy()); + descriptionLines[a * 2 + 1].setMovementMethod(new AndroidUtilities.LinkMovementMethodMy()); spanned.replace(index2, index2 + 1, ""); spanned.replace(index1, index1 + 1, ""); spanned.setSpan(new URLSpanNoUnderline(LocaleController.getString("AuthAnotherClientDownloadClientUrl", R.string.AuthAnotherClientDownloadClientUrl)), index1, index2 - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } - desctiptionLines[a * 2 + 1].setText(spanned); + descriptionLines[a * 2 + 1].setText(spanned); } else if (a == 1) { - desctiptionLines[a * 2 + 1].setText(LocaleController.getString("AuthAnotherClientInfo2", R.string.AuthAnotherClientInfo2)); + descriptionLines[a * 2 + 1].setText(LocaleController.getString("AuthAnotherClientInfo2", R.string.AuthAnotherClientInfo2)); } else { - desctiptionLines[a * 2 + 1].setText(LocaleController.getString("AuthAnotherClientInfo3", R.string.AuthAnotherClientInfo3)); + descriptionLines[a * 2 + 1].setText(LocaleController.getString("AuthAnotherClientInfo3", R.string.AuthAnotherClientInfo3)); } if (LocaleController.isRTL) { linearLayout.setGravity(Gravity.RIGHT); - linearLayout.addView(desctiptionLines[a * 2 + 1], LayoutHelper.createLinear(0, LayoutHelper.WRAP_CONTENT, 1.0f)); - linearLayout.addView(desctiptionLines[a * 2], LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 4, 0, 0, 0)); + linearLayout.addView(descriptionLines[a * 2 + 1], LayoutHelper.createLinear(0, LayoutHelper.WRAP_CONTENT, 1.0f)); + linearLayout.addView(descriptionLines[a * 2], LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 4, 0, 0, 0)); } else { - linearLayout.addView(desctiptionLines[a * 2], LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, 0, 4, 0)); - linearLayout.addView(desctiptionLines[a * 2 + 1], LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); + linearLayout.addView(descriptionLines[a * 2], LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, 0, 4, 0)); + linearLayout.addView(descriptionLines[a * 2 + 1], LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); } } @@ -912,13 +912,13 @@ public class ActionIntroActivity extends BaseFragment implements LocationControl themeDescriptions.add(new ThemeDescription(buttonTextView, ThemeDescription.FLAG_USEBACKGROUNDDRAWABLE, null, null, null, delegate, Theme.key_featuredStickers_addButton)); themeDescriptions.add(new ThemeDescription(buttonTextView, ThemeDescription.FLAG_USEBACKGROUNDDRAWABLE | ThemeDescription.FLAG_DRAWABLESELECTEDSTATE, null, null, null, null, Theme.key_featuredStickers_addButtonPressed)); - themeDescriptions.add(new ThemeDescription(desctiptionLines[0], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); - themeDescriptions.add(new ThemeDescription(desctiptionLines[1], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); - themeDescriptions.add(new ThemeDescription(desctiptionLines[1], ThemeDescription.FLAG_LINKCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteLinkText)); - themeDescriptions.add(new ThemeDescription(desctiptionLines[2], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); - themeDescriptions.add(new ThemeDescription(desctiptionLines[3], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); - themeDescriptions.add(new ThemeDescription(desctiptionLines[4], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); - themeDescriptions.add(new ThemeDescription(desctiptionLines[5], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(descriptionLines[0], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(descriptionLines[1], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(descriptionLines[1], ThemeDescription.FLAG_LINKCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteLinkText)); + themeDescriptions.add(new ThemeDescription(descriptionLines[2], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(descriptionLines[3], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(descriptionLines[4], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(descriptionLines[5], ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(null, ThemeDescription.FLAG_TEXTCOLOR, null, null, new Drawable[]{drawable2}, null, Theme.key_changephoneinfo_image2)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/AvatarSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/AvatarSpan.java index ef6c0614f..b2aa61e9e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/AvatarSpan.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/AvatarSpan.java @@ -5,6 +5,7 @@ import static org.telegram.messenger.AndroidUtilities.dp; import android.graphics.Canvas; import android.graphics.Paint; +import android.text.Spannable; import android.text.style.ReplacementSpan; import android.view.View; @@ -23,6 +24,8 @@ public class AvatarSpan extends ReplacementSpan { private final int sz; private final int currentAccount; + private View parent; + public AvatarSpan(View parent, int currentAccount, int sz) { this.currentAccount = currentAccount; this.imageReceiver = new ImageReceiver(parent); @@ -33,24 +36,48 @@ public class AvatarSpan extends ReplacementSpan { this.shadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG); shadowPaint.setShadowLayer(dp(1), 0, dp(.66f), 0x33000000); - if (parent != null && parent.isAttachedToWindow()) { + setParent(parent); + } + + public void setParent(View parent) { + if (this.parent == parent) return; + if (this.parent != null) { + this.parent.removeOnAttachStateChangeListener(parentAttachListener); + if (this.parent.isAttachedToWindow() && !parent.isAttachedToWindow()) { + imageReceiver.onDetachedFromWindow(); + } + } + if ((this.parent == null || !this.parent.isAttachedToWindow()) && parent != null && parent.isAttachedToWindow()) { imageReceiver.onAttachedToWindow(); } + this.parent = parent; + imageReceiver.setParentView(parent); if (parent != null) { - parent.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { - @Override - public void onViewAttachedToWindow(@NonNull View v) { - imageReceiver.onAttachedToWindow(); - } - - @Override - public void onViewDetachedFromWindow(@NonNull View v) { - imageReceiver.onDetachedFromWindow(); - } - }); + parent.addOnAttachStateChangeListener(parentAttachListener); } } + public static void checkSpansParent(CharSequence cs, View parent) { + if (cs == null) return; + if (!(cs instanceof Spannable)) return; + Spannable spannable = (Spannable) cs; + AvatarSpan[] spans = spannable.getSpans(0, spannable.length(), AvatarSpan.class); + for (AvatarSpan span : spans) { + span.setParent(parent); + } + } + + private final View.OnAttachStateChangeListener parentAttachListener = new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(@NonNull View v) { + imageReceiver.onAttachedToWindow(); + } + @Override + public void onViewDetachedFromWindow(@NonNull View v) { + imageReceiver.onDetachedFromWindow(); + } + }; + public void setChat(TLRPC.Chat chat) { avatarDrawable.setInfo(currentAccount, chat); imageReceiver.setForUserOrChat(chat, avatarDrawable); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/BasePermissionsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/BasePermissionsActivity.java index c9183971b..eac438a92 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/BasePermissionsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/BasePermissionsActivity.java @@ -7,6 +7,7 @@ import android.content.pm.PackageManager; import android.net.Uri; import androidx.annotation.RawRes; +import androidx.fragment.app.FragmentActivity; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; @@ -22,7 +23,7 @@ import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.AlertsCreator; -public class BasePermissionsActivity extends Activity { +public class BasePermissionsActivity extends FragmentActivity { public final static int REQUEST_CODE_GEOLOCATION = 2, REQUEST_CODE_EXTERNAL_STORAGE = 4, REQUEST_CODE_ATTACH_CONTACT = 5, diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/AwayMessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/AwayMessagesActivity.java index bab0d4387..8f9aa2f7b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/AwayMessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/AwayMessagesActivity.java @@ -81,7 +81,7 @@ public class AwayMessagesActivity extends BaseFragment implements NotificationCe recipientsHelper.setValue(currentValue == null ? null : currentValue.recipients); } - listView = new UniversalRecyclerView(context, currentAccount, this::fillItems, this::onClick, null, getResourceProvider()); + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, null); contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); setValue(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessBotButton.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessBotButton.java new file mode 100644 index 000000000..42649b94b --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessBotButton.java @@ -0,0 +1,181 @@ +package org.telegram.ui.Business; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.view.Gravity; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.UserObject; +import org.telegram.messenger.browser.Browser; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.AnimatedTextView; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.ClickableAnimatedTextView; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.ItemOptions; +import org.telegram.ui.Components.LayoutHelper; + +public class BusinessBotButton extends FrameLayout { + + private final int currentAccount; + + private final AvatarDrawable avatarDrawable; + private final BackupImageView avatarView; + private final AnimatedTextView titleView; + private final AnimatedTextView subtitleView; + private final ClickableAnimatedTextView pauseButton; + private final ImageView menuView; + private boolean paused; + + private long dialogId; + private long botId; + private int flags; + private String manageUrl; + + public BusinessBotButton(Context context, ChatActivity chatActivity, Theme.ResourcesProvider resourcesProvider) { + super(context); + + this.currentAccount = chatActivity.getCurrentAccount(); + paused = false; + + avatarView = new BackupImageView(context); + TLRPC.User user = chatActivity.getMessagesController().getUser(botId); + avatarDrawable = new AvatarDrawable(); + avatarDrawable.setInfo(user); + avatarView.setRoundRadius(dp(16)); + avatarView.setForUserOrChat(user, avatarDrawable); + addView(avatarView, LayoutHelper.createFrame(32, 32, Gravity.CENTER_VERTICAL | Gravity.LEFT, 10, 0, 10, 0)); + + LinearLayout textLayout = new LinearLayout(context); + textLayout.setOrientation(LinearLayout.VERTICAL); + + titleView = new AnimatedTextView(context); + titleView.adaptWidth = false; + titleView.getDrawable().setHacks(true, true, false); + titleView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + titleView.setTextSize(dp(14)); + titleView.setText(UserObject.getUserName(user)); + titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + titleView.setEllipsizeByGradient(true); + textLayout.addView(titleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 17, 0, 0, 0, 1)); + + subtitleView = new AnimatedTextView(context); + subtitleView.adaptWidth = false; + subtitleView.getDrawable().setHacks(true, true, false); + subtitleView.setTextSize(dp(13)); + subtitleView.setText(LocaleController.getString(R.string.BizBotStatusManages)); + subtitleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider)); + subtitleView.setEllipsizeByGradient(true); + textLayout.addView(subtitleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 17)); + + addView(textLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, 52, 0, 49, 0)); + + pauseButton = new ClickableAnimatedTextView(context); + pauseButton.getDrawable().setHacks(true, true, true); + pauseButton.setAnimationProperties(.75f, 0, 350, CubicBezierInterpolator.EASE_OUT_QUINT); + pauseButton.setScaleProperty(.6f); + pauseButton.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + pauseButton.setBackgroundDrawable(Theme.createSimpleSelectorRoundRectDrawable(dp(14), Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider), Theme.blendOver(Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider), Theme.multAlpha(Color.WHITE, .12f)))); + pauseButton.setTextSize(dp(14)); + pauseButton.setGravity(Gravity.RIGHT); + pauseButton.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText, resourcesProvider)); + pauseButton.setPadding(dp(13), 0, dp(13), 0); + pauseButton.setOnClickListener(v -> { + paused = !paused; + pauseButton.setText(LocaleController.getString(paused ? R.string.BizBotStart : R.string.BizBotStop), true); + subtitleView.cancelAnimation(); + subtitleView.setText(LocaleController.getString(paused ? R.string.BizBotStatusStopped : R.string.BizBotStatusManages), true); + + if (paused) { + flags |= 1; + } else { + flags &=~ 1; + } + MessagesController.getNotificationsSettings(currentAccount).edit() + .putInt("dialog_botflags" + dialogId, flags) + .apply(); + + TLRPC.TL_account_toggleConnectedBotPaused req = new TLRPC.TL_account_toggleConnectedBotPaused(); + req.peer = MessagesController.getInstance(currentAccount).getInputPeer(dialogId); + req.paused = paused; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, null); + + + }); + pauseButton.setOnWidthUpdatedListener(() -> { + float padding = pauseButton.getPaddingLeft() + pauseButton.getDrawable().getCurrentWidth() + pauseButton.getPaddingRight() + dp(12); + titleView.setRightPadding(padding); + subtitleView.setRightPadding(padding); + }); + pauseButton.setText(LocaleController.getString(paused ? R.string.BizBotStart : R.string.BizBotStop)); + addView(pauseButton, LayoutHelper.createFrame(64, 28, Gravity.CENTER_VERTICAL | Gravity.RIGHT, 0, 0, 49, 0)); + + menuView = new ImageView(context); + menuView.setScaleType(ImageView.ScaleType.CENTER); + menuView.setImageResource(R.drawable.msg_mini_customize); + menuView.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector, resourcesProvider), Theme.RIPPLE_MASK_ROUNDRECT_6DP)); + menuView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText3, resourcesProvider), PorterDuff.Mode.MULTIPLY)); + menuView.setOnClickListener(e -> { + ItemOptions itemOptions = ItemOptions.makeOptions(chatActivity.getLayoutContainer(), resourcesProvider, menuView); + itemOptions.add(R.drawable.msg_cancel, LocaleController.getString(R.string.BizBotRemove), true, () -> { + TLRPC.TL_account_disablePeerConnectedBot req = new TLRPC.TL_account_disablePeerConnectedBot(); + req.peer = MessagesController.getInstance(currentAccount).getInputPeer(dialogId); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, null); + + MessagesController.getNotificationsSettings(currentAccount).edit() + .remove("dialog_botid" + dialogId).remove("dialog_boturl" + dialogId).remove("dialog_botflags" + dialogId) + .apply(); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.peerSettingsDidLoad, dialogId); + + BusinessChatbotController.getInstance(currentAccount).invalidate(false); + + }).makeMultiline(false); + if (manageUrl != null) { + itemOptions.add(R.drawable.msg_settings, LocaleController.getString(R.string.BizBotManage), () -> { + Browser.openUrl(getContext(), manageUrl); + }); + } + itemOptions.translate(dp(10), dp(7)); + itemOptions.setDimAlpha(0); + itemOptions.show(); + }); + addView(menuView, LayoutHelper.createFrame(32, 32, Gravity.RIGHT | Gravity.CENTER_VERTICAL, 8, 0, 9, 0)); + } + + public void set( + long dialogId, + long botId, + String url, + int flags + ) { + this.dialogId = dialogId; + this.botId = botId; + this.manageUrl = url; + this.flags = flags; + this.paused = (flags & 1) != 0; + + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(botId); + avatarDrawable.setInfo(user); + avatarView.setForUserOrChat(user, avatarDrawable); + titleView.setText(UserObject.getUserName(user)); + subtitleView.setText(LocaleController.getString(paused ? R.string.BizBotStatusStopped : R.string.BizBotStatusManages)); + pauseButton.setText(LocaleController.getString(paused ? R.string.BizBotStart : R.string.BizBotStop)); + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessChatbotController.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessChatbotController.java index 20f031bfe..6a4f14e9b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessChatbotController.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessChatbotController.java @@ -72,8 +72,10 @@ public class BusinessChatbotController { } } - public void invalidate() { + public void invalidate(boolean reload) { loaded = false; - load(null); + if (reload) { + load(null); + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessIntroActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessIntroActivity.java new file mode 100644 index 000000000..cc6366e02 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessIntroActivity.java @@ -0,0 +1,506 @@ +package org.telegram.ui.Business; + +import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.getString; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.text.Editable; +import android.text.InputFilter; +import android.text.InputType; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BotWebViewVibrationEffect; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.Utilities; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarMenuItem; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.EditTextCell; +import org.telegram.ui.Cells.TextCell; +import org.telegram.ui.Components.AnimatedColor; +import org.telegram.ui.Components.AnimatedFloat; +import org.telegram.ui.Components.AnimatedTextView; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.ChatGreetingsView; +import org.telegram.ui.Components.CircularProgressDrawable; +import org.telegram.ui.Components.CrossfadeDrawable; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.EditTextBoldCursor; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.SizeNotifierFrameLayout; +import org.telegram.ui.Components.Text; +import org.telegram.ui.Components.UItem; +import org.telegram.ui.Components.UniversalAdapter; +import org.telegram.ui.Components.UniversalFragment; +import org.telegram.ui.Stories.StoryViewer; +import org.telegram.ui.Stories.recorder.EmojiBottomSheet; +import org.telegram.ui.Stories.recorder.KeyboardNotifier; +import org.telegram.ui.Stories.recorder.PreviewView; + +import java.util.ArrayList; + +public class BusinessIntroActivity extends UniversalFragment implements NotificationCenter.NotificationCenterDelegate { + + @Override + public boolean onFragmentCreate() { + getNotificationCenter().addObserver(this, NotificationCenter.userInfoDidLoad); + MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_IMAGE); + MediaDataController.getInstance(currentAccount).loadRecents(MediaDataController.TYPE_IMAGE, false, true, false); + MediaDataController.getInstance(currentAccount).loadRecents(MediaDataController.TYPE_FAVE, false, true, false); + return super.onFragmentCreate(); + } + + @Override + public void onFragmentDestroy() { + getNotificationCenter().removeObserver(this, NotificationCenter.userInfoDidLoad); + super.onFragmentDestroy(); + } + + private final static long updateRandomStickerTimeout = 1000 * 5; + private final Runnable updateRandomStickerRunnable = this::updateRandomSticker; + private void updateRandomSticker() { + if (greetingsView == null || !greetingsView.isAttachedToWindow() || !stickerRandom) { + return; + } + greetingsView.setNextSticker(MediaDataController.getInstance(currentAccount).getGreetingsSticker(), () -> { + AndroidUtilities.cancelRunOnUIThread(updateRandomStickerRunnable); + AndroidUtilities.runOnUIThread(updateRandomStickerRunnable, updateRandomStickerTimeout); + }); + } + + private static final int done_button = 1; + private CrossfadeDrawable doneButtonDrawable; + private ActionBarMenuItem doneButton; + + @Override + protected CharSequence getTitle() { + return getString(R.string.BusinessIntro); + } + + private FrameLayout previewContainer; + private ChatGreetingsView greetingsView; + private Drawable greetingsViewBackground; + private EditTextCell titleEdit; + private EditTextCell messageEdit; + + private boolean stickerRandom = true; + private TLRPC.Document sticker = getMediaDataController().getGreetingsSticker(); + + private boolean keyboardVisible; + + @Override + public View createView(Context context) { + AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid); + + greetingsView = new ChatGreetingsView(context, getUserConfig().getCurrentUser(), 1, currentAccount, sticker, getResourceProvider()) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + setPivotX(getMeasuredWidth() / 2f); + setPivotY(getMeasuredHeight()); + } + }; + previewContainer = new FrameLayout(context) { + int minHeight = -1; + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + greetingsView.measure(widthMeasureSpec, heightMeasureSpec); + invalidate(); + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Math.max(minHeight, greetingsView.getMeasuredHeight() + dp(18 * 2)), MeasureSpec.EXACTLY)); + if (minHeight < 0) { + minHeight = getMeasuredHeight(); + } + } + + private final Rect bg = new Rect(); + private final AnimatedFloat width = new AnimatedFloat(this, 220, CubicBezierInterpolator.EASE_OUT_QUINT); + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + final float cx = getWidth() / 2f; + final float width = this.width.set(greetingsView.getWidth()); + bg.set( + (int) (cx - width / 2f * greetingsView.getScaleX()), + (int) (greetingsView.getY() + greetingsView.getHeight() * (1f - greetingsView.getScaleY())), + (int) (cx + width / 2f * greetingsView.getScaleX()), + (int) (greetingsView.getY() + greetingsView.getHeight()) + ); + greetingsViewBackground.setBounds(bg); + greetingsViewBackground.draw(canvas); + return super.drawChild(canvas, child, drawingTime); + } + }; + previewContainer.setWillNotDraw(false); + greetingsViewBackground = Theme.createServiceDrawable(AndroidUtilities.dp(16), greetingsView, previewContainer, getThemedPaint(Theme.key_paint_chatActionBackground)); + greetingsView.setBackground(new ColorDrawable(0)); + ImageView previewBackground = new ImageView(context) { + // lack of ImageView.ScaleType.CROP_START + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + final Matrix matrix = getImageMatrix(); + float scale; + final int viewWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); + final int viewHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); + final int drawableWidth = getDrawable().getIntrinsicWidth(); + final int drawableHeight = getDrawable().getIntrinsicHeight(); + if (drawableWidth * viewHeight > drawableHeight * viewWidth) { + scale = (float) viewHeight / (float) drawableHeight; + } else { + scale = (float) viewWidth / (float) drawableWidth; + } + matrix.setScale(scale, scale); + setImageMatrix(matrix); + } + }; + previewBackground.setScaleType(ImageView.ScaleType.MATRIX); + previewBackground.setImageDrawable(PreviewView.getBackgroundDrawable(null, currentAccount, getUserConfig().getClientUserId(), Theme.isCurrentThemeDark())); + previewContainer.addView(previewBackground, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); + previewContainer.addView(greetingsView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 42, 18, 42, 18)); + + titleEdit = new EditTextCell(context, getString(R.string.BusinessIntroTitleHint), false, getMessagesController().introTitleLengthLimit) { + @Override + protected void onTextChanged(CharSequence newText) { + greetingsView.setPreview(titleEdit.getText().toString(), messageEdit.getText().toString()); + checkDone(true, true); + } + + @Override + protected void onFocusChanged(boolean focused) { + if (focused && listView != null) { + listView.smoothScrollToPosition(2); + } + } + }; + titleEdit.autofocused = true; + titleEdit.setShowLimitOnFocus(true); + titleEdit.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + titleEdit.setDivider(true); + titleEdit.hideKeyboardOnEnter(); + messageEdit = new EditTextCell(context, getString(R.string.BusinessIntroMessageHint), true, getMessagesController().introDescriptionLengthLimit) { + @Override + protected void onTextChanged(CharSequence newText) { + greetingsView.setPreview(titleEdit.getText().toString(), messageEdit.getText().toString()); + checkDone(true, true); + } + + @Override + protected void onFocusChanged(boolean focused) { + if (focused && listView != null) { + listView.smoothScrollToPosition(3); + } + } + }; + messageEdit.setShowLimitOnFocus(true); + messageEdit.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + messageEdit.setDivider(true); + messageEdit.hideKeyboardOnEnter(); + + greetingsView.setPreview("", ""); + + super.createView(context); + + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + if (onBackPressed()) { + finishFragment(); + } + } else if (id == done_button) { + processDone(); + } + } + }); + Drawable checkmark = context.getResources().getDrawable(R.drawable.ic_ab_done).mutate(); + checkmark.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_actionBarDefaultIcon), PorterDuff.Mode.MULTIPLY)); + doneButtonDrawable = new CrossfadeDrawable(checkmark, new CircularProgressDrawable(Theme.getColor(Theme.key_actionBarDefaultIcon))); + doneButton = actionBar.createMenu().addItemWithWidth(done_button, doneButtonDrawable, AndroidUtilities.dp(56), LocaleController.getString("Done", R.string.Done)); + checkDone(false, true); + + listView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { + updateGreetingScale(); + } + }); + listView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + updateGreetingScale(); + } + }); + listView.doNotDetachViews(); + listView.setClipChildren(false); + if (fragmentView instanceof ViewGroup) { + ((ViewGroup) fragmentView).setClipChildren(false); + } + + setValue(); + + new KeyboardNotifier(fragmentView, keyboardHeight -> { + final boolean keyboardVisible = keyboardHeight > dp(20); + if (this.keyboardVisible == keyboardVisible) { + return; + } + this.keyboardVisible = keyboardVisible; + if (!keyboardVisible) { + listView.smoothScrollToPosition(0); + } + }); + + return fragmentView; + } + + private void updateGreetingScale() { + if (!(previewContainer.getParent() instanceof View)) return; + View cell = (View) previewContainer.getParent(); + int top = cell.getTop(); + int fullHeight = previewContainer.getMeasuredHeight() - dp(18 * 2); + int visibleHeight = fullHeight + top; + float scale = Utilities.clamp(visibleHeight / (float) fullHeight, 1, 0.65f); + greetingsView.setScaleX(scale); + greetingsView.setScaleY(scale); + greetingsView.setAlpha(Utilities.clamp(2 * scale, 1, 0)); + previewContainer.invalidate(); + } + + private static final int BUTTON_STICKER = 1; + private static final int BUTTON_REMOVE = 2; + + @Override + protected void fillItems(ArrayList items, UniversalAdapter adapter) { + items.add(UItem.asCustom(previewContainer)); + items.add(UItem.asHeader(getString(R.string.BusinessIntroHeader))); + items.add(UItem.asCustom(titleEdit)); + items.add(UItem.asCustom(messageEdit)); + if (stickerRandom) { + items.add(UItem.asButton(BUTTON_STICKER, getString(R.string.BusinessIntroSticker), getString(R.string.BusinessIntroStickerRandom))); + } else { + items.add(UItem.asButton(BUTTON_STICKER, getString(R.string.BusinessIntroSticker), sticker)); + } + items.add(UItem.asShadow(getString(R.string.BusinessIntroInfo))); + if (clearVisible = !isEmpty()) { + items.add(UItem.asShadow(null)); + items.add(UItem.asButton(BUTTON_REMOVE, LocaleController.getString(R.string.BusinessIntroReset)).red()); + } + items.add(UItem.asLargeShadow(null)); + } + + public boolean isEmpty() { + if (titleEdit == null || messageEdit == null) return true; + return TextUtils.isEmpty(titleEdit.getText()) && TextUtils.isEmpty(messageEdit.getText()) && stickerRandom; + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.userInfoDidLoad) { + setValue(); + } + } + + private String currentTitle, currentMessage; + private long currentSticker; + + private boolean valueSet; + private void setValue() { + if (valueSet) return; + + final long selfId = getUserConfig().getClientUserId(); + TLRPC.UserFull userFull = getMessagesController().getUserFull(selfId); + if (userFull == null) { + getMessagesController().loadUserInfo(getUserConfig().getCurrentUser(), true, getClassGuid()); + return; + } + + if (userFull.business_intro != null) { + titleEdit.setText(currentTitle = userFull.business_intro.title); + messageEdit.setText(currentMessage = userFull.business_intro.description); + sticker = userFull.business_intro.sticker; + } else { + titleEdit.setText(currentTitle = ""); + messageEdit.setText(currentMessage = ""); + sticker = null; + } + currentSticker = sticker == null ? 0 : sticker.id; + stickerRandom = sticker == null; + + if (greetingsView != null) { + greetingsView.setPreview(titleEdit.getText().toString(), messageEdit.getText().toString()); + greetingsView.setSticker(sticker == null || stickerRandom ? MediaDataController.getInstance(currentAccount).getGreetingsSticker() : sticker); + } + + if (stickerRandom) { + AndroidUtilities.cancelRunOnUIThread(updateRandomStickerRunnable); + AndroidUtilities.runOnUIThread(updateRandomStickerRunnable, updateRandomStickerTimeout); + } + + if (listView != null && listView.adapter != null) { + listView.adapter.update(true); + } + valueSet = true; + } + + @Override + protected void onClick(UItem item, View view, int position, float x, float y) { + if (item.id == BUTTON_STICKER) { + EmojiBottomSheet sheet = new EmojiBottomSheet(getContext(), true, getResourceProvider()); + sheet.whenDocumentSelected((parentObject, document, a) -> { + stickerRandom = false; + AndroidUtilities.cancelRunOnUIThread(updateRandomStickerRunnable); + greetingsView.setSticker(sticker = document); + ((TextCell) view).setValueSticker(document); + checkDone(true, false); + }); + showDialog(sheet); + } else if (item.id == BUTTON_REMOVE) { + titleEdit.setText(""); + messageEdit.setText(""); + AndroidUtilities.hideKeyboard(titleEdit.editText); + AndroidUtilities.hideKeyboard(messageEdit.editText); + stickerRandom = true; + greetingsView.setPreview("", ""); + greetingsView.setSticker(sticker = MediaDataController.getInstance(currentAccount).getGreetingsSticker()); + AndroidUtilities.cancelRunOnUIThread(updateRandomStickerRunnable); + AndroidUtilities.runOnUIThread(updateRandomStickerRunnable, updateRandomStickerTimeout); + checkDone(true, false); + } + } + + @Override + protected boolean onLongClick(UItem item, View view, int position, float x, float y) { + return false; + } + + private boolean clearVisible = isEmpty(); + + public boolean hasChanges() { + return ( + !TextUtils.equals(titleEdit.getText().toString(), currentTitle == null ? "" : currentTitle) || + !TextUtils.equals(messageEdit.getText().toString(), currentMessage == null ? "" : currentMessage) || + (stickerRandom || sticker == null ? 0 : sticker.id) != currentSticker + ); + } + + private void checkDone(boolean animated, boolean ignoreClear) { + if (doneButton == null) return; + final boolean hasChanges = hasChanges(); + doneButton.setEnabled(hasChanges); + if (animated) { + doneButton.animate().alpha(hasChanges ? 1.0f : 0.0f).scaleX(hasChanges ? 1.0f : 0.0f).scaleY(hasChanges ? 1.0f : 0.0f).setDuration(180).start(); + } else { + doneButton.setAlpha(hasChanges ? 1.0f : 0.0f); + doneButton.setScaleX(hasChanges ? 1.0f : 0.0f); + doneButton.setScaleY(hasChanges ? 1.0f : 0.0f); + } + if (listView != null && listView.adapter != null && clearVisible != !isEmpty()) { + saveScrollPosition(); + listView.adapter.update(true); + applyScrolledPosition(); + } + } + + private int shiftDp = -4; + private void processDone() { + if (doneButtonDrawable.getProgress() > 0f) return; + +// if (!isEmpty()) { +// if (TextUtils.isEmpty(titleEdit.getText())) { +// BotWebViewVibrationEffect.APP_ERROR.vibrate(); +// AndroidUtilities.shakeViewSpring(titleEdit, shiftDp = -shiftDp); +// return; +// } +// if (TextUtils.isEmpty(messageEdit.getText())) { +// BotWebViewVibrationEffect.APP_ERROR.vibrate(); +// AndroidUtilities.shakeViewSpring(messageEdit, shiftDp = -shiftDp); +// return; +// } +// } + + doneButtonDrawable.animateToProgress(1f); + TLRPC.UserFull userFull = getMessagesController().getUserFull(getUserConfig().getClientUserId()); + TLRPC.TL_account_updateBusinessIntro req = new TLRPC.TL_account_updateBusinessIntro(); + if (!isEmpty()) { + req.flags |= 1; + req.intro = new TLRPC.TL_inputBusinessIntro(); + req.intro.title = titleEdit.getText().toString(); + req.intro.description = messageEdit.getText().toString(); + if (!stickerRandom && sticker != null) { + req.intro.flags |= 1; + req.intro.sticker = getMessagesController().getInputDocument(sticker); + } + + if (userFull != null) { + userFull.flags2 |= 16; + userFull.business_intro = new TLRPC.TL_businessIntro(); + userFull.business_intro.title = req.intro.title; + userFull.business_intro.description = req.intro.description; + if (!stickerRandom && sticker != null) { + userFull.business_intro.flags |= 1; + userFull.business_intro.sticker = sticker; + } + } + } else { + if (userFull != null) { + userFull.flags2 &=~ 16; + userFull.business_intro = null; + } + } + + getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (err != null) { + doneButtonDrawable.animateToProgress(0f); + BulletinFactory.showError(err); + } else if (res instanceof TLRPC.TL_boolFalse) { + doneButtonDrawable.animateToProgress(0f); + BulletinFactory.of(this).createErrorBulletin(LocaleController.getString(R.string.UnknownError)).show(); + } else { + finishFragment(); + } + })); + getMessagesStorage().updateUserInfo(userFull, false); + } + + @Override + public boolean onBackPressed() { + if (hasChanges()) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString(R.string.UnsavedChanges)); + builder.setMessage(LocaleController.getString(R.string.BusinessIntroUnsavedChanges)); + builder.setPositiveButton(LocaleController.getString("ApplyTheme", R.string.ApplyTheme), (dialogInterface, i) -> processDone()); + builder.setNegativeButton(LocaleController.getString("PassportDiscard", R.string.PassportDiscard), (dialog, which) -> finishFragment()); + showDialog(builder.create()); + return false; + } + return super.onBackPressed(); + } + + +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessLinksActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessLinksActivity.java new file mode 100644 index 000000000..11626edf1 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessLinksActivity.java @@ -0,0 +1,571 @@ +package org.telegram.ui.Business; + +import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.formatPluralString; +import static org.telegram.messenger.LocaleController.formatString; +import static org.telegram.messenger.LocaleController.getString; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.InputType; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ContactsController; +import org.telegram.messenger.Emoji; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.UserObject; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.AlertDialogDecor; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.SimpleTextView; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.AnimatedColor; +import org.telegram.ui.Components.AnimatedTextView; +import org.telegram.ui.Components.Bulletin; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.EditTextBoldCursor; +import org.telegram.ui.Components.ItemOptions; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.SizeNotifierFrameLayout; +import org.telegram.ui.Components.UItem; +import org.telegram.ui.Components.URLSpanCopyToClipboard; +import org.telegram.ui.Components.UniversalAdapter; +import org.telegram.ui.Components.UniversalFragment; +import org.telegram.ui.Components.spoilers.SpoilersTextView; +import org.telegram.ui.LaunchActivity; +import org.telegram.ui.PrivacyControlActivity; + +import java.util.ArrayList; +import java.util.Objects; + +public class BusinessLinksActivity extends UniversalFragment implements NotificationCenter.NotificationCenterDelegate { + + private final static int BUTTON_ADD = 1; + + private static AlertDialog currentDialog; + + public static void openRenameAlert(Context context, int currentAccount, TLRPC.TL_businessChatLink link, Theme.ResourcesProvider resourcesProvider, boolean forceNotAdaptive) { + BaseFragment fragment = LaunchActivity.getLastFragment(); + Activity activity = AndroidUtilities.findActivity(context); + View currentFocus = activity != null ? activity.getCurrentFocus() : null; + final boolean isKeyboardVisible = fragment != null && fragment.getFragmentView() instanceof SizeNotifierFrameLayout && ((SizeNotifierFrameLayout) fragment.getFragmentView()).measureKeyboardHeight() > dp(20); + final boolean adaptive = isKeyboardVisible && !forceNotAdaptive; + AlertDialog[] dialog = new AlertDialog[1]; + AlertDialog.Builder builder; + if (adaptive) { + builder = new AlertDialogDecor.Builder(context, resourcesProvider); + } else { + builder = new AlertDialog.Builder(context, resourcesProvider); + } + builder.setTitle(getString(R.string.BusinessLinksRenameTitle)); + + final int MAX_NAME_LENGTH = 32; + EditTextBoldCursor editText = new EditTextBoldCursor(context) { + AnimatedColor limitColor = new AnimatedColor(this); + private int limitCount; + AnimatedTextView.AnimatedTextDrawable limit = new AnimatedTextView.AnimatedTextDrawable(false, true, true); + + { + limit.setAnimationProperties(.2f, 0, 160, CubicBezierInterpolator.EASE_OUT_QUINT); + limit.setTextSize(dp(15.33f)); + limit.setCallback(this); + limit.setGravity(Gravity.RIGHT); + } + + @Override + protected boolean verifyDrawable(@NonNull Drawable who) { + return who == limit || super.verifyDrawable(who); + } + + @Override + protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { + super.onTextChanged(text, start, lengthBefore, lengthAfter); + + if (limit != null) { + limitCount = MAX_NAME_LENGTH - text.length(); + limit.cancelAnimation(); + limit.setText(limitCount > 4 ? "" : "" + limitCount); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + + limit.setTextColor(limitColor.set(Theme.getColor(limitCount < 0 ? Theme.key_text_RedRegular : Theme.key_dialogSearchHint, resourcesProvider))); + limit.setBounds(getScrollX(), 0, getScrollX() + getWidth(), getHeight()); + limit.draw(canvas); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(36), MeasureSpec.EXACTLY)); + } + }; + MediaDataController.getInstance(currentAccount).fetchNewEmojiKeywords(AndroidUtilities.getCurrentKeyboardLanguage(), true); + editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + editText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + editText.setText(link.title); + editText.setTextColor(Theme.getColor(Theme.key_dialogTextBlack, resourcesProvider)); + editText.setHintColor(Theme.getColor(Theme.key_groupcreate_hintText, resourcesProvider)); + editText.setCursorColor(Theme.getColor(Theme.key_chat_messagePanelCursor)); + editText.setHintText(LocaleController.getString(R.string.BusinessLinksNamePlaceholder)); + editText.setSingleLine(true); + editText.setFocusable(true); + editText.setLineColors(Theme.getColor(Theme.key_windowBackgroundWhiteInputField, resourcesProvider), Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated, resourcesProvider), Theme.getColor(Theme.key_text_RedRegular, resourcesProvider)); + editText.setImeOptions(EditorInfo.IME_ACTION_DONE); + editText.setBackgroundDrawable(null); + editText.setPadding(0, 0, dp(42), 0); + + LinearLayout container = new LinearLayout(context); + container.setOrientation(LinearLayout.VERTICAL); + + final TextView textView = new TextView(context); + textView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack, resourcesProvider)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + textView.setText(LocaleController.getString(R.string.BusinessLinksRenameMessage)); + + container.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 24, 5, 24, 12)); + + container.addView(editText, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 24, 0, 24, 10)); + builder.setView(container); + builder.setWidth(dp(292)); + + editText.setOnEditorActionListener((v, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_DONE) { + String text = editText.getText().toString(); + if (text.length() > MAX_NAME_LENGTH) { + AndroidUtilities.shakeView(editText); + return true; + } + BusinessLinksController.getInstance(currentAccount).editLinkTitle(link.link, text); + if (dialog[0] != null) { + dialog[0].dismiss(); + } + if (dialog[0] == currentDialog) { + currentDialog = null; + } + if (currentFocus != null) { + currentFocus.requestFocus(); + } + return true; + } + return false; + }); + builder.setPositiveButton(LocaleController.getString(R.string.Done), (dialogInterface, i) -> { + String text = editText.getText().toString(); + if (text.length() > MAX_NAME_LENGTH) { + AndroidUtilities.shakeView(editText); + return; + } + BusinessLinksController.getInstance(currentAccount).editLinkTitle(link.link, text); + dialogInterface.dismiss(); + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), (dialogInterface, i) -> { + dialogInterface.dismiss(); + }); + if (adaptive) { + dialog[0] = currentDialog = builder.create(); + currentDialog.setOnDismissListener(d -> { + currentDialog = null; + if (currentFocus != null) { + currentFocus.requestFocus(); + } + }); + currentDialog.setOnShowListener(d -> { + editText.requestFocus(); + AndroidUtilities.showKeyboard(editText); + }); + currentDialog.showDelayed(250); + } else { + builder.overrideDismissListener(dismiss -> { + if (currentFocus != null) { + currentFocus.requestFocus(); + } + AndroidUtilities.hideKeyboard(editText); + AndroidUtilities.runOnUIThread(dismiss, 80); + }); + dialog[0] = builder.create(); + dialog[0].setOnDismissListener(d -> { + AndroidUtilities.hideKeyboard(editText); + }); + dialog[0].setOnShowListener(d -> { + if (currentFocus != null) { + currentFocus.clearFocus(); + } + editText.requestFocus(); + AndroidUtilities.showKeyboard(editText); + }); + dialog[0].show(); + } + dialog[0].setDismissDialogByButtons(false); + editText.setSelection(editText.getText().length()); + } + + public static boolean closeRenameAlert() { + if (currentDialog != null && currentDialog.isShowing()) { + currentDialog.dismiss(); + return true; + } + return false; + } + + @Override + public boolean onFragmentCreate() { + getNotificationCenter().addObserver(this, NotificationCenter.businessLinksUpdated); + getNotificationCenter().addObserver(this, NotificationCenter.businessLinkCreated); + getNotificationCenter().addObserver(this, NotificationCenter.needDeleteBusinessLink); + getNotificationCenter().addObserver(this, NotificationCenter.privacyRulesUpdated); + BusinessLinksController.getInstance(currentAccount).load(true); + ContactsController.getInstance(currentAccount).loadPrivacySettings(); + return super.onFragmentCreate(); + } + + @Override + public void onFragmentDestroy() { + getNotificationCenter().removeObserver(this, NotificationCenter.businessLinksUpdated); + getNotificationCenter().removeObserver(this, NotificationCenter.businessLinkCreated); + getNotificationCenter().removeObserver(this, NotificationCenter.needDeleteBusinessLink); + getNotificationCenter().removeObserver(this, NotificationCenter.privacyRulesUpdated); + Bulletin.hideVisible(); + super.onFragmentDestroy(); + } + + @Override + public boolean onBackPressed() { + if (closeRenameAlert()) { + return false; + } + return super.onBackPressed(); + } + + @Override + protected CharSequence getTitle() { + return LocaleController.getString(R.string.BusinessLinks); + } + + private static int getPrivacyType(ArrayList privacyRules) { + int type = -1; + boolean currentPlus = false; + boolean currentMinus = false; + boolean premium; + for (int a = 0; a < privacyRules.size(); a++) { + TLRPC.PrivacyRule rule = privacyRules.get(a); + if (rule instanceof TLRPC.TL_privacyValueAllowChatParticipants) { + currentPlus = true; + } else if (rule instanceof TLRPC.TL_privacyValueDisallowChatParticipants) { + currentMinus = true; + } else if (rule instanceof TLRPC.TL_privacyValueAllowUsers) { + currentPlus = true; + } else if (rule instanceof TLRPC.TL_privacyValueDisallowUsers) { + currentMinus = true; + } else if (rule instanceof TLRPC.TL_privacyValueAllowPremium) { + premium = true; + } else if (type == -1) { + if (rule instanceof TLRPC.TL_privacyValueAllowAll) { + type = 0; + } else if (rule instanceof TLRPC.TL_privacyValueDisallowAll) { + type = 1; + } else { + type = 2; + } + } + } + if (type == PrivacyControlActivity.TYPE_EVERYBODY || type == -1 && currentMinus) { + return PrivacyControlActivity.TYPE_EVERYBODY; + } else if (type == PrivacyControlActivity.TYPE_CONTACTS) { + return PrivacyControlActivity.TYPE_CONTACTS; + } else if (type == PrivacyControlActivity.TYPE_NOBODY || currentPlus) { + return PrivacyControlActivity.TYPE_NOBODY; + } + return PrivacyControlActivity.TYPE_NOBODY; + } + + @Override + protected void fillItems(ArrayList items, UniversalAdapter adapter) { + items.add(UItem.asTopView(getString(R.string.BusinessLinksInfo), R.raw.biz_links)); + adapter.whiteSectionStart(); + if (BusinessLinksController.getInstance(currentAccount).canAddNew()) { + items.add(UItem.asButton(BUTTON_ADD, R.drawable.menu_link_create, getString(R.string.BusinessLinksAdd)).accent()); + } + for (TLRPC.TL_businessChatLink businessLink : BusinessLinksController.getInstance(currentAccount).links) { + UItem item = UItem.asBusinessChatLink(new BusinessLinkWrapper(businessLink)); + items.add(item); + } + adapter.whiteSectionEnd(); + + TLRPC.User user = UserConfig.getInstance(currentAccount).getCurrentUser(); + String linkPrefix = MessagesController.getInstance(currentAccount).linkPrefix + "/"; + ArrayList links = new ArrayList<>(2); + String publicUsername = UserObject.getPublicUsername(user); + if (publicUsername != null) { + links.add(linkPrefix + publicUsername); + } + ArrayList phoneRules = ContactsController.getInstance(currentAccount).getPrivacyRules(ContactsController.PRIVACY_RULES_TYPE_PHONE); + ArrayList addedByPhoneRules = ContactsController.getInstance(currentAccount).getPrivacyRules(ContactsController.PRIVACY_RULES_TYPE_ADDED_BY_PHONE); + if (!TextUtils.isEmpty(user.phone) && phoneRules != null && addedByPhoneRules != null) { + if (getPrivacyType(phoneRules) != PrivacyControlActivity.TYPE_NOBODY || getPrivacyType(addedByPhoneRules) != PrivacyControlActivity.TYPE_CONTACTS) { + links.add(linkPrefix + "+" + user.phone); + } + } + if (!links.isEmpty()) { + String text; + if (links.size() == 2) { + text = formatString(R.string.BusinessLinksFooterTwoLinks, links.get(0), links.get(1)); + } else { + text = formatString(R.string.BusinessLinksFooterOneLink, links.get(0)); + } + SpannableString spanned = new SpannableString(text); + for (String link : links) { + int index = text.indexOf(link); + if (index > -1) { + spanned.setSpan(new URLSpanCopyToClipboard("https://" + link, this), index, index + link.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + items.add(UItem.asShadow(spanned)); + } + } + + @Override + protected void onClick(UItem item, View view, int position, float x, float y) { + if (item.id == BUTTON_ADD) { + BusinessLinksController.getInstance(currentAccount).createEmptyLink(); + } else if (item.viewType == UniversalAdapter.VIEW_TYPE_BUSINESS_LINK && item.object instanceof BusinessLinkWrapper) { + BusinessLinkWrapper wrapper = (BusinessLinkWrapper) item.object; + Bundle args = new Bundle(); + args.putInt("chatMode", ChatActivity.MODE_EDIT_BUSINESS_LINK); + args.putString("business_link", wrapper.link.link); + ChatActivity chatActivity = new ChatActivity(args); + presentFragment(chatActivity); + } + } + + @Override + protected boolean onLongClick(UItem item, View view, int position, float x, float y) { + if (item.viewType == UniversalAdapter.VIEW_TYPE_BUSINESS_LINK && item.object instanceof BusinessLinkWrapper) { + TLRPC.TL_businessChatLink link = ((BusinessLinkWrapper) item.object).link; + + ItemOptions options = ItemOptions.makeOptions(this, view); + options.add(R.drawable.msg_copy, getString(R.string.Copy), () -> { + AndroidUtilities.addToClipboard(link.link); + BulletinFactory.of(LaunchActivity.getLastFragment()).createCopyLinkBulletin().show(); + }); + options.add(R.drawable.msg_share, getString(R.string.LinkActionShare), () -> { + Intent intent = new Intent(getContext(), LaunchActivity.class); + intent.setAction(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, link.link); + startActivityForResult(intent, 500); + }); + options.add(R.drawable.msg_edit, getString(R.string.Rename), () -> { + openRenameAlert(getContext(), currentAccount, link, resourceProvider, false); + }); + options.add(R.drawable.msg_delete, getString(R.string.Delete), true, () -> { + AlertDialog dialog = new AlertDialog.Builder(getContext(), getResourceProvider()) + .setTitle(getString(R.string.BusinessLinksDeleteTitle)) + .setMessage(getString(R.string.BusinessLinksDeleteMessage)) + .setPositiveButton(getString(R.string.Remove), (di, w) -> { + BusinessLinksController.getInstance(currentAccount).deleteLinkUndoable(this, link.link); + }) + .setNegativeButton(getString(R.string.Cancel), null) + .create(); + showDialog(dialog); + TextView button = (TextView) dialog.getButton(DialogInterface.BUTTON_POSITIVE); + if (button != null) { + button.setTextColor(getThemedColor(Theme.key_text_RedBold)); + } + }); + options.show(); + return true; + } + return false; + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.businessLinksUpdated || id == NotificationCenter.privacyRulesUpdated) { + if (listView != null && listView.adapter != null) { + listView.adapter.update(true); + } + } else if (id == NotificationCenter.businessLinkCreated) { + TLRPC.TL_businessChatLink link = (TLRPC.TL_businessChatLink) args[0]; + Bundle activityArgs = new Bundle(); + activityArgs.putInt("chatMode", ChatActivity.MODE_EDIT_BUSINESS_LINK); + activityArgs.putString("business_link", link.link); + ChatActivity chatActivity = new ChatActivity(activityArgs); + presentFragment(chatActivity); + } else if (id == NotificationCenter.needDeleteBusinessLink) { + TLRPC.TL_businessChatLink link = (TLRPC.TL_businessChatLink) args[0]; + BusinessLinksController.getInstance(currentAccount).deleteLinkUndoable(this, link.link); + } + } + + public static class BusinessLinkWrapper { + TLRPC.TL_businessChatLink link; + + public BusinessLinkWrapper(TLRPC.TL_businessChatLink link) { + this.link = link; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BusinessLinkWrapper that = (BusinessLinkWrapper) o; + return link.views == that.link.views && + TextUtils.equals(link.link, that.link.link) && + TextUtils.equals(link.title, that.link.title) && + TextUtils.equals(link.message, that.link.message) && + MediaDataController.entitiesEqual(link.entities, that.link.entities); + } + } + + @SuppressLint("ViewConstructor") + public static class BusinessLinkView extends FrameLayout { + + private final ImageView imageView; + private final SimpleTextView titleTextView; + private final SpoilersTextView messagePreviewTextView; + private final SimpleTextView clicksCountTextView; + + private final Theme.ResourcesProvider resourcesProvider; + + private boolean needDivider; + + private TLRPC.TL_businessChatLink businessLink; + + public BusinessLinkView(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + + this.resourcesProvider = resourcesProvider; + + setWillNotDraw(false); + + imageView = new ImageView(context); + imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + imageView.setImageResource(R.drawable.msg_limit_links); + imageView.setPadding(dp(9), dp(9), dp(9), dp(9)); + imageView.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)); + imageView.setBackground(Theme.createCircleDrawable(dp(36), Theme.getColor(Theme.key_featuredStickers_addButton))); + imageView.setOnClickListener(view -> { + if (businessLink != null) { + AndroidUtilities.addToClipboard(businessLink.link); + BulletinFactory.of(LaunchActivity.getLastFragment()).createCopyLinkBulletin().show(); + } + }); + addView(imageView, LayoutHelper.createFrameRelatively(36, 36, Gravity.START | Gravity.CENTER_VERTICAL, 14, 0, 14, 0)); + + titleTextView = new SimpleTextView(context); + titleTextView.setTextSize(15); + titleTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + titleTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + addView(titleTextView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, 20, Gravity.TOP | Gravity.FILL_HORIZONTAL, 64, 10, 14, 0)); + + clicksCountTextView = new SimpleTextView(context); + clicksCountTextView.setTextSize(14); + clicksCountTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2)); + clicksCountTextView.setGravity(LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT); + addView(clicksCountTextView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, 18, Gravity.TOP | Gravity.FILL_HORIZONTAL, 64, 10.66f, 14, 0)); + + messagePreviewTextView = new SpoilersTextView(context); + messagePreviewTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + messagePreviewTextView.setMaxLines(1); + messagePreviewTextView.setEllipsize(TextUtils.TruncateAt.END); + messagePreviewTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider)); + messagePreviewTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + messagePreviewTextView.allowClickSpoilers = false; + messagePreviewTextView.setUseAlphaForEmoji(false); + NotificationCenter.listenEmojiLoading(messagePreviewTextView); + addView(messagePreviewTextView, LayoutHelper.createFrameRelatively(LayoutHelper.MATCH_PARENT, 20, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, 64, 0, 14, 6)); + } + + public void set(BusinessLinkWrapper linkWrapper, boolean needDivider) { + this.needDivider = needDivider; + this.businessLink = linkWrapper.link; + + if (!TextUtils.isEmpty(businessLink.title)) { + titleTextView.setText(businessLink.title); + } else { + titleTextView.setText(BusinessLinksController.stripHttps(businessLink.link)); + } + + CharSequence text = new SpannableStringBuilder(businessLink.message); + MediaDataController.addTextStyleRuns(businessLink.entities, businessLink.message, (Spannable) text); + text = Emoji.replaceEmoji(text, messagePreviewTextView.getPaint().getFontMetricsInt(), false); + MessageObject.replaceAnimatedEmoji(text, businessLink.entities, messagePreviewTextView.getPaint().getFontMetricsInt()); + messagePreviewTextView.setText(text); + + if (businessLink.views == 0) { + clicksCountTextView.setText(formatString(R.string.NoClicks)); + } else { + clicksCountTextView.setText(formatPluralString("Clicks", businessLink.views)); + } + clicksCountTextView.requestLayout(); + + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (needDivider) { + Paint dividerPaint = Theme.getThemePaint(Theme.key_paint_divider, resourcesProvider); + if (dividerPaint == null) + dividerPaint = Theme.dividerPaint; + canvas.drawRect(dp(LocaleController.isRTL ? 0 : 64), getMeasuredHeight() - 1, getWidth() - dp(LocaleController.isRTL ? 64 : 0), getMeasuredHeight(), dividerPaint); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure( + MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(dp(56) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY) + ); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + if (LocaleController.isRTL) { + titleTextView.setPadding(clicksCountTextView.getTextWidth(), 0, 0, 0); + } else { + titleTextView.setPadding(0, 0, clicksCountTextView.getTextWidth(), 0); + } + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessLinksController.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessLinksController.java new file mode 100644 index 000000000..7e604d7cd --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessLinksController.java @@ -0,0 +1,318 @@ +package org.telegram.ui.Business; + +import android.text.TextUtils; + +import org.telegram.SQLite.SQLiteCursor; +import org.telegram.SQLite.SQLiteDatabase; +import org.telegram.SQLite.SQLitePreparedStatement; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.MessagesStorage; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.NativeByteBuffer; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.Components.BulletinFactory; + +import java.util.ArrayList; + +public class BusinessLinksController { + + private static volatile BusinessLinksController[] Instance = new BusinessLinksController[UserConfig.MAX_ACCOUNT_COUNT]; + private static final Object[] lockObjects = new Object[UserConfig.MAX_ACCOUNT_COUNT]; + + static { + for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; i++) { + lockObjects[i] = new Object(); + } + } + + public static BusinessLinksController getInstance(int num) { + BusinessLinksController localInstance = Instance[num]; + if (localInstance == null) { + synchronized (lockObjects[num]) { + localInstance = Instance[num]; + if (localInstance == null) { + Instance[num] = localInstance = new BusinessLinksController(num); + } + } + } + return localInstance; + } + + public final int currentAccount; + + public final ArrayList links = new ArrayList<>(); + + private boolean loading = false; + private boolean loaded = false; + + private BusinessLinksController(int currentAccount) { + this.currentAccount = currentAccount; + } + + public static String stripHttps(String link) { + if (link.startsWith("https://")) { + return link.substring(8); + } + return link; + } + + public boolean canAddNew() { + return links.size() < MessagesController.getInstance(currentAccount).businessChatLinksLimit; + } + + public void load(boolean forceReload) { + if (!loaded) { + load(true, forceReload); + } else if (forceReload) { + load(false, true); + } + } + + private void load(boolean fromCache, boolean forceReload) { + if (loading || loaded && (!forceReload || fromCache)) { + return; + } + + loading = true; + + if (fromCache) { + MessagesStorage storage = MessagesStorage.getInstance(currentAccount); + storage.getStorageQueue().postRunnable(() -> { + final ArrayList result = new ArrayList<>(); + final ArrayList users = new ArrayList<>(); + final ArrayList chats = new ArrayList<>(); + + SQLiteCursor cursor = null; + try { + SQLiteDatabase db = storage.getDatabase(); + cursor = db.queryFinalized("SELECT data FROM business_links ORDER BY order_value ASC"); + while (cursor.next()) { + NativeByteBuffer data = cursor.byteBufferValue(0); + TLRPC.TL_businessChatLink link = TLRPC.TL_businessChatLink.TLdeserialize(data, data.readInt32(false), false); + result.add(link); + } + cursor.dispose(); + + final ArrayList usersToLoad = new ArrayList<>(); + final ArrayList chatsToLoad = new ArrayList<>(); + for (int i = 0; i < result.size(); ++i) { + TLRPC.TL_businessChatLink link = result.get(i); + if (!link.entities.isEmpty()) { + for (int a = 0; a < link.entities.size(); a++) { + TLRPC.MessageEntity entity = link.entities.get(a); + if (entity instanceof TLRPC.TL_messageEntityMentionName) { + usersToLoad.add(((TLRPC.TL_messageEntityMentionName) entity).user_id); + } else if (entity instanceof TLRPC.TL_inputMessageEntityMentionName) { + usersToLoad.add(((TLRPC.TL_inputMessageEntityMentionName) entity).user_id.user_id); + } + } + } + } + if (!usersToLoad.isEmpty()) { + storage.getUsersInternal(TextUtils.join(",", usersToLoad), users); + } + if (!chatsToLoad.isEmpty()) { + storage.getChatsInternal(TextUtils.join(",", chatsToLoad), chats); + } + } catch (Exception e) { + FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + } + + AndroidUtilities.runOnUIThread(() -> { + links.clear(); + links.addAll(result); + MessagesController.getInstance(currentAccount).putUsers(users, true); + MessagesController.getInstance(currentAccount).putChats(chats, true); + + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.quickRepliesUpdated); + loading = false; + load(false, forceReload); + }); + }); + } else { + TLRPC.TL_account_getBusinessChatLinks req = new TLRPC.TL_account_getBusinessChatLinks(); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_account_businessChatLinks) { + TLRPC.TL_account_businessChatLinks businessChatLinks = (TLRPC.TL_account_businessChatLinks) res; + + links.clear(); + links.addAll(businessChatLinks.links); + + MessagesController.getInstance(currentAccount).putUsers(businessChatLinks.users, false); + MessagesController.getInstance(currentAccount).putChats(businessChatLinks.chats, false); + MessagesStorage.getInstance(currentAccount).putUsersAndChats(businessChatLinks.users, businessChatLinks.chats, true, true); + + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.businessLinksUpdated); + + saveToCache(); + } else { + FileLog.e(new RuntimeException("Unexpected response from server!")); + } + + loading = false; + loaded = true; + })); + } + } + + public void createEmptyLink() { + TLRPC.TL_account_createBusinessChatLink req = new TLRPC.TL_account_createBusinessChatLink(); + req.link = new TLRPC.TL_inputBusinessChatLink(); + req.link.message = ""; + + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_businessChatLink) { + TLRPC.TL_businessChatLink businessChatLink = (TLRPC.TL_businessChatLink) res; + links.add(businessChatLink); + + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.businessLinksUpdated); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.businessLinkCreated, businessChatLink); + + saveToCache(); + } + })); + } + + public void deleteLinkUndoable(BaseFragment fragment, String slug) { + TLRPC.TL_businessChatLink link = findLink(slug); + if (link != null) { + int index = links.indexOf(link); + links.remove(link); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.businessLinksUpdated); + + BulletinFactory.of(fragment).createUndoBulletin(LocaleController.getString(R.string.BusinessLinkDeleted), true, + () -> { + links.add(index, link); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.businessLinksUpdated); + }, + () -> { + TLRPC.TL_account_deleteBusinessChatLink req = new TLRPC.TL_account_deleteBusinessChatLink(); + req.slug = slug; + + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_boolTrue) { + if (links.contains(link)) { + links.remove(link); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.businessLinksUpdated); + } + saveToCache(); + } else { + FileLog.e(new RuntimeException("Unexpected response from server!")); + } + })); + }).show(); + } + } + + public void editLinkMessage(String slug, String message, ArrayList entities, Runnable onDone) { + TLRPC.TL_businessChatLink link = findLink(slug); + if (link == null) { + return; + } + + TLRPC.TL_inputBusinessChatLink inputLink = new TLRPC.TL_inputBusinessChatLink(); + inputLink.message = message; + inputLink.entities = entities; + inputLink.title = link.title; + + editLink(link, inputLink, onDone); + } + + public void editLinkTitle(String slug, String title) { + TLRPC.TL_businessChatLink link = findLink(slug); + if (link == null) { + return; + } + + TLRPC.TL_inputBusinessChatLink inputLink = new TLRPC.TL_inputBusinessChatLink(); + inputLink.message = link.message; + inputLink.entities = link.entities; + inputLink.title = title; + + editLink(link, inputLink, null); + } + + private void saveToCache() { + ArrayList linksCopy = new ArrayList<>(links); + + MessagesStorage storage = MessagesStorage.getInstance(currentAccount); + storage.getStorageQueue().postRunnable(() -> { + SQLitePreparedStatement state = null; + try { + SQLiteDatabase db = storage.getDatabase(); + db.executeFast("DELETE FROM business_links").stepThis().dispose(); + state = db.executeFast("REPLACE INTO business_links VALUES(?, ?)"); + for (int i = 0; i < linksCopy.size(); i++) { + TLRPC.TL_businessChatLink link = linksCopy.get(i); + NativeByteBuffer data = new NativeByteBuffer(link.getObjectSize()); + link.serializeToStream(data); + state.requery(); + state.bindByteBuffer(1, data); + state.bindInteger(2, i); + state.step(); + } + } catch (Exception e) { + FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + } + }); + } + + private void editLink(TLRPC.TL_businessChatLink link, TLRPC.TL_inputBusinessChatLink inputLink, Runnable onDone) { + TLRPC.TL_account_editBusinessChatLink req = new TLRPC.TL_account_editBusinessChatLink(); + req.slug = link.link; + + if (!inputLink.entities.isEmpty()) { + inputLink.flags |= 1; + } + if (!TextUtils.isEmpty(inputLink.title)) { + inputLink.flags |= 2; + } + req.link = inputLink; + + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_businessChatLink) { + TLRPC.TL_businessChatLink updatedLink = (TLRPC.TL_businessChatLink) res; + int index = links.indexOf(link); + if (index != -1) { + links.set(index, updatedLink); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.businessLinksUpdated); + + if (onDone != null) { + onDone.run(); + } + + saveToCache(); + } + } + })); + } + + public TLRPC.TL_businessChatLink findLink(String slug) { + for (int i = 0; i < links.size(); i++) { + TLRPC.TL_businessChatLink chatLink = links.get(i); + if (TextUtils.equals(chatLink.link, slug) || + TextUtils.equals(chatLink.link, "https://" + slug) || + TextUtils.equals(chatLink.link, "https://t.me/m/" + slug) || + TextUtils.equals(chatLink.link, "tg://message?slug=" + slug)) { + return chatLink; + } + } + + return null; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessLinksEmptyView.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessLinksEmptyView.java new file mode 100644 index 000000000..5315bd169 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessLinksEmptyView.java @@ -0,0 +1,71 @@ +package org.telegram.ui.Business; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.Typeface; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.LayoutHelper; + +@SuppressLint("ViewConstructor") +public class BusinessLinksEmptyView extends LinearLayout { + + private ImageView imageView; + private TextView descriptionView; + private TextView linkView; + + public BusinessLinksEmptyView(Context context, BaseFragment fragment, TLRPC.TL_businessChatLink businessLink, Theme.ResourcesProvider resourcesProvider) { + super(context); + setOrientation(VERTICAL); + + Theme.getColor(Theme.key_chat_serviceText, resourcesProvider); + Theme.getColor(Theme.key_chat_serviceText); + + imageView = new ImageView(context); + imageView.setScaleType(ImageView.ScaleType.CENTER); + imageView.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)); + imageView.setImageResource(R.drawable.filled_chatlink_large); + addView(imageView, LayoutHelper.createLinear(78, 78, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 17, 17, 17, 9)); + + descriptionView = new TextView(context); + descriptionView.setTextAlignment(TEXT_ALIGNMENT_CENTER); + descriptionView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + descriptionView.setTextColor(Theme.getColor(Theme.key_chat_serviceText, resourcesProvider)); + descriptionView.setGravity(Gravity.CENTER_HORIZONTAL); + descriptionView.setMaxWidth(dp(208)); + descriptionView.setText(AndroidUtilities.replaceTags(LocaleController.getString(R.string.BusinessLinksIntro))); + addView(descriptionView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 17, 0, 17, 9)); + + linkView = new TextView(context); + linkView.setTextAlignment(TEXT_ALIGNMENT_CENTER); + linkView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + linkView.setTextColor(Theme.getColor(Theme.key_chat_serviceText, resourcesProvider)); + linkView.setTypeface(linkView.getTypeface(), Typeface.BOLD); + linkView.setGravity(Gravity.CENTER_HORIZONTAL); + linkView.setMaxWidth(dp(208)); + linkView.setText(BusinessLinksController.stripHttps(businessLink.link)); + linkView.setBackground(Theme.createRadSelectorDrawable(0x1e000000, 0x1e000000, 5, 5)); + linkView.setPadding(AndroidUtilities.dp(7), 0, AndroidUtilities.dp(7), 0); + linkView.setOnClickListener(v -> { + AndroidUtilities.addToClipboard(businessLink.link); + BulletinFactory.of(fragment).createCopyLinkBulletin().show(); + }); + addView(linkView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 17, 0, 17, 17)); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessRecipientsHelper.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessRecipientsHelper.java index 13534bd1e..b41fbf755 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessRecipientsHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessRecipientsHelper.java @@ -33,6 +33,7 @@ public class BusinessRecipientsHelper { public int includeFlags, excludeFlags; public boolean exclude; + public boolean bot; public final ArrayList alwaysShow = new ArrayList<>(); public final ArrayList neverShow = new ArrayList<>(); @@ -48,7 +49,7 @@ public class BusinessRecipientsHelper { } - private TLRPC.TL_businessRecipients currentValue; + private TLRPC.TL_businessBotRecipients currentValue; public boolean hasChanges() { if (currentValue == null) return true; if (currentValue.exclude_selected != exclude) return true; @@ -60,10 +61,58 @@ public class BusinessRecipientsHelper { return true; } } + if (bot && !exclude) { + if (neverShow.size() != currentValue.users.size()) return true; + for (int i = 0; i < neverShow.size(); ++i) { + if (!currentValue.users.contains(neverShow.get(i))) { + return true; + } + } + } return false; } public void setValue(TLRPC.TL_businessRecipients recipients) { + this.bot = false; + if (recipients != null) { + currentValue = new TLRPC.TL_businessBotRecipients(); + currentValue.flags = recipients.flags; + currentValue.existing_chats = recipients.existing_chats; + currentValue.new_chats = recipients.new_chats; + currentValue.contacts = recipients.contacts; + currentValue.non_contacts = recipients.non_contacts; + currentValue.exclude_selected = recipients.exclude_selected; + currentValue.users = recipients.users; + } else { + currentValue = null; + } + if (currentValue == null) { + exclude = true; + excludeFlags = 0; + includeFlags = 0; + alwaysShow.clear(); + neverShow.clear(); + } else { + exclude = currentValue.exclude_selected; + if (exclude) { + includeFlags = 0; + excludeFlags = currentValue.flags &~ (32 | 16); + alwaysShow.clear(); + neverShow.clear(); + neverShow.addAll(currentValue.users); + } else { + includeFlags = currentValue.flags &~ (32 | 16); + excludeFlags = 0; + alwaysShow.clear(); + neverShow.clear(); + alwaysShow.addAll(currentValue.users); + neverShow.addAll(currentValue.exclude_users); + } + } + } + + public void setValue(TLRPC.TL_businessBotRecipients recipients) { + this.bot = true; currentValue = recipients; if (currentValue == null) { exclude = true; @@ -77,12 +126,15 @@ public class BusinessRecipientsHelper { includeFlags = 0; excludeFlags = currentValue.flags &~ (32 | 16); alwaysShow.clear(); + neverShow.clear(); neverShow.addAll(currentValue.users); } else { includeFlags = currentValue.flags &~ (32 | 16); excludeFlags = 0; - alwaysShow.addAll(currentValue.users); + alwaysShow.clear(); neverShow.clear(); + alwaysShow.addAll(currentValue.users); + neverShow.addAll(currentValue.exclude_users); } } } @@ -114,6 +166,47 @@ public class BusinessRecipientsHelper { return value; } + public TLRPC.TL_businessBotRecipients getBotValue() { + TLRPC.TL_businessBotRecipients value = new TLRPC.TL_businessBotRecipients(); + final int flags = getFlags(); + value.flags = flags &~ (32 | 16); + value.existing_chats = (flags & PRIVATE_FLAG_EXISTING_CHATS) != 0; + value.new_chats = (flags & PRIVATE_FLAG_NEW_CHATS) != 0; + value.contacts = (flags & PRIVATE_FLAG_CONTACTS) != 0; + value.non_contacts = (flags & PRIVATE_FLAG_NON_CONTACTS) != 0; + value.exclude_selected = exclude; + ArrayList array = exclude ? neverShow : alwaysShow; + if (!array.isEmpty()) { + final int currentAccount = UserConfig.selectedAccount; + MessagesController controller = MessagesController.getInstance(currentAccount); + + value.flags |= 16; + for (int i = 0; i < array.size(); ++i) { + TLRPC.InputUser inputUser = controller.getInputUser(array.get(i)); + if (inputUser == null) { + FileLog.e("businessRecipientsHelper: user not found " + array.get(i)); + } else { + value.users.add(array.get(i)); + } + } + } + if (!exclude) { + final int currentAccount = UserConfig.selectedAccount; + MessagesController controller = MessagesController.getInstance(currentAccount); + + value.flags |= 64; + for (int i = 0; i < neverShow.size(); ++i) { + TLRPC.InputUser inputUser = controller.getInputUser(neverShow.get(i)); + if (inputUser == null) { + FileLog.e("businessRecipientsHelper: user not found " + neverShow.get(i)); + } else { + value.users.add(neverShow.get(i)); + } + } + } + return value; + } + public TLRPC.TL_inputBusinessRecipients getInputValue() { TLRPC.TL_inputBusinessRecipients value = new TLRPC.TL_inputBusinessRecipients(); final int flags = getFlags(); @@ -141,6 +234,47 @@ public class BusinessRecipientsHelper { return value; } + public TLRPC.TL_inputBusinessBotRecipients getBotInputValue() { + TLRPC.TL_inputBusinessBotRecipients value = new TLRPC.TL_inputBusinessBotRecipients(); + final int flags = getFlags(); + value.flags = flags &~ (32 | 16); + value.existing_chats = (flags & PRIVATE_FLAG_EXISTING_CHATS) != 0; + value.new_chats = (flags & PRIVATE_FLAG_NEW_CHATS) != 0; + value.contacts = (flags & PRIVATE_FLAG_CONTACTS) != 0; + value.non_contacts = (flags & PRIVATE_FLAG_NON_CONTACTS) != 0; + value.exclude_selected = exclude; + ArrayList array = exclude ? neverShow : alwaysShow; + if (!array.isEmpty()) { + final int currentAccount = UserConfig.selectedAccount; + MessagesController controller = MessagesController.getInstance(currentAccount); + + value.flags |= 16; + for (int i = 0; i < array.size(); ++i) { + TLRPC.InputUser inputUser = controller.getInputUser(array.get(i)); + if (inputUser == null) { + FileLog.e("businessRecipientsHelper: user not found " + array.get(i)); + } else { + value.users.add(inputUser); + } + } + } + if (!exclude) { + final int currentAccount = UserConfig.selectedAccount; + MessagesController controller = MessagesController.getInstance(currentAccount); + + value.flags |= 64; + for (int i = 0; i < neverShow.size(); ++i) { + TLRPC.InputUser inputUser = controller.getInputUser(neverShow.get(i)); + if (inputUser == null) { + FileLog.e("businessRecipientsHelper: user not found " + neverShow.get(i)); + } else { + value.exclude_users.add(inputUser); + } + } + } + return value; + } + private int shiftDp = -4; public boolean validate(UniversalRecyclerView listView) { if (!exclude && alwaysShow.isEmpty() && includeFlags == 0) { @@ -182,20 +316,26 @@ public class BusinessRecipientsHelper { items.add(UItem.asButton(BUTTON_EXPAND_INCLUDED, R.drawable.arrow_more, LocaleController.formatPluralString("FilterShowMoreChats", alwaysShow.size() - 5)).accent()); } } - } else { + } + if (bot || exclude) { + if (bot) { + items.add(UItem.asShadow(null)); + } items.add(UItem.asHeader(getString(R.string.BusinessChatsExcluded))); items.add(UItem.asButton(BUTTON_ADD_EXCLUDED, R.drawable.msg2_chats_add, getString(R.string.BusinessChatsExcludedAdd)).accent()); - if ((flags & PRIVATE_FLAG_EXISTING_CHATS) != 0) { - items.add(UItem.asFilterChat(false, getString(R.string.FilterExistingChats), "existing_chats", PRIVATE_FLAG_EXISTING_CHATS)); - } - if ((flags & PRIVATE_FLAG_NEW_CHATS) != 0) { - items.add(UItem.asFilterChat(false, getString(R.string.FilterNewChats), "new_chats", PRIVATE_FLAG_NEW_CHATS)); - } - if ((flags & PRIVATE_FLAG_CONTACTS) != 0) { - items.add(UItem.asFilterChat(false, getString(R.string.FilterContacts), "contacts", PRIVATE_FLAG_CONTACTS)); - } - if ((flags & PRIVATE_FLAG_NON_CONTACTS) != 0) { - items.add(UItem.asFilterChat(false, getString(R.string.FilterNonContacts), "non_contacts", PRIVATE_FLAG_NON_CONTACTS)); + if (!bot || exclude) { + if ((flags & PRIVATE_FLAG_EXISTING_CHATS) != 0) { + items.add(UItem.asFilterChat(false, getString(R.string.FilterExistingChats), "existing_chats", PRIVATE_FLAG_EXISTING_CHATS)); + } + if ((flags & PRIVATE_FLAG_NEW_CHATS) != 0) { + items.add(UItem.asFilterChat(false, getString(R.string.FilterNewChats), "new_chats", PRIVATE_FLAG_NEW_CHATS)); + } + if ((flags & PRIVATE_FLAG_CONTACTS) != 0) { + items.add(UItem.asFilterChat(false, getString(R.string.FilterContacts), "contacts", PRIVATE_FLAG_CONTACTS)); + } + if ((flags & PRIVATE_FLAG_NON_CONTACTS) != 0) { + items.add(UItem.asFilterChat(false, getString(R.string.FilterNonContacts), "non_contacts", PRIVATE_FLAG_NON_CONTACTS)); + } } if (!neverShow.isEmpty()) { int count = excludeExpanded || neverShow.size() < 8 ? neverShow.size() : Math.min(5, neverShow.size()); @@ -223,21 +363,22 @@ public class BusinessRecipientsHelper { return true; } else if (item.viewType == UniversalAdapter.VIEW_TYPE_FILTER_CHAT) { if (fragment == null) return false; + final boolean include = item.include; final int flag = item.chatType == null ? 0 : getFlag(item.chatType); final String name = flag == 0 ? fragment.getMessagesController().getPeerName(item.dialogId) : getFlagName(flag); fragment.showDialog( new AlertDialog.Builder(fragment.getContext(), fragment.getResourceProvider()) - .setTitle(getString(exclude ? R.string.BusinessRecipientsRemoveExcludeTitle : R.string.BusinessRecipientsRemoveIncludeTitle)) - .setMessage(formatString(exclude ? R.string.BusinessRecipientsRemoveExcludeMessage : R.string.BusinessRecipientsRemoveIncludeMessage, name)) + .setTitle(getString(!include ? R.string.BusinessRecipientsRemoveExcludeTitle : R.string.BusinessRecipientsRemoveIncludeTitle)) + .setMessage(formatString(!include ? R.string.BusinessRecipientsRemoveExcludeMessage : R.string.BusinessRecipientsRemoveIncludeMessage, name)) .setPositiveButton(getString(R.string.Remove), (di, w) -> { if (flag != 0) { - if (exclude) { + if (!include) { excludeFlags &=~ flag; } else { includeFlags &=~ flag; } } else { - (exclude ? neverShow : alwaysShow).remove(item.dialogId); + (!include ? neverShow : alwaysShow).remove(item.dialogId); } update.run(); }) @@ -282,7 +423,7 @@ public class BusinessRecipientsHelper { private void selectChatsFor(boolean include) { ArrayList arrayList = include ? alwaysShow : neverShow; UsersSelectActivity fragment = new UsersSelectActivity(include, arrayList, getFlags()).asPrivateChats(); - fragment.noChatTypes = false; + fragment.noChatTypes = bot && !exclude && !include; fragment.allowSelf = false; fragment.doNotNewChats = !include && doNotExcludeNewChats; fragment.setDelegate((ids, flags) -> { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/ChatAttachAlertQuickRepliesLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/ChatAttachAlertQuickRepliesLayout.java index 0bbf27258..86223beb0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/ChatAttachAlertQuickRepliesLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/ChatAttachAlertQuickRepliesLayout.java @@ -6,7 +6,6 @@ import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Canvas; -import android.net.Uri; import android.os.Build; import android.text.TextUtils; import android.view.Gravity; @@ -29,8 +28,6 @@ import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; import org.telegram.messenger.Utilities; -import org.telegram.messenger.support.LongSparseIntArray; -import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.SimpleTextView; @@ -47,13 +44,9 @@ import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.CheckBox2; import org.telegram.ui.Components.AvatarDrawable; -import org.telegram.ui.Components.PhonebookShareAlert; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; -import java.util.Locale; -import java.util.Objects; public class ChatAttachAlertQuickRepliesLayout extends ChatAttachAlert.AttachAlertLayout implements NotificationCenter.NotificationCenterDelegate { @@ -365,7 +358,7 @@ public class ChatAttachAlertQuickRepliesLayout extends ChatAttachAlert.AttachAle // } } }; - NotificationCenter.getInstance(UserConfig.selectedAccount).listen(listView, NotificationCenter.emojiLoaded, args -> { + NotificationCenter.getInstance(UserConfig.selectedAccount).listenGlobal(listView, NotificationCenter.emojiLoaded, args -> { AndroidUtilities.forEachViews(listView, view -> { if (view instanceof QuickRepliesActivity.QuickReplyView) { ((QuickRepliesActivity.QuickReplyView) view).invalidateEmojis(); @@ -414,16 +407,11 @@ public class ChatAttachAlertQuickRepliesLayout extends ChatAttachAlert.AttachAle object = listAdapter.getItem(section, row); } if (object instanceof QuickRepliesController.QuickReply) { - final int currentAccount = UserConfig.selectedAccount; - TLRPC.TL_messages_sendQuickReplyMessages req = new TLRPC.TL_messages_sendQuickReplyMessages(); long dialogId; if (parentAlert.baseFragment instanceof ChatActivityInterface) { dialogId = ((ChatActivityInterface) parentAlert.baseFragment).getDialogId(); } else return; - req.peer = MessagesController.getInstance(currentAccount).getInputPeer(dialogId); - if (req.peer == null) return; - req.shortcut_id = ((QuickRepliesController.QuickReply) object).id; - ConnectionsManager.getInstance(currentAccount).sendRequest(req, null); + QuickRepliesController.getInstance(UserConfig.selectedAccount).sendQuickReplyTo(dialogId, (QuickRepliesController.QuickReply) object); parentAlert.dismiss(); } }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/ChatbotsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/ChatbotsActivity.java index db2409d88..c7a0792a0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/ChatbotsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/ChatbotsActivity.java @@ -224,7 +224,7 @@ public class ChatbotsActivity extends BaseFragment { }); recipientsHelper.setValue(currentBot == null ? null : currentBot.recipients); - listView = new UniversalRecyclerView(context, currentAccount, this::fillItems, this::onClick, null, getResourceProvider()); + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, null); contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); return fragmentView = contentView; @@ -351,7 +351,19 @@ public class ChatbotsActivity extends BaseFragment { listView.adapter.update(true); checkDone(true); } else if (item.viewType == UniversalAdapter.VIEW_TYPE_USER_ADD) { - selectedBot = foundBots.get(item.dialogId); + TLRPC.User bot = foundBots.get(item.dialogId); + if (bot == null) return; + if (!bot.bot_business) { + showDialog( + new AlertDialog.Builder(getContext(), resourceProvider) + .setTitle(getString(R.string.BusinessBotNotSupportedTitle)) + .setMessage(AndroidUtilities.replaceTags(getString(R.string.BusinessBotNotSupportedMessage))) + .setPositiveButton(getString(R.string.OK), null) + .create() + ); + return; + } + selectedBot = bot; AndroidUtilities.hideKeyboard(editText); listView.adapter.update(true); checkDone(true); @@ -376,35 +388,55 @@ public class ChatbotsActivity extends BaseFragment { return; } - TLRPC.TL_account_updateConnectedBot req = new TLRPC.TL_account_updateConnectedBot(); - if (selectedBot == null) { + ArrayList requests = new ArrayList<>(); + + if (currentBot != null && (selectedBot == null || currentBot.bot_id != selectedBot.id)) { + TLRPC.TL_account_updateConnectedBot req = new TLRPC.TL_account_updateConnectedBot(); req.deleted = true; - req.bot = new TLRPC.TL_inputUserEmpty(); - req.recipients = new TLRPC.TL_inputBusinessRecipients(); - } else { + req.bot = getMessagesController().getInputUser(currentBot.bot_id); + req.recipients = new TLRPC.TL_inputBusinessBotRecipients(); + requests.add(req); + } + + if (selectedBot != null) { + TLRPC.TL_account_updateConnectedBot req = new TLRPC.TL_account_updateConnectedBot(); + req.deleted = false; req.can_reply = allowReply; req.bot = getMessagesController().getInputUser(selectedBot); - req.recipients = recipientsHelper.getInputValue(); + req.recipients = recipientsHelper.getBotInputValue(); + requests.add(req); if (currentBot != null) { - currentBot.can_reply = allowReply; currentBot.bot_id = selectedBot.id; - currentBot.recipients = recipientsHelper.getValue(); + currentBot.recipients = recipientsHelper.getBotValue(); + currentBot.can_reply = allowReply; } } - getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { - if (res instanceof TLRPC.Updates) { - getMessagesController().processUpdates((TLRPC.Updates) res, false); - } - if (err != null) { - doneButtonDrawable.animateToProgress(0f); - BulletinFactory.showError(err); - } else { - BusinessChatbotController.getInstance(currentAccount).invalidate(); - finishFragment(); - } - })); + if (requests.isEmpty()) { + finishFragment(); + return; + } + + final int[] requestsReceived = new int[] { 0 }; + for (int i = 0; i < requests.size(); ++i) { + getConnectionsManager().sendRequest(requests.get(i), (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (err != null) { + doneButtonDrawable.animateToProgress(0f); + BulletinFactory.showError(err); + } else if (res instanceof TLRPC.TL_boolFalse) { + doneButtonDrawable.animateToProgress(0f); + BulletinFactory.of(this).createErrorBulletin(LocaleController.getString(R.string.UnknownError)).show(); + } else { + requestsReceived[0]++; + if (requestsReceived[0] == requests.size()) { + BusinessChatbotController.getInstance(currentAccount).invalidate(true); + getMessagesController().clearFullUsers(); + finishFragment(); + } + } + })); + } } private boolean loading; @@ -432,6 +464,7 @@ public class ChatbotsActivity extends BaseFragment { public boolean hasChanges() { if (!valueSet) return false; if ((selectedBot != null) != (currentBot != null)) return true; + if ((selectedBot == null ? 0 : selectedBot.id) != (currentBot == null ? 0 : currentBot.bot_id)) return true; if (selectedBot != null) { if (allowReply != currentBot.can_reply) { return true; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/GreetMessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/GreetMessagesActivity.java index db5e2c845..2002463aa 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/GreetMessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/GreetMessagesActivity.java @@ -90,7 +90,7 @@ public class GreetMessagesActivity extends BaseFragment implements NotificationC recipientsHelper.doNotExcludeNewChats(); recipientsHelper.setValue(currentValue == null ? null : currentValue.recipients); - listView = new UniversalRecyclerView(context, currentAccount, this::fillItems, this::onClick, null, getResourceProvider()); + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, null); contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); setValue(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/LocationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/LocationActivity.java index e287f5179..f4781a2aa 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/LocationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/LocationActivity.java @@ -33,6 +33,7 @@ import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BotWebViewVibrationEffect; import org.telegram.messenger.DocumentObject; import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; import org.telegram.messenger.NotificationCenter; @@ -40,6 +41,7 @@ import org.telegram.messenger.R; import org.telegram.messenger.SvgHelper; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; +import org.telegram.messenger.WebFile; import org.telegram.tgnet.TLRPC; import org.telegram.tgnet.tl.TL_stories; import org.telegram.ui.ActionBar.ActionBar; @@ -116,8 +118,6 @@ public class LocationActivity extends BaseFragment implements NotificationCenter FrameLayout contentView = new FrameLayout(context); contentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); - LinearLayout content = new LinearLayout(getContext()); - content.setOrientation(LinearLayout.HORIZONTAL); editText = new EditTextBoldCursor(getContext()) { AnimatedColor limitColor = new AnimatedColor(this); private int limitCount; @@ -194,8 +194,10 @@ public class LocationActivity extends BaseFragment implements NotificationCenter editTextContainer.addView(editText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP, 21, 15, 21, 15)); editTextContainer.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); if (editText != null) { + ignoreEditText = true; editText.setText(address); editText.setSelection(editText.getText().length()); + ignoreEditText = false; } // mapLoadingDrawable = new LoadingDrawable(resourceProvider); @@ -261,7 +263,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter mapPreviewContainer.addView(mapMarker, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 0, -31, 0, 0)); updateMapPreview(); - listView = new UniversalRecyclerView(context, currentAccount, this::fillItems, this::onClick, null, getResourceProvider()); + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, null); contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); setValue(); @@ -309,8 +311,10 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } if (editText != null) { + ignoreEditText = true; editText.setText(address); editText.setSelection(editText.getText().length()); + ignoreEditText = false; } updateMapPreview(); if (listView != null && listView.adapter != null) { @@ -326,8 +330,8 @@ public class LocationActivity extends BaseFragment implements NotificationCenter mapMarker.setTranslationY(-dp(12)); final int w = (int) ((mapPreview.getMeasuredWidth() <= 0 ? AndroidUtilities.displaySize.x : mapPreview.getMeasuredWidth()) / AndroidUtilities.density); final int h = 240; - String url = AndroidUtilities.formapMapUrl(currentAccount, geo.lat, geo._long, w, h, false, 15, -1); - mapPreview.setImage(url, w + "_" + h, mapLoadingDrawable); + final int scale = Math.min(2, (int) Math.ceil(AndroidUtilities.density)); + mapPreview.setImage(ImageLocation.getForWebFile(WebFile.createWithGeoPoint(geo.lat, geo._long, 0, scale * w, scale * h, 15, scale)), w + "_" + h, mapLoadingDrawable, 0, null); } else { mapPreview.setImageBitmap(null); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/OpeningHoursActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/OpeningHoursActivity.java index 2234e20f8..cb5bb00af 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/OpeningHoursActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/OpeningHoursActivity.java @@ -89,7 +89,7 @@ public class OpeningHoursActivity extends BaseFragment implements NotificationCe FrameLayout contentView = new FrameLayout(context); contentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); - listView = new UniversalRecyclerView(context, currentAccount, this::fillItems, this::onClick, null, getResourceProvider()); + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, null); contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); setValue(); @@ -184,6 +184,9 @@ public class OpeningHoursActivity extends BaseFragment implements NotificationCe value = new ArrayList[7]; for (int i = 0; i < value.length; ++i) { value[i] = new ArrayList<>(); + if (i >= 0 && i < 5) { + value[i].add(new Period(0, 24 * 60 - 1)); + } } } @@ -426,6 +429,17 @@ public class OpeningHoursActivity extends BaseFragment implements NotificationCe } } + public static boolean is24x7(TLRPC.TL_businessWorkHours hours) { + if (hours == null || hours.weekly_open.isEmpty()) return false; + int last = 0; + for (int i = 0; i < hours.weekly_open.size(); ++i) { + TLRPC.TL_businessWeeklyOpen period = hours.weekly_open.get(i); + if (period.start_minute > last + 1) return false; + last = period.end_minute; + } + return last >= 24 * 60 * 7 - 1; + } + public static boolean isFull(ArrayList periods) { if (periods == null || periods.isEmpty()) return false; int lastTime = 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/OpeningHoursDayActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/OpeningHoursDayActivity.java index cd9315403..dfe41aafe 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/OpeningHoursDayActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/OpeningHoursDayActivity.java @@ -89,7 +89,7 @@ public class OpeningHoursDayActivity extends BaseFragment { FrameLayout contentView = new FrameLayout(context); contentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); - listView = new UniversalRecyclerView(context, currentAccount, this::fillItems, this::onClick, null, getResourceProvider()); + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, null); contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); return fragmentView = contentView; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/ProfileHoursCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/ProfileHoursCell.java index 6355aeed2..04038a42a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/ProfileHoursCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/ProfileHoursCell.java @@ -122,10 +122,10 @@ public class ProfileHoursCell extends LinearLayout { switchText = new ClickableAnimatedTextView(context); switchText.getDrawable().updateAll = true; switchText.setTextSize(dp(13)); - switchText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider)); switchText.setPadding(dp(6), 0, dp(6), 0); switchText.setGravity(LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT); - switchText.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(8), Theme.multAlpha(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider), .10f), Theme.multAlpha(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider), .22f))); + switchText.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(8), Theme.multAlpha(processColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider)), .10f), Theme.multAlpha(processColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider)), .22f))); + switchText.setTextColor(processColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider))); switchText.getDrawable().setScaleProperty(.6f); switchText.setVisibility(View.GONE); todayTimeTextContainer2.addView(switchText, LayoutHelper.createLinearRelatively(LayoutHelper.MATCH_PARENT, 17, Gravity.END, 0, 4, 20 - 2, 0)); @@ -169,6 +169,15 @@ public class ProfileHoursCell extends LinearLayout { setWillNotDraw(false); } + protected int processColor(int color) { + return color; + } + + public void updateColors() { + switchText.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(8), Theme.multAlpha(processColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider)), .10f), Theme.multAlpha(processColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider)), .22f))); + switchText.setTextColor(processColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider))); + } + public void setOnTimezoneSwitchClick(View.OnClickListener onClickListener) { if (switchText != null) { switchText.setOnClickListener(onClickListener); @@ -184,6 +193,13 @@ public class ProfileHoursCell extends LinearLayout { if (value == null) return; + final boolean is24x7 = OpeningHoursActivity.is24x7(value); + if (is24x7) { + this.expanded = expanded = false; + } + arrowView.setVisibility(is24x7 ? View.GONE : View.VISIBLE); + todayTimeTextContainer2.setTranslationX(is24x7 ? dp(11) : 0); + TimezonesController timezonesController = TimezonesController.getInstance(UserConfig.selectedAccount); TLRPC.TL_timezone timezone = timezonesController.findTimezone(value.timezone_id); @@ -191,7 +207,7 @@ public class ProfileHoursCell extends LinearLayout { int currentUtcOffset = calendar.getTimeZone().getRawOffset() / 1000; int valueUtcOffset = timezone == null ? 0 : timezone.utc_offset; int utcOffset = (currentUtcOffset - valueUtcOffset) / 60; - switchText.setVisibility(utcOffset != 0 ? View.VISIBLE : View.GONE); + switchText.setVisibility(utcOffset != 0 && !is24x7 ? View.VISIBLE : View.GONE); if (utcOffset == 0) showInMyTimezone = false; invalidate(); @@ -294,7 +310,9 @@ public class ProfileHoursCell extends LinearLayout { } } } else { - if (days[weekday].isEmpty()) { + if (is24x7) { + textView.setText(getString(R.string.BusinessHoursProfileFullOpen)); + } else if (days[weekday].isEmpty()) { textView.setText(getString(R.string.BusinessHoursProfileClose)); } else if (OpeningHoursActivity.isFull(days[weekday])) { textView.setText(getString(R.string.BusinessHoursProfileOpen)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/ProfileLocationCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/ProfileLocationCell.java index 9980cc9cc..b2997ec47 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/ProfileLocationCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/ProfileLocationCell.java @@ -21,10 +21,12 @@ import androidx.annotation.NonNull; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.BuildVars; import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; +import org.telegram.messenger.WebFile; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.AvatarDrawable; @@ -55,6 +57,7 @@ public class ProfileLocationCell extends LinearLayout { Theme.multAlpha(color, .1f), Theme.multAlpha(color, .3f) ); + thumbDrawable.setRadiiDp(4); thumbDrawable.strokePaint.setStrokeWidth(dp(1)); imageReceiver.setRoundRadius(dp(4)); @@ -85,7 +88,8 @@ public class ProfileLocationCell extends LinearLayout { if (value != null) { textView1.setText(value.address); if (value.geo_point != null) { - imageReceiver.setImage(AndroidUtilities.formapMapUrl(UserConfig.selectedAccount, value.geo_point.lat, value.geo_point._long, dp(44), dp(44), false, 15, -1), "44_44", thumbDrawable, null, 0); + final int scale = Math.min(2, (int) Math.ceil(AndroidUtilities.density)); + imageReceiver.setImage(ImageLocation.getForWebFile(WebFile.createWithGeoPoint(value.geo_point, dp(44), dp(44), 15, scale)), "44_44", thumbDrawable, 0, null, null, 0); } else { imageReceiver.setImageBitmap((Drawable) null); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesActivity.java index d23a23d54..8ded36960 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesActivity.java @@ -156,7 +156,7 @@ public class QuickRepliesActivity extends BaseFragment implements NotificationCe }; contentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); - listView = new UniversalRecyclerView(context, currentAccount, this::fillItems, this::onClick, this::onLongClick, getResourceProvider()); + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, this::onLongClick); listView.listenReorder(this::whenReordered); contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesController.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesController.java index cefd2c291..a68314255 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesController.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesController.java @@ -19,6 +19,7 @@ import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.NativeByteBuffer; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.ChatActivityInterface; import java.util.ArrayList; import java.util.Collections; @@ -185,8 +186,8 @@ public class QuickRepliesController { AndroidUtilities.runOnUIThread(() -> { loading = false; - MessagesController.getInstance(currentAccount).putUsers(users, false); - MessagesController.getInstance(currentAccount).putChats(chats, false); + MessagesController.getInstance(currentAccount).putUsers(users, true); + MessagesController.getInstance(currentAccount).putChats(chats, true); replies.clear(); replies.addAll(result); if (whenLoaded != null) { @@ -534,8 +535,8 @@ public class QuickRepliesController { } final MessageObject finalMessageObject = messageObject; AndroidUtilities.runOnUIThread(() -> { - MessagesController.getInstance(currentAccount).putUsers(users, false); - MessagesController.getInstance(currentAccount).putChats(chats, false); + MessagesController.getInstance(currentAccount).putUsers(users, true); + MessagesController.getInstance(currentAccount).putChats(chats, true); reply.topMessage = finalMessageObject; if (reply.topMessage != null) { reply.topMessage.applyQuickReply(reply.name, reply.id); @@ -572,7 +573,7 @@ public class QuickRepliesController { } newReply.topMessage.applyQuickReply(quick_reply_shortcut, quick_reply_shortcut_id); newReply.messagesCount = 1; - replies.add(0, newReply); + replies.add(newReply); updateOrder(); addReply(newReply); } else if (reply.topMessageId == message.id) { @@ -652,7 +653,7 @@ public class QuickRepliesController { quickReply.messagesCount = tlreply.count; quickReply.topMessageId = tlreply.top_message; updateOrder(); - replies.add(0, quickReply); + replies.add(quickReply); deleteLocalReply(quickReply.name); } saveToCache(); @@ -765,4 +766,60 @@ public class QuickRepliesController { return !replies.isEmpty(); } + public void sendQuickReplyTo(long dialogId, QuickRepliesController.QuickReply reply) { + if (reply == null) return; + + TLRPC.TL_messages_sendQuickReplyMessages req = new TLRPC.TL_messages_sendQuickReplyMessages(); + req.peer = MessagesController.getInstance(currentAccount).getInputPeer(dialogId); + if (req.peer == null) return; + req.shortcut_id = reply.id; + + MessagesStorage storage = MessagesStorage.getInstance(currentAccount); + storage.getStorageQueue().postRunnable(() -> { + ArrayList ids = new ArrayList<>(); + SQLiteCursor cursor = null; + try { + cursor = storage.getDatabase().queryFinalized("SELECT id FROM quick_replies_messages WHERE topic_id = ?", reply.id); + while (cursor.next()) { + ids.add(cursor.intValue(0)); + } + } catch (Exception e) { + FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + } + AndroidUtilities.runOnUIThread(() -> { + if (ids.isEmpty() || ids.size() < reply.getMessagesCount()) { + TLRPC.TL_messages_getQuickReplyMessages req2 = new TLRPC.TL_messages_getQuickReplyMessages(); + req2.shortcut_id = reply.id; + ConnectionsManager.getInstance(currentAccount).sendRequest(req2, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_messages_messages) { + ArrayList messages = ((TLRPC.TL_messages_messages) res).messages; + ids.clear(); + for (TLRPC.Message m : messages) { + ids.add(m.id); + } + + req.id = ids; + for (int i = 0; i < ids.size(); ++i) { + req.random_id.add(Utilities.random.nextLong()); + } + ConnectionsManager.getInstance(currentAccount).sendRequest(req2, null); + } else { + FileLog.e("received " + res + " " + err + " on getQuickReplyMessages when trying to send quick reply"); + } + })); + } else { + req.id = ids; + for (int i = 0; i < ids.size(); ++i) { + req.random_id.add(Utilities.random.nextLong()); + } + ConnectionsManager.getInstance(currentAccount).sendRequest(req, null); + } + }); + }); + } + } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessChatEmptyView.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesEmptyView.java similarity index 84% rename from TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessChatEmptyView.java rename to TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesEmptyView.java index 516453192..92f9fbdcf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/BusinessChatEmptyView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/QuickRepliesEmptyView.java @@ -5,51 +5,25 @@ import static org.telegram.messenger.AndroidUtilities.dp; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; -import android.text.Layout; import android.util.TypedValue; import android.view.Gravity; -import android.view.MotionEvent; -import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.ContactsController; -import org.telegram.messenger.DocumentObject; -import org.telegram.messenger.FileLoader; -import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; -import org.telegram.messenger.MediaDataController; -import org.telegram.messenger.MessageObject; -import org.telegram.messenger.MessagesController; import org.telegram.messenger.R; -import org.telegram.messenger.SvgHelper; import org.telegram.messenger.UserConfig; -import org.telegram.messenger.UserObject; -import org.telegram.tgnet.ConnectionsManager; -import org.telegram.tgnet.TLRPC; -import org.telegram.ui.ActionBar.BaseFragment; -import org.telegram.ui.ActionBar.BottomSheet; -import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; import org.telegram.ui.Components.LayoutHelper; -import org.telegram.ui.Components.Premium.PremiumButtonView; -import org.telegram.ui.Components.Premium.StarParticlesView; import org.telegram.ui.Components.RLottieImageView; -import org.telegram.ui.LaunchActivity; -import org.telegram.ui.PremiumPreviewFragment; -import org.telegram.ui.Stories.recorder.ButtonWithCounterView; import org.telegram.ui.Stories.recorder.HintView2; -import java.util.Locale; - -public class BusinessChatEmptyView extends LinearLayout { +public class QuickRepliesEmptyView extends LinearLayout { private TextView titleView; private TextView descriptionView, descriptionView2; @@ -71,7 +45,7 @@ public class BusinessChatEmptyView extends LinearLayout { } } - public BusinessChatEmptyView(Context context, int chatMode, long type, long topic_id, String quickReplyName, Theme.ResourcesProvider resourcesProvider) { + public QuickRepliesEmptyView(Context context, int chatMode, long type, long topic_id, String quickReplyName, Theme.ResourcesProvider resourcesProvider) { super(context); setOrientation(VERTICAL); this.resourcesProvider = resourcesProvider; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Business/TimezoneSelector.java b/TMessagesProj/src/main/java/org/telegram/ui/Business/TimezoneSelector.java index 99858a160..beab8c183 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Business/TimezoneSelector.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Business/TimezoneSelector.java @@ -89,7 +89,7 @@ public class TimezoneSelector extends BaseFragment implements NotificationCenter FrameLayout contentView = new FrameLayout(context); contentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); - listView = new UniversalRecyclerView(context, currentAccount, this::fillItems, this::onClick, null, getResourceProvider()); + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, null); contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); listView.setOnScrollListener(new RecyclerView.OnScrollListener() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java index c778b81c8..0acd125d1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CameraScanActivity.java @@ -1,5 +1,7 @@ package org.telegram.ui; +import static org.telegram.messenger.AndroidUtilities.dp; + import android.Manifest; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -21,6 +23,7 @@ import android.graphics.ImageFormat; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; +import android.graphics.PointF; import android.graphics.RectF; import android.graphics.Typeface; import android.graphics.drawable.ShapeDrawable; @@ -116,8 +119,21 @@ public class CameraScanActivity extends BaseFragment { private SpringAnimation qrAppearing = null; private float qrAppearingValue = 0; - private RectF fromBounds = new RectF(); - private RectF bounds = new RectF(); + private final PointF[] fromPoints = new PointF[4]; + private final PointF[] points = new PointF[4]; + private final PointF[] tmpPoints = new PointF[4]; + private final PointF[] tmp2Points = new PointF[4]; + { + for (int i = 0; i < 4; ++i) { + fromPoints[i] = new PointF(-1, -1); + points[i] = new PointF(-1, -1); + tmpPoints[i] = new PointF(-1, -1); + tmp2Points[i] = new PointF(-1, -1); + } + } + + private final RectF fromBounds = new RectF(); + private final RectF bounds = new RectF(); private long lastBoundsUpdate = 0; private final long boundsUpdateDuration = 75; @@ -316,13 +332,13 @@ public class CameraScanActivity extends BaseFragment { } recognizedMrzView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.UNSPECIFIED)); if (galleryButton != null) { - galleryButton.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(60), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(60), MeasureSpec.EXACTLY)); + galleryButton.measure(MeasureSpec.makeMeasureSpec(dp(60), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(60), MeasureSpec.EXACTLY)); } - flashButton.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(60), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(60), MeasureSpec.EXACTLY)); + flashButton.measure(MeasureSpec.makeMeasureSpec(dp(60), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(60), MeasureSpec.EXACTLY)); } - titleTextView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(72), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.UNSPECIFIED)); + titleTextView.measure(MeasureSpec.makeMeasureSpec(width - dp(72), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.UNSPECIFIED)); if (currentType == TYPE_QR_WEB_BOT) { - descriptionText.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(72), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.UNSPECIFIED)); + descriptionText.measure(MeasureSpec.makeMeasureSpec(width - dp(72), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.UNSPECIFIED)); } else { descriptionText.measure(MeasureSpec.makeMeasureSpec((int) (width * 0.9f), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.UNSPECIFIED)); } @@ -343,7 +359,7 @@ public class CameraScanActivity extends BaseFragment { recognizedMrzView.setTextSize(TypedValue.COMPLEX_UNIT_PX, height / 22); recognizedMrzView.setPadding(0, 0, 0, height / 15); y = (int) (height * 0.65f); - titleTextView.layout(AndroidUtilities.dp(36), y, AndroidUtilities.dp(36) + titleTextView.getMeasuredWidth(), y + titleTextView.getMeasuredHeight()); + titleTextView.layout(dp(36), y, dp(36) + titleTextView.getMeasuredWidth(), y + titleTextView.getMeasuredHeight()); } else { actionBar.layout(0, 0, actionBar.getMeasuredWidth(), actionBar.getMeasuredHeight()); if (cameraView != null) { @@ -351,28 +367,28 @@ public class CameraScanActivity extends BaseFragment { } int size = (int) (Math.min(width, height) / 1.5f); if (currentType == TYPE_QR) { - y = (height - size) / 2 - titleTextView.getMeasuredHeight() - AndroidUtilities.dp(30); + y = (height - size) / 2 - titleTextView.getMeasuredHeight() - dp(30); } else { - y = (height - size) / 2 - titleTextView.getMeasuredHeight() - AndroidUtilities.dp(64); + y = (height - size) / 2 - titleTextView.getMeasuredHeight() - dp(64); } - titleTextView.layout(AndroidUtilities.dp(36), y, AndroidUtilities.dp(36) + titleTextView.getMeasuredWidth(), y + titleTextView.getMeasuredHeight()); + titleTextView.layout(dp(36), y, dp(36) + titleTextView.getMeasuredWidth(), y + titleTextView.getMeasuredHeight()); if (currentType == TYPE_QR_WEB_BOT) { - y += titleTextView.getMeasuredHeight() + AndroidUtilities.dp(8); - descriptionText.layout(AndroidUtilities.dp(36), y, AndroidUtilities.dp(36) + descriptionText.getMeasuredWidth(), y + descriptionText.getMeasuredHeight()); + y += titleTextView.getMeasuredHeight() + dp(8); + descriptionText.layout(dp(36), y, dp(36) + descriptionText.getMeasuredWidth(), y + descriptionText.getMeasuredHeight()); } recognizedMrzView.layout(0, getMeasuredHeight() - recognizedMrzView.getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight()); int x; if (needGalleryButton) { - x = width / 2 + AndroidUtilities.dp(35); + x = width / 2 + dp(35); } else { x = width / 2 - flashButton.getMeasuredWidth() / 2; } - y = (height - size) / 2 + size + AndroidUtilities.dp(80); + y = (height - size) / 2 + size + dp(80); flashButton.layout(x, y, x + flashButton.getMeasuredWidth(), y + flashButton.getMeasuredHeight()); if (galleryButton != null) { - x = width / 2 - AndroidUtilities.dp(35) - galleryButton.getMeasuredWidth(); + x = width / 2 - dp(35) - galleryButton.getMeasuredWidth(); galleryButton.layout(x, y, x + galleryButton.getMeasuredWidth(), y + galleryButton.getMeasuredHeight()); } } @@ -386,6 +402,8 @@ public class CameraScanActivity extends BaseFragment { updateNormalBounds(); } + Path path = new Path(); + @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { boolean result = super.drawChild(canvas, child, drawingTime); @@ -396,6 +414,17 @@ public class CameraScanActivity extends BaseFragment { cx = (int) (child.getWidth() * bounds.centerX()), cy = (int) (child.getHeight() * bounds.centerY()); +// PointF[] points = getPoints(); +// path.rewind(); +// for (int i = 0; i < points.length; ++i) { +// float x = child.getWidth() * points[i].x; +// float y = child.getHeight() * points[i].y; +// if (i == 0) path.moveTo(x, y); +// else path.lineTo(x, y); +// } +// Theme.DEBUG_RED.setAlpha(40); +// canvas.drawPath(path, Theme.DEBUG_RED); + sizex *= (.5f + qrAppearingValue * .5f); sizey *= (.5f + qrAppearingValue * .5f); int x = cx - sizex / 2, @@ -409,9 +438,9 @@ public class CameraScanActivity extends BaseFragment { paint.setAlpha((int) (255 * Math.max(0, 1f - qrAppearingValue))); canvas.drawRect(x, y, x + sizex, y + sizey, paint); - final int lineWidth = AndroidUtilities.lerp(0, AndroidUtilities.dp(4), Math.min(1, qrAppearingValue * 20f)), + final int lineWidth = AndroidUtilities.lerp(0, dp(4), Math.min(1, qrAppearingValue * 20f)), halfLineWidth = lineWidth / 2; - final int lineLength = AndroidUtilities.lerp(Math.min(sizex, sizey), AndroidUtilities.dp(20), Math.min(1.2f, (float) Math.pow(qrAppearingValue, 1.8f))); + final int lineLength = AndroidUtilities.lerp(Math.min(sizex, sizey), dp(20), Math.min(1.2f, (float) Math.pow(qrAppearingValue, 1.8f))); cornerPaint.setAlpha((int) (255 * Math.min(1, qrAppearingValue))); @@ -505,7 +534,7 @@ public class CameraScanActivity extends BaseFragment { int end = spanned.getSpanEnd(innerSpans[a]); textPath.setCurrentLayout(getLayout(), start, 0); int shift = getText() != null ? getPaint().baselineShift : 0; - textPath.setBaselineShift(shift != 0 ? shift + AndroidUtilities.dp(shift > 0 ? 5 : -2) : 0); + textPath.setBaselineShift(shift != 0 ? shift + dp(shift > 0 ? 5 : -2) : 0); getLayout().getSelectionPath(start, end, textPath); } textPath.setAllowReset(true); @@ -622,7 +651,7 @@ public class CameraScanActivity extends BaseFragment { titleTextView.setLinkTextColor(0xffffffff); titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - titleTextView.setLineSpacing(AndroidUtilities.dp(2), 1.0f); + titleTextView.setLineSpacing(dp(2), 1.0f); titleTextView.setPadding(0, 0, 0, 0); titleTextView.setText(spanned); } @@ -632,7 +661,7 @@ public class CameraScanActivity extends BaseFragment { descriptionText.setTextColor(0x99ffffff); } recognizedMrzView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - recognizedMrzView.setPadding(AndroidUtilities.dp(10), 0, AndroidUtilities.dp(10), AndroidUtilities.dp(10)); + recognizedMrzView.setPadding(dp(10), 0, dp(10), dp(10)); if (needGalleryButton) { //recognizedMrzView.setText(LocaleController.getString("WalletScanCodeNotFound", R.string.WalletScanCodeNotFound)); } else { @@ -644,7 +673,7 @@ public class CameraScanActivity extends BaseFragment { galleryButton = new ImageView(context); galleryButton.setScaleType(ImageView.ScaleType.CENTER); galleryButton.setImageResource(R.drawable.qr_gallery); - galleryButton.setBackgroundDrawable(Theme.createSelectorDrawableFromDrawables(Theme.createCircleDrawable(AndroidUtilities.dp(60), 0x22ffffff), Theme.createCircleDrawable(AndroidUtilities.dp(60), 0x44ffffff))); + galleryButton.setBackgroundDrawable(Theme.createSelectorDrawableFromDrawables(Theme.createCircleDrawable(dp(60), 0x22ffffff), Theme.createCircleDrawable(dp(60), 0x44ffffff))); viewGroup.addView(galleryButton); galleryButton.setOnClickListener(currentImage -> { if (getParentActivity() == null) { @@ -706,7 +735,7 @@ public class CameraScanActivity extends BaseFragment { flashButton = new ImageView(context); flashButton.setScaleType(ImageView.ScaleType.CENTER); flashButton.setImageResource(R.drawable.qr_flashlight); - flashButton.setBackgroundDrawable(Theme.createCircleDrawable(AndroidUtilities.dp(60), 0x22ffffff)); + flashButton.setBackgroundDrawable(Theme.createCircleDrawable(dp(60), 0x22ffffff)); viewGroup.addView(flashButton); flashButton.setOnClickListener(currentImage -> { if (cameraView == null) { @@ -836,43 +865,84 @@ public class CameraScanActivity extends BaseFragment { } } - private void updateRecognizedBounds(RectF newBounds) { + private void setPointsFromBounds(RectF bounds, PointF[] points) { + points[0].set(bounds.left, bounds.top); + points[1].set(bounds.right, bounds.top); + points[2].set(bounds.right, bounds.bottom); + points[3].set(bounds.left, bounds.bottom); + } + + private void updateRecognizedBounds(RectF newBounds, PointF[] newPoints) { final long now = SystemClock.elapsedRealtime(); if (lastBoundsUpdate == 0) { // first update = set lastBoundsUpdate = now - boundsUpdateDuration; bounds.set(newBounds); fromBounds.set(newBounds); + if (newPoints == null) { + setPointsFromBounds(newBounds, fromPoints); + setPointsFromBounds(newBounds, points); + } else { + for (int i = 0; i < 4; i++) { + fromPoints[i].set(newPoints[i].x, newPoints[i].y); + points[i].set(newPoints[i].x, newPoints[i].y); + } + } } else { // next updates = interpolate if (fromBounds != null && now - lastBoundsUpdate < boundsUpdateDuration) { float t = (now - lastBoundsUpdate) / (float) boundsUpdateDuration; t = Math.min(1, Math.max(0, t)); AndroidUtilities.lerp(fromBounds, bounds, t, fromBounds); - } else { - if (fromBounds == null) { - fromBounds = new RectF(); + + for (int i = 0; i < 4; ++i) { + fromPoints[i].set( + AndroidUtilities.lerp(fromPoints[i].x, points[i].x, t), + AndroidUtilities.lerp(fromPoints[i].y, points[i].y, t) + ); } + } else { fromBounds.set(bounds); + for (int i = 0; i < 4; ++i) { + fromPoints[i].set(points[i].x, points[i].y); + } } bounds.set(newBounds); + if (newPoints == null) { + setPointsFromBounds(bounds, points); + } else { + for (int i = 0; i < 4; ++i) { + points[i].set(newPoints[i].x, newPoints[i].y); + } + } lastBoundsUpdate = now; } fragmentView.invalidate(); } private RectF getRecognizedBounds() { - if (fromBounds == null) { - return bounds; - } else { - float t = (SystemClock.elapsedRealtime() - lastBoundsUpdate) / (float) boundsUpdateDuration; - t = Math.min(1, Math.max(0, t)); - if (t < 1f) { - fragmentView.invalidate(); - } - AndroidUtilities.lerp(fromBounds, bounds, t, AndroidUtilities.rectTmp); - return AndroidUtilities.rectTmp; + float t = (SystemClock.elapsedRealtime() - lastBoundsUpdate) / (float) boundsUpdateDuration; + t = Math.min(1, Math.max(0, t)); + if (t < 1f) { + fragmentView.invalidate(); } + AndroidUtilities.lerp(fromBounds, bounds, t, AndroidUtilities.rectTmp); + return AndroidUtilities.rectTmp; + } + + private PointF[] getRecognizedPoints() { + float t = (SystemClock.elapsedRealtime() - lastBoundsUpdate) / (float) boundsUpdateDuration; + t = Math.min(1, Math.max(0, t)); + if (t < 1f) { + fragmentView.invalidate(); + } + for (int i = 0; i < 4; ++i) { + tmpPoints[i].set( + AndroidUtilities.lerp(fromPoints[i].x, points[i].x, t), + AndroidUtilities.lerp(fromPoints[i].y, points[i].y, t) + ); + } + return tmpPoints; } private RectF normalBounds; @@ -890,6 +960,7 @@ public class CameraScanActivity extends BaseFragment { (height + side) / 2f / (float) height ); } + private RectF getBounds() { RectF recognizedBounds = getRecognizedBounds(); if (useRecognizedBounds < 1f) { @@ -901,6 +972,23 @@ public class CameraScanActivity extends BaseFragment { return recognizedBounds; } + private PointF[] getPoints() { + PointF[] recognizedPoints = getRecognizedPoints(); + if (useRecognizedBounds < 1f) { + if (normalBounds == null) { + updateNormalBounds(); + } + setPointsFromBounds(normalBounds, tmp2Points); + for (int i = 0; i < recognizedPoints.length; ++i) { + recognizedPoints[i].set( + AndroidUtilities.lerp(tmp2Points[i].x, recognizedPoints[i].x, useRecognizedBounds), + AndroidUtilities.lerp(tmp2Points[i].y, recognizedPoints[i].y, useRecognizedBounds) + ); + } + } + return recognizedPoints; + } + @Override public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK && requestCode == 11 && data != null && data.getData() != null) { @@ -1017,7 +1105,7 @@ public class CameraScanActivity extends BaseFragment { recognizedStart = SystemClock.elapsedRealtime(); AndroidUtilities.runOnUIThread(this::updateRecognized); } - AndroidUtilities.runOnUIThread(() -> updateRecognizedBounds(res.bounds)); + AndroidUtilities.runOnUIThread(() -> updateRecognizedBounds(res.bounds, res.cornerPoints)); } else if (recognized) { recognizeFailed++; if (recognizeFailed > 4 && !qrLoading) { @@ -1131,12 +1219,25 @@ public class CameraScanActivity extends BaseFragment { private class QrResult { String text; RectF bounds; + PointF[] cornerPoints; + } + + private static PointF[] toPointF(Point[] points, int w, int h) { + PointF[] out = new PointF[points.length]; + for (int i = 0; i < points.length; ++i) { + out[i] = new PointF( + points[i].x / (float) w, + points[i].y / (float) h + ); + } + return out; } private QrResult tryReadQr(byte[] data, Size size, int x, int y, int side, Bitmap bitmap) { try { String text; RectF bounds = new RectF(); + PointF[] cornerPoints = null; int width = 1, height = 1; if (visionQrReader != null && visionQrReader.isOperational()) { Frame frame; @@ -1153,10 +1254,10 @@ public class CameraScanActivity extends BaseFragment { if (codes != null && codes.size() > 0) { Barcode code = codes.valueAt(0); text = code.rawValue; + cornerPoints = toPointF(code.cornerPoints, width, height); if (code.cornerPoints == null || code.cornerPoints.length == 0) { bounds = null; } else { -// bounds.set(code.getBoundingBox()); float minX = Float.MAX_VALUE, maxX = Float.MIN_VALUE, minY = Float.MAX_VALUE, @@ -1179,6 +1280,7 @@ public class CameraScanActivity extends BaseFragment { if (codes != null && codes.size() > 0) { Barcode code = codes.valueAt(0); text = code.rawValue; + cornerPoints = toPointF(code.cornerPoints, width, height); if (code.cornerPoints == null || code.cornerPoints.length == 0) { bounds = null; } else { @@ -1204,6 +1306,7 @@ public class CameraScanActivity extends BaseFragment { if (codes != null && codes.size() > 0) { Barcode code = codes.valueAt(0); text = code.rawValue; + cornerPoints = toPointF(code.cornerPoints, width, height); if (code.cornerPoints == null || code.cornerPoints.length == 0) { bounds = null; } else { @@ -1233,7 +1336,7 @@ public class CameraScanActivity extends BaseFragment { bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray); width = bitmap.getWidth(); - height = bitmap.getWidth(); + height = bitmap.getHeight(); } else { source = new PlanarYUVLuminanceSource(data, size.getWidth(), size.getHeight(), x, y, side, side, false); width = size.getWidth(); @@ -1260,6 +1363,15 @@ public class CameraScanActivity extends BaseFragment { maxY = Math.max(maxY, point.getY()); } bounds.set(minX, minY, maxX, maxY); + if (result.getResultPoints().length == 4) { + cornerPoints = new PointF[4]; + for (int i = 0; i < 4; ++i) { + cornerPoints[i] = new PointF( + result.getResultPoints()[i].getX() / width, + result.getResultPoints()[i].getY() / height + ); + } + } } } else { text = null; @@ -1272,21 +1384,22 @@ public class CameraScanActivity extends BaseFragment { Uri uri = Uri.parse(text); String path = uri.getPath().replace("/", ""); } else { - if (!text.startsWith("tg://login?token=") && currentType != TYPE_QR_WEB_BOT) { + if (currentType == TYPE_QR_LOGIN && !text.startsWith("tg://login?token=")) { onNoQrFound(); return null; } } QrResult qrResult = new QrResult(); if (bounds != null) { - int paddingx = AndroidUtilities.dp(25), - paddingy = AndroidUtilities.dp(15); + int paddingx = dp(25), + paddingy = dp(15); bounds.set(bounds.left - paddingx, bounds.top - paddingy, bounds.right + paddingx, bounds.bottom + paddingy); bounds.set( bounds.left / (float) width, bounds.top / (float) height, bounds.right / (float) width, bounds.bottom / (float) height ); } + qrResult.cornerPoints = cornerPoints; qrResult.bounds = bounds; qrResult.text = text; return qrResult; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ArchivedStickerSetCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ArchivedStickerSetCell.java index cba1a3a47..dc8a86b2d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ArchivedStickerSetCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ArchivedStickerSetCell.java @@ -200,7 +200,7 @@ public class ArchivedStickerSetCell extends FrameLayout implements Checkable { imageLocation = ImageLocation.getForSticker(thumb, sticker, set.set.thumb_version); } - if (object instanceof TLRPC.Document && MessageObject.isAnimatedStickerDocument(sticker, true)) { + if (object instanceof TLRPC.Document && (MessageObject.isAnimatedStickerDocument(sticker, true) || MessageObject.isVideoSticker(sticker))) { if (svgThumb != null) { imageView.setImage(ImageLocation.getForDocument(sticker), "50_50", svgThumb, 0, set); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java index 25ffd401f..87276ab4e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java @@ -1021,11 +1021,19 @@ public class ChatActionCell extends BaseCell implements DownloadController.FileD } } + private int overriddenMaxWidth; + public void setOverrideTextMaxWidth(int width) { + overriddenMaxWidth = width; + } + private void createLayout(CharSequence text, int width) { int maxWidth = width - dp(30); if (maxWidth < 0) { return; } + if (overriddenMaxWidth > 0) { + maxWidth = Math.min(overriddenMaxWidth, maxWidth); + } invalidatePath = true; TextPaint paint; if (currentMessageObject != null && currentMessageObject.drawServiceWithDefaultTypeface) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index 28e8c68e8..4de2cf352 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -202,6 +202,7 @@ import java.util.concurrent.atomic.AtomicReference; public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate, ImageReceiver.ImageReceiverDelegate, DownloadController.FileDownloadProgressListener, TextSelectionHelper.SelectableView, NotificationCenter.NotificationCenterDelegate { private final static int TIME_APPEAR_MS = 200; private final static int UPLOADING_ALLOWABLE_ERROR = 1024 * 1024; + private final static int STICKER_STATUS_OFFSET = 6; public boolean clipToGroupBounds; public boolean drawForBlur; @@ -543,6 +544,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate default void didPressSponsoredClose() { } + default void didPressSponsoredInfo(ChatMessageCell cell, float x, float y) { + } + default void didPressTime(ChatMessageCell cell) { } @@ -665,6 +669,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate default boolean doNotShowLoadingReply(MessageObject msg) { return msg != null && msg.getDialogId() == UserObject.REPLY_BOT; } + + default void didPressAboutRevenueSharingAds() { + + } } private final static int DOCUMENT_ATTACH_TYPE_NONE = 0; @@ -889,6 +897,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private float siteNameLeft, siteNameLayoutWidth; private int siteNameWidth; private StaticLayout siteNameLayout; + private StaticLayout titleLabelLayout; + private float titleLabelLayoutWidth, titleLabelLayoutHeight, titleLabelX, titleLabelY; + private boolean isTitleLabelPressed; + private ButtonBounce titleLabelBounce; private StaticLayout titleLayout; private StaticLayout descriptionLayout; private StaticLayout videoInfoLayout; @@ -925,6 +937,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private boolean instantPressed; private boolean instantButtonPressed; private ButtonBounce instantButtonBounce; + private int selectorDrawableColor; private final Drawable[] selectorDrawable = new Drawable[2]; private int[] selectorDrawableMaskType = new int[2]; private RectF instantButtonRect = new RectF(); @@ -1262,7 +1275,13 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private MessageTopicButton topicButton; private int drawSideButton; + private int drawSideButton2; private boolean sideButtonPressed; + private int pressedSideButton; + private Path sideButtonPath1, sideButtonPath2; + private float[] sideButtonPathCorners1, sideButtonPathCorners2; + private static final int SIDE_BUTTON_SPONSORED_CLOSE = 4; + private static final int SIDE_BUTTON_SPONSORED_MORE = 5; private float sideStartX; private float sideStartY; @@ -1291,10 +1310,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private float drawTimeX; private float drawTimeY; - private StaticLayout timeLayout; + public StaticLayout timeLayout; public int timeWidth; private int timeTextWidth; - protected int timeX; + public int timeX; + public int signWidth; private CharSequence currentTimeString; private boolean drawTime = true; private boolean forceNotDrawTime; @@ -2704,6 +2724,38 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate return false; } + private boolean checkTitleLabelMotion(MotionEvent event) { + if (!currentMessageObject.isSponsored() || !currentMessageObject.sponsoredCanReport) { + return false; + } + + int x = (int) event.getX(); + int y = (int) event.getY(); + + if (event.getAction() == MotionEvent.ACTION_DOWN) { + if (x >= titleLabelX - AndroidUtilities.dp(6) && x <= titleLabelX + titleLabelLayoutWidth + AndroidUtilities.dp(6) + && y >= titleLabelY - AndroidUtilities.dp(2) && y <= titleLabelY + titleLabelLayoutHeight + AndroidUtilities.dp(2)) { + if (titleLabelBounce != null) { + titleLabelBounce.setPressed(true); + } + isTitleLabelPressed = true; + return true; + } + } else if (event.getAction() == MotionEvent.ACTION_UP) { + if (isTitleLabelPressed) { + if (delegate != null) { + delegate.didPressAboutRevenueSharingAds(); + } + if (titleLabelBounce != null) { + titleLabelBounce.setPressed(false); + } + playSoundEffect(SoundEffectConstants.CLICK); + isTitleLabelPressed = false; + } + } + return false; + } + private void invalidateWithParent() { if (currentMessagesGroup != null && getParent() != null) { ((ViewGroup) getParent()).invalidate(); @@ -3498,6 +3550,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (!result) { result = checkAudioMotionEvent(event); } + if (!result) { + result = checkTitleLabelMotion(event); + } if (!result) { result = checkContactMotionEvent(event); } @@ -3540,12 +3595,16 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate linkPreviewPressed = false; otherPressed = false; sideButtonPressed = false; + pressedSideButton = 0; imagePressed = false; timePressed = false; gamePreviewPressed = false; instantPressed = commentButtonPressed = false; setInstantButtonPressed(false); resetContactButtonsPressedState(); + if (titleLabelBounce != null) { + titleLabelBounce.setPressed(false); + } if (Build.VERSION.SDK_INT >= 21) { for (int a = 0; a < selectorDrawable.length; a++) { if (selectorDrawable[a] != null) { @@ -3619,9 +3678,18 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } else if ( drawSideButton != 0 && x >= sideStartX - dp(24) && x <= sideStartX + dp(40) && - y >= sideStartY - dp(24) && y <= sideStartY + dp(38 + (drawSideButton == 3 && commentLayout != null ? 18 : 0)) + y >= sideStartY - dp(24) && y <= sideStartY + dp(38 + (drawSideButton == 3 && commentLayout != null ? 18 : 0) + (drawSideButton2 == SIDE_BUTTON_SPONSORED_MORE ? 38 : 0)) ) { if (currentMessageObject.isSent()) { + if (currentMessageObject.isSponsored()) { + if (y > sideStartY + dp(32) && drawSideButton2 == SIDE_BUTTON_SPONSORED_MORE) { + pressedSideButton = SIDE_BUTTON_SPONSORED_MORE; + } else { + pressedSideButton = SIDE_BUTTON_SPONSORED_CLOSE; + } + } else { + pressedSideButton = drawSideButton; + } sideButtonPressed = true; } result = true; @@ -3831,25 +3899,30 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } else if (sideButtonPressed) { if (event.getAction() == MotionEvent.ACTION_UP) { - sideButtonPressed = false; playSoundEffect(SoundEffectConstants.CLICK); if (delegate != null) { - if (drawSideButton == 4) { + if (pressedSideButton == SIDE_BUTTON_SPONSORED_CLOSE) { delegate.didPressSponsoredClose(); - } else if (drawSideButton == 3) { + } else if (pressedSideButton == SIDE_BUTTON_SPONSORED_MORE) { + delegate.didPressSponsoredInfo(this, x, y); + } else if (pressedSideButton == 3) { delegate.didPressCommentButton(this); } else { delegate.didPressSideButton(this); } } + sideButtonPressed = false; + pressedSideButton = 0; } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { sideButtonPressed = false; + pressedSideButton = 0; } else if (event.getAction() == MotionEvent.ACTION_MOVE) { if (!( x >= sideStartX - dp(24) && x <= sideStartX + dp(40) && - y >= sideStartY - dp(24) && y <= sideStartY + dp(38 + (drawSideButton == 3 && commentLayout != null ? 18 : 0)) + y >= sideStartY - dp(24) && y <= sideStartY + dp(38 + (drawSideButton == 3 && commentLayout != null ? 18 : 0) + (drawSideButton2 == SIDE_BUTTON_SPONSORED_MORE ? 38 : 0)) )) { sideButtonPressed = false; + pressedSideButton = 0; } } invalidate(); @@ -5037,6 +5110,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } gamePreviewPressed = false; sideButtonPressed = false; + pressedSideButton = 0; hasNewLineForTime = false; flipImage = false; isThreadPost = isThreadChat && messageObject.messageOwner.fwd_from != null && messageObject.messageOwner.fwd_from.channel_post != 0 && messageObject.messageOwner.reply_to == null; @@ -5054,6 +5128,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate animatingNoSound = 0; if (messageObject.isSponsored()) { drawSideButton = 4; + if (messageObject.sponsoredCanReport) { + drawSideButton2 = 5; + } } else if (MessagesController.getInstance(currentAccount).isChatNoForwards(messageObject.getChatId()) || (messageObject.messageOwner != null && messageObject.messageOwner.noforwards)) { drawSideButton = 0; } else { @@ -5117,6 +5194,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } resetContactButtonsPressedState(); + if (titleLabelBounce != null) { + titleLabelBounce.setPressed(false); + } drawnContactButtonsFlag = 0; drawContact = false; drawContactView = false; @@ -5141,6 +5221,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate videoInfoLayout = null; photosCountLayout = null; siteNameLayout = null; + titleLabelLayout = null; authorLayout = null; captionFullWidth = 0; captionLayout = null; @@ -5672,7 +5753,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate backgroundWidth = Math.min(getParentWidth() - AndroidUtilities.dp(50), AndroidUtilities.dp(270)); } } else { - backgroundWidth = messageObject.textWidth + getExtraTextX() * 2 + (hasGamePreview || hasInvoicePreview ? AndroidUtilities.dp(10) : 0); // todo! here we set + backgroundWidth = messageObject.textWidth + getExtraTextX() * 2 + (hasGamePreview || hasInvoicePreview ? AndroidUtilities.dp(10) : 0); } if (messageObject.isSponsored()) { totalHeight = AndroidUtilities.dp(22.5f); @@ -5730,6 +5811,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } int site_name_additionalWidth = 0; CharSequence site_name; + CharSequence titleLabel = null; String title; CharSequence author; String description; @@ -5743,7 +5825,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate final int smallImageSide = AndroidUtilities.dp(48), smallSideMargin = AndroidUtilities.dp(10); CharSequence overrideDescrption = null; if (messageObject.isSponsored()) { - site_name = LocaleController.getString(messageObject.sponsoredRecommended ? R.string.SponsoredMessage2Recommended : R.string.SponsoredMessage2); + if (messageObject.sponsoredCanReport) { + site_name = LocaleController.getString(R.string.SponsoredMessageAd); + titleLabel = LocaleController.getString(R.string.SponsoredMessageAdWhatIsThis); + } else if (messageObject.sponsoredRecommended) { + site_name = LocaleController.getString(R.string.SponsoredMessage2Recommended); + } else { + site_name = LocaleController.getString(R.string.SponsoredMessage2); + } title = messageObject.customName != null ? messageObject.customName : getAuthorName(); webDocument = null; overrideDescrption = messageObject.messageText; @@ -5969,6 +6058,19 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } + if (titleLabel != null) { + try { + int width = (int) Math.ceil(Theme.chat_titleLabelTextPaint.measureText(titleLabel.toString())); + titleLabelLayout = new StaticLayout(titleLabel, Theme.chat_titleLabelTextPaint, Math.min(width, linkPreviewMaxWidth), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + titleLabelLayoutWidth = titleLabelLayout.getLineWidth(0); + titleLabelLayoutHeight = titleLabelLayout.getLineBottom(0); + maxChildWidth = Math.max(maxChildWidth, siteNameWidth + width + additinalWidth); + maxWebWidth = Math.max(maxWebWidth, siteNameWidth + width + additinalWidth); + } catch (Exception e) { + FileLog.e(e); + } + } + boolean titleIsRTL = false; if (title != null) { try { @@ -7696,7 +7798,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate photoImage.animatedFileDrawableRepeatMaxCount = 1; } photoImage.setImage(ImageLocation.getForDocument(messageObject.getDocument()), ImageLoader.AUTOPLAY_FILTER, - null, null, + ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), "b1", messageObject.pathThumb, messageObject.getDocument().size, isWebpSticker ? "webp" : null, parentObject, 1); } else if (messageObject.pathThumb != null) { @@ -7712,7 +7814,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), "b1", thumb != null ? thumb : currentPhotoObjectThumbStripped, messageObject.getDocument().size, isWebpSticker ? "webp" : null, parentObject, 1); } else { - photoImage.setImage(null, null, thumb, null, messageObject, 0); + photoImage.setImage(null, null, ImageLocation.getForObject(currentPhotoObjectThumb, photoParentObject), "b1", thumb, 0, null, messageObject, 0); } } else { photoImage.setImage(null, null, thumb, null, messageObject, 0); @@ -9047,6 +9149,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (replyBounce != null) { replyBounce.setPressed(false); } + if (titleLabelBounce != null) { + titleLabelBounce.setPressed(false); + } if (topicButton != null) { topicButton.resetClick(); } @@ -9088,6 +9193,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate linkPreviewPressed = false; sideButtonPressed = false; + pressedSideButton = 0; imagePressed = false; timePressed = false; gamePreviewPressed = false; @@ -11925,6 +12031,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } if (siteNameLayout != null) { + if (titleLabelLayout != null) { + linkPreviewY += AndroidUtilities.dp(1); + } smallImageStartY = linkPreviewY - AndroidUtilities.dp(1); int wasAlpha = Theme.chat_replyNamePaint.getAlpha(); if (alpha != 1f) { @@ -11935,6 +12044,37 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate canvas.translate(linkX + x, linkPreviewY - AndroidUtilities.dp(1)); siteNameLayout.draw(canvas); canvas.restore(); + + if (titleLabelLayout != null) { + titleLabelX = linkX + x + siteNameLayoutWidth + AndroidUtilities.dp(12); + titleLabelY = linkPreviewY; + rect.set(titleLabelX - AndroidUtilities.dp(6), titleLabelY - AndroidUtilities.dp(2), titleLabelX + titleLabelLayoutWidth + AndroidUtilities.dp(6), titleLabelY + titleLabelLayoutHeight + AndroidUtilities.dp(2)); + + if (titleLabelBounce == null) { + titleLabelBounce = new ButtonBounce(this); + } + float scale = titleLabelBounce.getScale(0.1f); + boolean scaleRestore = scale != 1; + if (scaleRestore) { + canvas.save(); + canvas.scale(scale, scale, rect.centerX(), rect.centerY()); + } + Theme.chat_instantViewPaint.setColor(Theme.chat_replyNamePaint.getColor()); + int wasInstantViewAlpha = Theme.chat_instantViewPaint.getAlpha(); + Theme.chat_instantViewPaint.setAlpha((int) (wasAlpha * .11f)); + canvas.drawRoundRect(rect, rect.height(), rect.height(), Theme.chat_instantViewPaint); + Theme.chat_instantViewPaint.setAlpha(wasInstantViewAlpha); + + Theme.chat_titleLabelTextPaint.setColor(Theme.chat_replyNamePaint.getColor()); + Theme.chat_titleLabelTextPaint.setAlpha(Theme.chat_replyNamePaint.getAlpha()); + canvas.save(); + canvas.translate(titleLabelX, titleLabelY); + titleLabelLayout.draw(canvas); + canvas.restore(); + if (scaleRestore) { + canvas.restore(); + } + } linkPreviewY += siteNameLayout.getLineBottom(siteNameLayout.getLineCount() - 1); Theme.chat_replyNamePaint.setAlpha(wasAlpha); } @@ -12471,6 +12611,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (Build.VERSION.SDK_INT >= 21 && selectorDrawable[0] != null) { selectorDrawableMaskType[0] = 0; selectorDrawable[0].setBounds(textX, (int) (photoImage.getImageY() - dp(9)), width, instantY + AndroidUtilities.dp(38f)); + if (selectorDrawableColor != Theme.multAlpha(contactLine.getColor(), .1f)) { + Theme.setSelectorDrawableColor(selectorDrawable[0], selectorDrawableColor = Theme.multAlpha(contactLine.getColor(), .1f), true); + } selectorDrawable[0].draw(canvas); } float radF = (float) Math.floor(SharedConfig.bubbleRadius / 3f); @@ -14281,9 +14424,17 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate private void measureTime(MessageObject messageObject) { CharSequence signString; + MessageObject primaryMessageObject = getPrimaryMessageObject(); long fromId = messageObject.getFromChatId(); if (messageObject.scheduled) { signString = null; + } else if (primaryMessageObject.messageOwner.via_business_bot_id != 0) { + TLRPC.User botUser = MessagesController.getInstance(messageObject.currentAccount).getUser(primaryMessageObject.messageOwner.via_business_bot_id); + if (botUser == null) { + signString = null; + } else { + signString = UserObject.getUserName(botUser); + } } else if (messageObject.messageOwner.post_author != null) { if (isMegagroup && messageObject.getFromChatId() == messageObject.getDialogId()) { signString = null; @@ -14349,7 +14500,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate timeString = LocaleController.getInstance().formatterDay.format((long) (messageObject.messageOwner.date) * 1000); } if (signString != null) { - if (messageObject.messageOwner.fwd_from != null && messageObject.messageOwner.fwd_from.imported) { + if (messageObject.messageOwner.via_business_bot_id != 0) { + currentTimeString = timeString + ", "; + } else if (messageObject.messageOwner.fwd_from != null && messageObject.messageOwner.fwd_from.imported) { currentTimeString = " " + timeString; } else { currentTimeString = ", " + timeString; @@ -14408,6 +14561,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } signString = Emoji.replaceEmoji(signString, Theme.chat_timePaint.getFontMetricsInt(), AndroidUtilities.dp(10), false); int width = (int) Math.ceil(Theme.chat_timePaint.measureText(signString, 0, signString.length())); + signWidth = Math.min(width, widthForSign); if (width > widthForSign) { if (widthForSign <= 0) { signString = ""; @@ -14417,11 +14571,19 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate width = widthForSign; } } - SpannableStringBuilder currentTimeStringBuilder = new SpannableStringBuilder(signString); - currentTimeStringBuilder.append(currentTimeString); + SpannableStringBuilder currentTimeStringBuilder = new SpannableStringBuilder(); + if (messageObject.messageOwner.via_business_bot_id != 0) { + currentTimeStringBuilder.append(currentTimeString); + currentTimeStringBuilder.append(signString); + } else { + currentTimeStringBuilder.append(signString); + currentTimeStringBuilder.append(currentTimeString); + } currentTimeString = currentTimeStringBuilder; timeTextWidth += width; timeWidth += width; + } else { + signWidth = 0; } } @@ -16521,7 +16683,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate sideStartX += currentMessagesGroup.transitionParams.offsetRight - animationOffsetX; } } - if (drawSideButton == 4) { + if (drawSideButton == SIDE_BUTTON_SPONSORED_CLOSE) { sideStartY = AndroidUtilities.dp(6); } else { sideStartY = layoutHeight + transitionParams.deltaBottom - AndroidUtilities.dp(41); @@ -16542,7 +16704,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } } - if (drawSideButton != 4) { + if (drawSideButton != SIDE_BUTTON_SPONSORED_CLOSE) { float sideMin = (layoutHeight + transitionParams.deltaBottom - AndroidUtilities.dp(32)) / 2f; if (sideStartY < sideMin) { sideStartY = sideMin; @@ -16564,9 +16726,42 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate drawCommentButton(canvas, 1f); } } else { - rect.set(sideStartX, sideStartY, sideStartX + AndroidUtilities.dp(32), sideStartY + AndroidUtilities.dp(32)); + rect.set(sideStartX, sideStartY, sideStartX + AndroidUtilities.dp(32), sideStartY + AndroidUtilities.dp(drawSideButton2 == SIDE_BUTTON_SPONSORED_MORE ? 64 : 32)); applyServiceShaderMatrix(); - canvas.drawRoundRect(rect, AndroidUtilities.dp(16), AndroidUtilities.dp(16), getThemedPaint(sideButtonPressed ? Theme.key_paint_chatActionBackgroundSelected : Theme.key_paint_chatActionBackground)); + if (drawSideButton == SIDE_BUTTON_SPONSORED_CLOSE && drawSideButton2 == SIDE_BUTTON_SPONSORED_MORE && sideButtonPressed) { + if (sideButtonPath1 == null) { + sideButtonPath1 = new Path(); + } else { + sideButtonPath1.rewind(); + } + if (sideButtonPath2 == null) { + sideButtonPath2 = new Path(); + } else { + sideButtonPath2.rewind(); + } + if (sideButtonPathCorners1 == null) { + sideButtonPathCorners1 = new float[8]; + sideButtonPathCorners1[0] = sideButtonPathCorners1[1] = sideButtonPathCorners1[2] = sideButtonPathCorners1[3] = dp(16); + } + if (sideButtonPathCorners2 == null) { + sideButtonPathCorners2 = new float[8]; + sideButtonPathCorners2[4] = sideButtonPathCorners2[5] = sideButtonPathCorners2[6] = sideButtonPathCorners2[7] = dp(16); + } + AndroidUtilities.rectTmp.set(sideStartX, sideStartY, sideStartX + AndroidUtilities.dp(32), sideStartY + AndroidUtilities.dp(32)); + sideButtonPath1.addRoundRect(AndroidUtilities.rectTmp, sideButtonPathCorners1, Path.Direction.CW); + + AndroidUtilities.rectTmp.set(sideStartX, sideStartY + AndroidUtilities.dp(32), sideStartX + AndroidUtilities.dp(32), sideStartY + AndroidUtilities.dp(64)); + sideButtonPath2.addRoundRect(AndroidUtilities.rectTmp, sideButtonPathCorners2, Path.Direction.CW); + if (pressedSideButton == SIDE_BUTTON_SPONSORED_CLOSE) { + canvas.drawPath(sideButtonPath1, getThemedPaint(Theme.key_paint_chatActionBackgroundSelected)); + canvas.drawPath(sideButtonPath2, getThemedPaint(Theme.key_paint_chatActionBackground)); + } else { + canvas.drawPath(sideButtonPath1, getThemedPaint(Theme.key_paint_chatActionBackground)); + canvas.drawPath(sideButtonPath2, getThemedPaint(Theme.key_paint_chatActionBackgroundSelected)); + } + } else { + canvas.drawRoundRect(rect, AndroidUtilities.dp(16), AndroidUtilities.dp(16), getThemedPaint(sideButtonPressed ? Theme.key_paint_chatActionBackgroundSelected : Theme.key_paint_chatActionBackground)); + } if (hasGradientService()) { canvas.drawRoundRect(rect, AndroidUtilities.dp(16), AndroidUtilities.dp(16), Theme.chat_actionBackgroundGradientDarkenPaint); } @@ -16575,16 +16770,25 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate Drawable goIconDrawable = getThemedDrawable(Theme.key_drawable_goIcon); setDrawableBounds(goIconDrawable, sideStartX + AndroidUtilities.dp(16) - goIconDrawable.getIntrinsicWidth() / 2f, sideStartY + AndroidUtilities.dp(16) - goIconDrawable.getIntrinsicHeight() / 2f); goIconDrawable.draw(canvas); - } else if (drawSideButton == 4) { + } else if (drawSideButton == SIDE_BUTTON_SPONSORED_CLOSE) { final int scx = (int) (sideStartX + AndroidUtilities.dp(16)), scy = (int) (sideStartY + AndroidUtilities.dp(16)); Drawable drawable = getThemedDrawable(Theme.key_drawable_closeIcon); - final int shw = drawable.getIntrinsicWidth() / 2, shh = drawable.getIntrinsicHeight() / 2; + int shw = drawable.getIntrinsicWidth() / 2, shh = drawable.getIntrinsicHeight() / 2; drawable.setBounds(scx - shw, scy - shh, scx + shw, scy + shh); setDrawableBounds(drawable, sideStartX + AndroidUtilities.dp(4), sideStartY + AndroidUtilities.dp(4)); canvas.save(); canvas.scale(.65f, .65f, drawable.getBounds().centerX(), drawable.getBounds().centerY()); drawable.draw(canvas); canvas.restore(); + + if (drawSideButton2 == SIDE_BUTTON_SPONSORED_MORE) { + drawable = getThemedDrawable(Theme.key_drawable_moreIcon); + shw = drawable.getIntrinsicWidth() / 2; + shh = drawable.getIntrinsicHeight() / 2; + drawable.setBounds(scx - shw, scy - shh, scx + shw, scy + shh); + setDrawableBounds(drawable, sideStartX + AndroidUtilities.dp(4), sideStartY + AndroidUtilities.dp(34)); + drawable.draw(canvas); + } } else { final int scx = (int) (sideStartX + AndroidUtilities.dp(16)), scy = (int) (sideStartY + AndroidUtilities.dp(16)); Drawable drawable = getThemedDrawable(Theme.key_drawable_shareIcon); @@ -18395,9 +18599,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate r = Math.min(AndroidUtilities.dp(8), Math.max(rad[2], rad[3])); bigRadius = SharedConfig.bubbleRadius >= 10; } else { - r = AndroidUtilities.dp(4); + r = AndroidUtilities.dp(4) + (currentMessageObject != null && currentMessageObject.isAnyKindOfSticker() ? dp(8) : 0); } + timeX += (currentMessageObject != null && currentMessageObject.isAnyKindOfSticker() ? dp(-STICKER_STATUS_OFFSET) : 0); float x1 = timeX - AndroidUtilities.dp(bigRadius ? 6 : 4); + float offsetX = (currentMessageObject != null && currentMessageObject.isAnyKindOfSticker()) ? dp(2) : 0; float timeY; if (documentAttachType == DOCUMENT_ATTACH_TYPE_ROUND && (currentMessageObject == null || !currentMessageObject.isRoundOnce())) { timeY = layoutHeight - (AndroidUtilities.dp(drawPinnedBottom ? 4 : 5) + reactionsLayoutInBubble.getCurrentTotalHeight(transitionParams.animateChangeProgress)) * (1f - getVideoTranscriptionProgress()); @@ -18406,7 +18612,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } float y1 = timeY - AndroidUtilities.dp(23); float timeHeight = Math.max(AndroidUtilities.dp(17), Theme.chat_timePaint.getTextSize() + AndroidUtilities.dp(5)); - rect.set(x1, y1, x1 + timeWidth + AndroidUtilities.dp((bigRadius ? 12 : 8) + (currentMessageObject.isOutOwner() ? 20 + (currentMessageObject.type == MessageObject.TYPE_EMOJIS ? 4 : 0) : 0)), y1 + timeHeight); + rect.set(x1 - offsetX, y1, offsetX + x1 + timeWidth + AndroidUtilities.dp((bigRadius ? 12 : 8) + (currentMessageObject.isOutOwner() ? 20 + (currentMessageObject.type == MessageObject.TYPE_EMOJIS ? 4 : 0) : 0)), y1 + timeHeight); if (!currentMessageObject.isQuickReply()) { if (currentMessageObject.hasMediaSpoilers() && currentMessageObject.type != MessageObject.TYPE_ROUND_VIDEO) { @@ -18440,7 +18646,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate alpha = oldAlpha3; - float additionalX = -timeLayout.getLineLeft(0); + float additionalX = -timeLayout.getLineLeft(0) + (currentMessageObject != null && currentMessageObject.isAnyKindOfSticker() ? dp(-STICKER_STATUS_OFFSET) : 0); if (currentMessageObject.shouldDrawReactions() && reactionsLayoutInBubble.isSmall) { updateReactionLayoutPosition(); reactionsLayoutInBubble.draw(canvas, transitionParams.animateChangeProgress, null); @@ -18816,6 +19022,34 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } } + public float getTimeY() { + int timeYOffset; + if (shouldDrawTimeOnMedia()) { + timeYOffset = -(drawCommentButton ? AndroidUtilities.dp(41.3f) : 0); + } else { + if (currentMessageObject.isSponsored()) { + timeYOffset = -AndroidUtilities.dp(48); + if (hasNewLineForTime) { + timeYOffset -= AndroidUtilities.dp(4); + } + } else { + timeYOffset = -(drawCommentButton ? AndroidUtilities.dp(43) : 0); + } + } + return getTimeY(timeYOffset); + } + + public float getTimeY(float timeYOffset) { + if (shouldDrawTimeOnMedia() && documentAttachType != DOCUMENT_ATTACH_TYPE_ROUND) { + return photoImage.getImageY2() + additionalTimeOffsetY - AndroidUtilities.dp(7.3f) - timeLayout.getHeight(); + } + float timeY = layoutHeight - AndroidUtilities.dp(pinnedBottom || pinnedTop ? 7.5f : 6.5f) - timeLayout.getHeight() + timeYOffset; + if (isRoundVideo) { + timeY -= (AndroidUtilities.dp(drawPinnedBottom ? 4 : 5) + reactionsLayoutInBubble.getCurrentTotalHeight(transitionParams.animateChangeProgress)) * (1f - getVideoTranscriptionProgress()); + } + return timeY; + } + private void drawViewsAndRepliesLayout(Canvas canvas, float layoutHeight, float alpha, float timeYOffset, float timeX, float progress, boolean drawSelectionBackground) { boolean useScale = progress != 1f; float scale = 0.5f + 0.5f * progress; @@ -18823,15 +19057,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate float offsetX = reactionsLayoutInBubble.isSmall ? reactionsLayoutInBubble.getCurrentWidth(1f) : 0; int timeAlpha = Theme.chat_timePaint.getAlpha(); - float timeY; - if (shouldDrawTimeOnMedia() && documentAttachType != DOCUMENT_ATTACH_TYPE_ROUND) { - timeY = photoImage.getImageY2() + additionalTimeOffsetY - AndroidUtilities.dp(7.3f) - timeLayout.getHeight(); - } else { - timeY = layoutHeight - AndroidUtilities.dp(pinnedBottom || pinnedTop ? 7.5f : 6.5f) - timeLayout.getHeight() + timeYOffset; - if (isRoundVideo) { - timeY -= (AndroidUtilities.dp(drawPinnedBottom ? 4 : 5) + reactionsLayoutInBubble.getCurrentTotalHeight(transitionParams.animateChangeProgress)) * (1f - getVideoTranscriptionProgress()); - } - } + float timeY = getTimeY(timeYOffset); if (repliesLayout != null || transitionParams.animateReplies) { float repliesX = (transitionParams.shouldAnimateTimeX ? this.timeX : timeX) + offsetX; boolean inAnimation = transitionParams.animateReplies && transitionParams.animateRepliesLayout == null && repliesLayout != null; @@ -19057,17 +19283,19 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate timeY = photoImage.getImageY2() + additionalTimeOffsetY; } timeY -= AndroidUtilities.dp(8.5f); + + float offsetX = currentMessageObject != null && currentMessageObject.isAnyKindOfSticker() ? dp(-STICKER_STATUS_OFFSET) : 0; if (drawClock) { MsgClockDrawable drawable = Theme.chat_msgClockDrawable; int color; if (shouldDrawTimeOnMedia()) { if (currentMessageObject.shouldDrawWithoutBackground()) { color = getThemedColor(Theme.key_chat_serviceText); - setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 24 : 22) - drawable.getIntrinsicWidth(), timeY - drawable.getIntrinsicHeight() + timeYOffset); + setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 24 : 22) - drawable.getIntrinsicWidth() + offsetX, timeY - drawable.getIntrinsicHeight() + timeYOffset); drawable.setAlpha((int) (255 * timeAlpha * alpha)); } else { color = getThemedColor(Theme.key_chat_mediaSentClock); - setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 24 : 22) - drawable.getIntrinsicWidth(), timeY - drawable.getIntrinsicHeight() + timeYOffset); + setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 24 : 22) - drawable.getIntrinsicWidth() + offsetX, timeY - drawable.getIntrinsicHeight() + timeYOffset); drawable.setAlpha((int) (255 * alpha)); } } else { @@ -19100,9 +19328,9 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (moveCheck) { canvas.translate(AndroidUtilities.dp(4.8f) * (1f - progress), 0); } - setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 28.3f : 26.3f) - drawable.getIntrinsicWidth(), timeY - drawable.getIntrinsicHeight() + timeYOffset); + setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 28.3f : 26.3f) - drawable.getIntrinsicWidth() + offsetX, timeY - drawable.getIntrinsicHeight() + timeYOffset); } else { - setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 23.5f : 21.5f) - drawable.getIntrinsicWidth(), timeY - drawable.getIntrinsicHeight() + timeYOffset); + setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 23.5f : 21.5f) - drawable.getIntrinsicWidth() + offsetX, timeY - drawable.getIntrinsicHeight() + timeYOffset); } drawable.setAlpha((int) (255 * timeAlpha * alpha)); } else { @@ -19139,10 +19367,10 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate canvas.translate(AndroidUtilities.dp(4) * (1f - progress), 0); } drawable = getThemedDrawable(drawSelectionBackground ? Theme.key_drawable_msgOutCheckReadSelected : Theme.key_drawable_msgOutCheckRead); - setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(22.5f) - drawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dp(pinnedBottom || pinnedTop ? 9 : 8) - drawable.getIntrinsicHeight() + timeYOffset); + setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(22.5f) - drawable.getIntrinsicWidth() + offsetX, layoutHeight - AndroidUtilities.dp(pinnedBottom || pinnedTop ? 9 : 8) - drawable.getIntrinsicHeight() + timeYOffset); } else { drawable = getThemedDrawable(drawSelectionBackground ? Theme.key_drawable_msgOutCheckSelected : Theme.key_drawable_msgOutCheck); - setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(18.5f) - drawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dp(pinnedBottom || pinnedTop ? 9 : 8) - drawable.getIntrinsicHeight() + timeYOffset); + setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(18.5f) - drawable.getIntrinsicWidth() + offsetX, layoutHeight - AndroidUtilities.dp(pinnedBottom || pinnedTop ? 9 : 8) - drawable.getIntrinsicHeight() + timeYOffset); } drawable.setAlpha((int) (255 * alpha)); if (useScale) { @@ -19162,7 +19390,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (drawCheck1) { if (shouldDrawTimeOnMedia()) { Drawable drawable = currentMessageObject.shouldDrawWithoutBackground() ? getThemedDrawable(Theme.key_drawable_msgStickerHalfCheck) : Theme.chat_msgMediaHalfCheckDrawable; - setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 23.5f : 21.5f) - drawable.getIntrinsicWidth(), timeY - drawable.getIntrinsicHeight() + timeYOffset); + setDrawableBounds(drawable, layoutWidth - AndroidUtilities.dp(bigRadius ? 23.5f : 21.5f) - drawable.getIntrinsicWidth() + offsetX, timeY - drawable.getIntrinsicHeight() + timeYOffset); drawable.setAlpha((int) (255 * timeAlpha * alpha)); if (useScale || moveCheck) { canvas.save(); @@ -19198,6 +19426,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate x = layoutWidth - AndroidUtilities.dp(32); y = layoutHeight - AndroidUtilities.dp(pinnedBottom || pinnedTop ? 22 : 21) + timeYOffset; } + x += offsetX; rect.set(x, y, x + AndroidUtilities.dp(14), y + AndroidUtilities.dp(14)); int oldAlpha = Theme.chat_msgErrorPaint.getAlpha(); Theme.chat_msgErrorPaint.setAlpha((int) (oldAlpha * alpha)); @@ -22381,4 +22610,43 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (msg.messageOwner.reactions == null) return false; return msg.messageOwner.reactions.reactions_as_tags; } + + public String getFilename() { + if (currentMessageObject.type == MessageObject.TYPE_PHOTO) { + if (currentPhotoObject == null) { + return null; + } + return FileLoader.getAttachFileName(currentPhotoObject); + } else if ( + currentMessageObject.type == MessageObject.TYPE_GIF || + documentAttachType == DOCUMENT_ATTACH_TYPE_ROUND || + documentAttachType == DOCUMENT_ATTACH_TYPE_VIDEO || + documentAttachType == DOCUMENT_ATTACH_TYPE_WALLPAPER || + currentMessageObject.type == MessageObject.TYPE_FILE || + documentAttachType == DOCUMENT_ATTACH_TYPE_AUDIO || + documentAttachType == DOCUMENT_ATTACH_TYPE_MUSIC + ) { + if (currentMessageObject.useCustomPhoto) { + return null; + } + if (currentMessageObject.attachPathExists && !TextUtils.isEmpty(currentMessageObject.messageOwner.attachPath)) { + return currentMessageObject.messageOwner.attachPath; + } else if (!currentMessageObject.isSendError() || documentAttachType == DOCUMENT_ATTACH_TYPE_AUDIO || documentAttachType == DOCUMENT_ATTACH_TYPE_MUSIC) { + return currentMessageObject.getFileName(); + } + } else if (documentAttachType != DOCUMENT_ATTACH_TYPE_NONE) { + return FileLoader.getAttachFileName(documentAttach); + } else if (currentPhotoObject != null) { + return FileLoader.getAttachFileName(currentPhotoObject); + } + return null; + } + + public boolean checkLoadCaughtPremiumFloodWait() { + return FileLoader.getInstance(currentAccount).checkLoadCaughtPremiumFloodWait(getFilename()); + } + + public boolean checkUploadCaughtPremiumFloodWait() { + return FileLoader.getInstance(currentAccount).checkUploadCaughtPremiumFloodWait(getFilename()); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxCell.java index 666ac3bc1..f9525da00 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/CheckBoxCell.java @@ -308,10 +308,10 @@ public class CheckBoxCell extends FrameLayout { textView.setSingleLine(false); textView.setEllipsize(null); if (currentType != TYPE_CHECK_BOX_URL) { - textView.setPadding(0, 0, 0, AndroidUtilities.dp(5)); layoutParams.height = LayoutParams.WRAP_CONTENT; - layoutParams.topMargin = AndroidUtilities.dp(10); - layoutParams1.topMargin = AndroidUtilities.dp(12); + layoutParams.gravity = (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP; + layoutParams.topMargin = AndroidUtilities.dp(14); + layoutParams.bottomMargin = AndroidUtilities.dp(10); } } else { textView.setLines(1); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java index 52051631a..aa72bbd80 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -139,6 +139,7 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava public static final int SENT_STATE_SENT = 1; public static final int SENT_STATE_READ = 2; public boolean drawAvatar = true; + public int avatarStart = 10; public int messagePaddingStart = 72; public int heightDefault = 72; public int heightThreeLines = 78; @@ -2030,11 +2031,11 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava if (LocaleController.isRTL) { buttonLeft = typingLeft = messageLeft = messageNameLeft = dp(16); - avatarLeft = getMeasuredWidth() - dp(66); + avatarLeft = getMeasuredWidth() - dp(56 + avatarStart); thumbLeft = avatarLeft - dp(13 + 18); } else { buttonLeft = typingLeft = messageLeft = messageNameLeft = dp(messagePaddingStart + 6); - avatarLeft = dp(10); + avatarLeft = dp(avatarStart); thumbLeft = avatarLeft + dp(56 + 13); } storyParams.originalAvatarRect.set(avatarLeft, avatarTop, avatarLeft + dp(56), avatarTop + dp(56)); @@ -2053,11 +2054,11 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava if (LocaleController.isRTL) { buttonLeft = typingLeft = messageLeft = messageNameLeft = dp(22); - avatarLeft = getMeasuredWidth() - dp(64); + avatarLeft = getMeasuredWidth() - dp(54 + avatarStart); thumbLeft = avatarLeft - dp(11 + (thumbsCount * (thumbSize + 2) - 2)); } else { buttonLeft = typingLeft = messageLeft = messageNameLeft = dp(messagePaddingStart + 4); - avatarLeft = dp(10); + avatarLeft = dp(avatarStart); thumbLeft = avatarLeft + dp(56 + 11); } storyParams.originalAvatarRect.set(avatarLeft, avatarTop, avatarLeft + dp(54), avatarTop + dp(54)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogsHintCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogsHintCell.java index 820b376f0..9bb13fc53 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogsHintCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogsHintCell.java @@ -8,6 +8,7 @@ import android.graphics.PorterDuff; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; +import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; @@ -15,34 +16,46 @@ import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; +import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiSpan; +import org.telegram.ui.Components.AvatarsImageView; import org.telegram.ui.Components.LayoutHelper; +import java.util.ArrayList; + public class DialogsHintCell extends FrameLayout { + private final LinearLayout parentView; private final LinearLayout contentView; - private final TextView titleView; + public final AnimatedEmojiSpan.TextViewEmojis titleView; private final TextView messageView; private final ImageView chevronView; private final ImageView closeView; + private final AvatarsImageView avatarsImageView; public DialogsHintCell(@NonNull Context context) { super(context); setWillNotDraw(false); - setPadding(dp(16), dp(8), dp(16), dp(8)); + setPadding(dp(9), dp(8), dp(9), dp(8)); + + avatarsImageView = new AvatarsImageView(context, false); + avatarsImageView.setStepFactor(46f / 81f); + avatarsImageView.setVisibility(View.GONE); + avatarsImageView.setCount(0); contentView = new LinearLayout(context); contentView.setOrientation(LinearLayout.VERTICAL); contentView.setPadding(LocaleController.isRTL ? dp(24) : 0, 0, LocaleController.isRTL ? 0 : dp(24), 0); - addView(contentView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); - titleView = new TextView(context); + titleView = new AnimatedEmojiSpan.TextViewEmojis(context); + titleView.setEllipsize(TextUtils.TruncateAt.END); titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); titleView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); titleView.setSingleLine(); @@ -54,7 +67,7 @@ public class DialogsHintCell extends FrameLayout { messageView.setEllipsize(TextUtils.TruncateAt.END); contentView.addView(messageView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, Gravity.TOP)); - NotificationCenter.getGlobalInstance().listen(this, NotificationCenter.emojiLoaded, args -> { + NotificationCenter.getGlobalInstance().listenGlobal(this, NotificationCenter.emojiLoaded, args -> { if (titleView != null) { titleView.invalidate(); } @@ -63,6 +76,17 @@ public class DialogsHintCell extends FrameLayout { } }); + parentView = new LinearLayout(context); + parentView.setOrientation(LinearLayout.HORIZONTAL); + if (LocaleController.isRTL) { + parentView.addView(contentView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.CENTER_VERTICAL, 7, 0, 7, 0)); + parentView.addView(avatarsImageView, LayoutHelper.createFrame(0, LayoutHelper.MATCH_PARENT, Gravity.CENTER_VERTICAL, 2, 0, 0, 0)); + } else { + parentView.addView(avatarsImageView, LayoutHelper.createFrame(0, LayoutHelper.MATCH_PARENT, Gravity.CENTER_VERTICAL, 0, 0, 2, 0)); + parentView.addView(contentView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.CENTER_VERTICAL, 7, 0, 7, 0)); + } + addView(parentView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + chevronView = new ImageView(context); chevronView.setImageResource(R.drawable.arrow_newchat); addView(chevronView, LayoutHelper.createFrame(16, 16, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL)); @@ -70,12 +94,16 @@ public class DialogsHintCell extends FrameLayout { 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)); + addView(closeView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, LocaleController.isRTL ? -15 + 7 : 0, 0, LocaleController.isRTL ? 0 : -15 + 7, 0)); closeView.setVisibility(GONE); setClipToPadding(false); updateColors(); } + public void setCompact(boolean compact) { + setPadding(dp(9), dp(compact ? 4 : 8), dp(9), dp(8)); + } + public void updateColors() { titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); messageView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); @@ -85,6 +113,28 @@ public class DialogsHintCell extends FrameLayout { setBackground(Theme.AdaptiveRipple.filledRect()); } + public void setAvatars(int currentAccount, ArrayList users) { + final int count = Math.min(3, users == null ? 0 : users.size()); + final boolean updated = count != avatarsImageView.avatarsDrawable.count; + if (count <= 1) { + avatarsImageView.setAvatarsTextSize(dp(20)); + avatarsImageView.setSize(dp(32)); + } else { + avatarsImageView.setAvatarsTextSize(dp(18)); + avatarsImageView.setSize(dp(27)); + } + avatarsImageView.setCount(count); + avatarsImageView.setVisibility(count <= 0 ? View.GONE : View.VISIBLE); + avatarsImageView.getLayoutParams().width = count <= 1 ? dp(32) : dp(27 + 16 * (count - 1)); + if (updated) parentView.requestLayout(); + if (users != null) { + for (int i = 0; i < 3; ++i) { + avatarsImageView.setObject(i, currentAccount, i >= users.size() ? null : users.get(i)); + } + } + avatarsImageView.commitTransition(false); + } + public void setText(CharSequence title, CharSequence subtitle) { titleView.setText(title); titleView.setCompoundDrawables(null, null, null, null); @@ -99,6 +149,22 @@ public class DialogsHintCell extends FrameLayout { closeView.setOnClickListener(closeListener); } + @Override + public void setOnClickListener(@Nullable OnClickListener l) { + super.setOnClickListener(v -> { + if (getAlpha() > .5f && l != null) + l.onClick(v); + }); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (getAlpha() < .5f) { + return false; + } + return super.onTouchEvent(event); + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java index 0fe2edfd4..6a23f4344 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java @@ -777,4 +777,17 @@ public class DrawerProfileCell extends FrameLayout implements NotificationCenter public View getEmojiStatusDrawableParent() { return nameTextView; } + + public void updateSunDrawable(boolean toDark) { + if (sunDrawable != null) { + if (toDark) { + sunDrawable.setCustomEndFrame(36); + } else { + sunDrawable.setCustomEndFrame(0); + } + } + if (darkThemeView != null) { + darkThemeView.playAnimation(); + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/EditTextCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/EditTextCell.java new file mode 100644 index 000000000..f30960e3e --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/EditTextCell.java @@ -0,0 +1,249 @@ +package org.telegram.ui.Cells; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.text.Editable; +import android.text.InputFilter; +import android.text.InputType; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Business.QuickRepliesController; +import org.telegram.ui.Components.AnimatedColor; +import org.telegram.ui.Components.AnimatedTextView; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.EditTextBoldCursor; +import org.telegram.ui.Components.LayoutHelper; + +import java.util.ArrayList; + +public class EditTextCell extends FrameLayout { + + private boolean ignoreEditText; + public final EditTextBoldCursor editText; + private int maxLength; + + private boolean showLimitWhenEmpty; + private boolean showLimitWhenFocused; + + public boolean autofocused; + private boolean focused; + + AnimatedColor limitColor = new AnimatedColor(this); + private int limitCount; + AnimatedTextView.AnimatedTextDrawable limit = new AnimatedTextView.AnimatedTextDrawable(false, true, true); { + limit.setAnimationProperties(.2f, 0, 160, CubicBezierInterpolator.EASE_OUT_QUINT); + limit.setTextSize(dp(15.33f)); + limit.setGravity(Gravity.RIGHT); + } + + public void setShowLimitWhenEmpty(boolean show) { + showLimitWhenEmpty = show; + if (showLimitWhenEmpty) { + updateLimitText(); + } + } + + private void updateLimitText() { + if (editText == null) return; + limitCount = maxLength - getText().length(); + limit.setText(TextUtils.isEmpty(getText()) && !showLimitWhenEmpty || showLimitWhenFocused && (!focused || autofocused) ? "" : "" + limitCount); + } + + public void whenHitEnter(Runnable whenEnter) { + editText.setImeOptions(EditorInfo.IME_ACTION_DONE); + editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + whenEnter.run(); + return true; + } + return false; + } + }); + } + + public void hideKeyboardOnEnter() { + whenHitEnter(() -> AndroidUtilities.hideKeyboard(editText)); + } + + + public void setShowLimitOnFocus(boolean show) { + showLimitWhenFocused = show; + } + + public EditTextCell(Context context, String hint, boolean multiline) { + this(context, hint, multiline, -1); + } + + public EditTextCell( + Context context, + String hint, + boolean multiline, + int maxLength + ) { + super(context); + this.maxLength = maxLength; + + editText = new EditTextBoldCursor(context) { + @Override + protected boolean verifyDrawable(@NonNull Drawable who) { + return who == limit || super.verifyDrawable(who); + } + @Override + protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { + super.onTextChanged(text, start, lengthBefore, lengthAfter); + + if (limit != null && maxLength > 0) { + limit.cancelAnimation(); + updateLimitText(); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + limit.setTextColor(limitColor.set(Theme.getColor(limitCount <= 0 ? Theme.key_text_RedRegular : Theme.key_dialogSearchHint, getResourcesProvider()))); + limit.setBounds(getScrollX(), 0, getScrollX() + getWidth() - getPaddingRight() + dp(42), getHeight()); + limit.draw(canvas); + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.save(); + canvas.clipRect(getScrollX() + getPaddingLeft(), 0, getScrollX() + getWidth() - getPaddingRight(), getHeight()); + super.onDraw(canvas); + canvas.restore(); + } + }; + limit.setCallback(editText); + editText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17); + editText.setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteHintText)); + editText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + editText.setBackground(null); + if (multiline) { + editText.setMaxLines(5); + editText.setSingleLine(false); + } else { + editText.setMaxLines(1); + editText.setSingleLine(true); + } + editText.setPadding(dp(21), dp(15), dp((maxLength > 0 ? 42 : 0) + 21), dp(15)); + editText.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + editText.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_CLASS_TEXT | (multiline ? InputType.TYPE_TEXT_FLAG_MULTI_LINE : 0) | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + editText.setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); + editText.setHint(hint); + editText.setCursorColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + editText.setCursorSize(dp(19)); + editText.setCursorWidth(1.5f); + editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { + if (!ignoreEditText) { + autofocused = false; + } + } + @Override + public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {} + @Override + public void afterTextChanged(Editable editable) { + if (!ignoreEditText) { + EditTextCell.this.onTextChanged(editable); + } + } + }); + editText.setOnFocusChangeListener(new OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + focused = hasFocus; + if (showLimitWhenFocused) { + updateLimitText(); + } + onFocusChanged(hasFocus); + } + }); + ArrayList filters = new ArrayList<>(); + if (multiline) { + filters.add(new InputFilter() { + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + if (source != null) { + String s = source.toString(); + if (s.contains("\n")) { + s = s.replaceAll("\n", ""); + } + return s; + } + return null; + } + }); + } + if (maxLength > 0) { + filters.add(new InputFilter.LengthFilter(maxLength)); + } + editText.setFilters(filters.toArray(new InputFilter[0])); + addView(editText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP)); + + updateLimitText(); + } + + public void setText(CharSequence text) { + ignoreEditText = true; + editText.setText(text); + editText.setSelection(editText.getText().length()); + ignoreEditText = false; + } + + public CharSequence getText() { + return editText.getText(); + } + + public boolean validate() { + return maxLength < 0 || editText.getText().length() <= maxLength; + } + + protected void onTextChanged(CharSequence newText) { + + } + + protected void onFocusChanged(boolean focused) { + + } + + private boolean needDivider; + public void setDivider(boolean divider) { + setWillNotDraw(!(needDivider = divider)); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (needDivider) { + canvas.drawLine( + LocaleController.isRTL ? 0 : dp(22), + getMeasuredHeight() - 1, + getMeasuredWidth() - (LocaleController.isRTL ? dp(22) : 0), + getMeasuredHeight() - 1, + Theme.dividerPaint + ); + } + } +} \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell.java index 3be259278..a765e7913 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell.java @@ -197,7 +197,7 @@ public class FeaturedStickerSetCell extends FrameLayout { imageLocation = ImageLocation.getForSticker(thumb, sticker, set.set.thumb_version); } - if (object instanceof TLRPC.Document && MessageObject.isAnimatedStickerDocument(sticker, true)) { + if (object instanceof TLRPC.Document && (MessageObject.isAnimatedStickerDocument(sticker, true) || MessageObject.isVideoSticker(sticker))) { if (svgThumb != null) { imageView.setImage(ImageLocation.getForDocument(sticker), "50_50", svgThumb, 0, set); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java index d2cdd10b5..4ca108c9e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetCell2.java @@ -270,7 +270,7 @@ public class FeaturedStickerSetCell2 extends FrameLayout implements Notification imageLocation = ImageLocation.getForSticker(thumb, sticker, set.set.thumb_version); } - if (object instanceof TLRPC.Document && MessageObject.isAnimatedStickerDocument(sticker, true)) { + if (object instanceof TLRPC.Document && (MessageObject.isAnimatedStickerDocument(sticker, true) || MessageObject.isVideoSticker(sticker))) { if (svgThumb != null) { imageView.setImage(ImageLocation.getForDocument(sticker), "50_50", svgThumb, 0, set); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GraySectionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GraySectionCell.java index e0f749ef7..7544e76c7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GraySectionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GraySectionCell.java @@ -21,6 +21,7 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.LocaleController; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.AnimatedTextView; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.LayoutHelper; @@ -31,7 +32,7 @@ import java.util.List; public class GraySectionCell extends FrameLayout { - private TextView textView; + private AnimatedEmojiSpan.TextViewEmojis textView; private AnimatedTextView rightTextView; private final Theme.ResourcesProvider resourcesProvider; private int layerHeight = 32; @@ -46,9 +47,9 @@ public class GraySectionCell extends FrameLayout { setBackgroundColor(getThemedColor(Theme.key_graySection)); - textView = new TextView(getContext()); + textView = new AnimatedEmojiSpan.TextViewEmojis(getContext()); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); textView.setTextColor(getThemedColor(Theme.key_graySectionText)); textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 16, 0, 16, 0)); @@ -60,7 +61,7 @@ public class GraySectionCell extends FrameLayout { } }; rightTextView.setPadding(AndroidUtilities.dp(2), 0, AndroidUtilities.dp(2), 0); - rightTextView.setAnimationProperties(1f, 0, 400, CubicBezierInterpolator.EASE_OUT_QUINT); + rightTextView.setAnimationProperties(.9f, 0, 420, CubicBezierInterpolator.EASE_OUT_QUINT); rightTextView.setTextSize(AndroidUtilities.dp(14)); rightTextView.setTextColor(getThemedColor(Theme.key_graySectionText)); rightTextView.setGravity(LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT); @@ -108,18 +109,18 @@ public class GraySectionCell extends FrameLayout { setRightText(right, true); } - public void setRightText(String right, boolean moveDown) { + public void setRightText(CharSequence right, boolean moveDown) { rightTextView.setText(right, true, moveDown); rightTextView.setVisibility(VISIBLE); } - public void setRightText(String right, OnClickListener onClickListener) { + public void setRightText(CharSequence right, OnClickListener onClickListener) { rightTextView.setText(right, false); rightTextView.setOnClickListener(onClickListener); rightTextView.setVisibility(VISIBLE); } - public void setRightText(String right, boolean moveDown, OnClickListener onClickListener) { + public void setRightText(CharSequence right, boolean moveDown, OnClickListener onClickListener) { rightTextView.setText(right, true, moveDown); rightTextView.setOnClickListener(onClickListener); rightTextView.setVisibility(VISIBLE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCreateUserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCreateUserCell.java index 81b91d121..2132272ac 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCreateUserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCreateUserCell.java @@ -16,7 +16,9 @@ import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.ColorFilter; import android.graphics.Paint; +import android.graphics.PixelFormat; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; @@ -25,6 +27,9 @@ import android.view.Gravity; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ChatObject; import org.telegram.messenger.Emoji; @@ -43,10 +48,13 @@ import org.telegram.ui.Components.AnimatedFloat; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CheckBox2; +import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.Premium.PremiumGradient; +import java.util.Locale; + public class GroupCreateUserCell extends FrameLayout { private BackupImageView avatarImageView; @@ -57,6 +65,7 @@ public class GroupCreateUserCell extends FrameLayout { private Object currentObject; private CharSequence currentName; private CharSequence currentStatus; + public boolean currentPremium; private int checkBoxType; @@ -81,6 +90,7 @@ public class GroupCreateUserCell extends FrameLayout { private final AnimatedFloat premiumBlockedT = new AnimatedFloat(this, 0, 350, CubicBezierInterpolator.EASE_OUT_QUINT); private boolean premiumBlocked; + private Boolean premiumBlockedOverriden; private boolean showPremiumBlocked; public boolean isBlocked() { @@ -98,7 +108,7 @@ public class GroupCreateUserCell extends FrameLayout { private void updatePremiumBlocked(boolean animated) { final boolean wasPremiumBlocked = premiumBlocked; - premiumBlocked = showPremiumBlocked && currentObject instanceof TLRPC.User && MessagesController.getInstance(currentAccount).isUserPremiumBlocked(((TLRPC.User) currentObject).id); + premiumBlocked = showPremiumBlocked && (premiumBlockedOverriden != null ? premiumBlockedOverriden : currentObject instanceof TLRPC.User && MessagesController.getInstance(currentAccount).isUserPremiumBlocked(((TLRPC.User) currentObject).id)); if (wasPremiumBlocked != premiumBlocked) { if (!animated) { premiumBlockedT.set(premiumBlocked, true); @@ -107,6 +117,12 @@ public class GroupCreateUserCell extends FrameLayout { } } + public void overridePremiumBlocked(boolean premiumBlocked, boolean animated) { + showPremiumBlocked = true; + premiumBlockedOverriden = premiumBlocked; + updatePremiumBlocked(animated); + } + public GroupCreateUserCell(Context context, int checkBoxType, int pad, boolean selfAsSaved) { this(context, checkBoxType, pad, selfAsSaved, false, null); } @@ -170,9 +186,50 @@ public class GroupCreateUserCell extends FrameLayout { currentStatus = status; currentName = name; drawDivider = false; + currentPremium = false; update(0); } + public void setPremium() { + currentPremium = true; + currentObject = "premium"; + avatarImageView.setImageDrawable(makePremiumUsersDrawable(getContext(), false)); + nameTextView.setText(LocaleController.getString(R.string.PrivacyPremium)); + statusTextView.setTag(Theme.key_windowBackgroundWhiteGrayText); + statusTextView.setTextColor(Theme.getColor(forceDarkTheme ? Theme.key_voipgroup_lastSeenText : Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + statusTextView.setText(LocaleController.getString(R.string.PrivacyPremiumText)); + } + + public static Drawable makePremiumUsersDrawable(Context context, boolean small) { + PremiumGradient.PremiumGradientTools gradientTools = new PremiumGradient.PremiumGradientTools(Theme.key_premiumGradient2, Theme.key_premiumGradient1, -1, -1, -1, null); + Drawable backgroundDrawable = new Drawable() { + @Override + public void draw(@NonNull Canvas canvas) { + gradientTools.gradientMatrix(getBounds()); + canvas.drawCircle( + getBounds().centerX(), + getBounds().centerY(), + Math.min(getBounds().width(), getBounds().height()) / 2f, + gradientTools.paint + ); + } + @Override + public void setAlpha(int alpha) {} + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) {} + @Override + public int getOpacity() { + return PixelFormat.TRANSPARENT; + } + }; + Drawable starDrawable = context.getResources().getDrawable(R.drawable.msg_settings_premium); + CombinedDrawable drawable = new CombinedDrawable(backgroundDrawable, starDrawable, 0, 0); + if (small) { + drawable.setIconSize(dp(18), dp(18)); + } + return drawable; + } + public void setForbiddenCheck(boolean forbidden) { checkBox.setForbidden(forbidden); } @@ -244,7 +301,7 @@ public class GroupCreateUserCell extends FrameLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(currentObject instanceof String ? 50 : 58), MeasureSpec.EXACTLY)); + super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(currentObject instanceof String && !"premium".equalsIgnoreCase((String) currentObject) ? 50 : 58), MeasureSpec.EXACTLY)); } public void recycle() { @@ -252,7 +309,7 @@ public class GroupCreateUserCell extends FrameLayout { } public void update(int mask) { - if (currentObject == null) { + if (currentObject == null || currentPremium) { return; } TLRPC.FileLocation photo = null; @@ -468,6 +525,7 @@ public class GroupCreateUserCell extends FrameLayout { private PremiumGradient.PremiumGradientTools premiumGradient; private Drawable lockDrawable; + private Paint lockBackgroundPaint; @Override protected void onDraw(Canvas canvas) { @@ -505,11 +563,21 @@ public class GroupCreateUserCell extends FrameLayout { canvas.save(); Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite, resourcesProvider)); canvas.drawCircle(left, top, dp(10 + 1.33f) * lockT, Theme.dialogs_onlineCirclePaint); - if (premiumGradient == null) { - premiumGradient = new PremiumGradient.PremiumGradientTools(Theme.key_premiumGradient1, Theme.key_premiumGradient2, -1, -1, -1, resourcesProvider); + Paint paint; + if (premiumBlockedOverriden == null) { + if (premiumGradient == null) { + premiumGradient = new PremiumGradient.PremiumGradientTools(Theme.key_premiumGradient1, Theme.key_premiumGradient2, -1, -1, -1, resourcesProvider); + } + premiumGradient.gradientMatrix((int) (left - dp(10)), (int) (top - dp(10)), (int) (left + dp(10)), (int) (top + dp(10)), 0, 0); + paint = premiumGradient.paint; + } else { + if (lockBackgroundPaint == null) { + lockBackgroundPaint = new Paint(); + } + lockBackgroundPaint.setColor(Theme.getColor(Theme.key_avatar_backgroundGray, resourcesProvider)); + paint = lockBackgroundPaint; } - premiumGradient.gradientMatrix((int) (left - dp(10)), (int) (top - dp(10)), (int) (left + dp(10)), (int) (top + dp(10)), 0, 0); - canvas.drawCircle(left, top, dp(10) * lockT, premiumGradient.paint); + canvas.drawCircle(left, top, dp(10) * lockT, paint); if (lockDrawable == null) { lockDrawable = getContext().getResources().getDrawable(R.drawable.msg_mini_lock2).mutate(); lockDrawable.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/LocationDirectionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/LocationDirectionCell.java index 8ecf14234..5fd0d2aba 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/LocationDirectionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/LocationDirectionCell.java @@ -33,7 +33,7 @@ public class LocationDirectionCell extends FrameLayout { buttonTextView.setTextColor(getThemedColor(Theme.key_featuredStickers_buttonText)); buttonTextView.setTextSize(14); buttonTextView.setText(LocaleController.getString("Directions", R.string.Directions)); - buttonTextView.setLeftDrawable(R.drawable.navigate); + buttonTextView.setLeftDrawable(R.drawable.filled_directions); buttonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); frameLayout.addView(buttonTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileChannelCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileChannelCell.java new file mode 100644 index 000000000..6ebf57b6c --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileChannelCell.java @@ -0,0 +1,403 @@ +package org.telegram.ui.Cells; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.app.ApplicationErrorReport; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.Space; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.collection.LongSparseArray; + +import org.telegram.SQLite.SQLiteCursor; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.DialogObject; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.MessagesStorage; +import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.NativeByteBuffer; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedFloat; +import org.telegram.ui.Components.AnimatedTextView; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.AvatarsDrawable; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.ClickableAnimatedTextView; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LoadingDrawable; +import org.telegram.ui.Components.RecyclerListView; +import org.telegram.ui.Stories.StoriesController; +import org.telegram.ui.Stories.StoriesListPlaceProvider; + +import java.util.ArrayList; + +public class ProfileChannelCell extends FrameLayout { + + private final Theme.ResourcesProvider resourcesProvider; + + private final TextView headerView; + private final AnimatedTextView subscribersView; + + private final DialogCell dialogCell; + + public ProfileChannelCell(BaseFragment fragment) { + super(fragment.getContext()); + final Context context = fragment.getContext(); + this.resourcesProvider = fragment.getResourceProvider(); + + LinearLayout headerLayout = new LinearLayout(context); + headerLayout.setOrientation(LinearLayout.HORIZONTAL); + addView(headerLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.FILL_HORIZONTAL | Gravity.TOP, 22, 16.6f, 22, 0)); + + headerView = new TextView(context); + headerView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + headerView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + headerView.setText("Channel"); + headerLayout.addView(headerView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP)); + + subscribersView = new ClickableAnimatedTextView(context); + subscribersView.getDrawable().setHacks(true, true, true); + subscribersView.setAnimationProperties(.3f, 0, 165, CubicBezierInterpolator.EASE_OUT_QUINT); + subscribersView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + subscribersView.setTextSize(dp(11)); + subscribersView.setPadding(dp(4.33f), 0, dp(4.33f), 0); + subscribersView.setGravity(Gravity.LEFT); + headerLayout.addView(subscribersView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 17, Gravity.LEFT | Gravity.TOP, 4, 2, 4, 0)); + + dialogCell = new DialogCell(null, context, false, true, UserConfig.selectedAccount, resourcesProvider); + dialogCell.setDialogCellDelegate(new DialogCell.DialogCellDelegate() { + @Override + public void onButtonClicked(DialogCell dialogCell) { + + } + + @Override + public void onButtonLongPress(DialogCell dialogCell) { + + } + + @Override + public boolean canClickButtonInside() { + return true; + } + + @Override + public void openStory(DialogCell dialogCell, Runnable onDone) { + if (fragment.getMessagesController().getStoriesController().hasStories(dialogCell.getDialogId())) { + fragment.getOrCreateStoryViewer().doOnAnimationReady(onDone); + fragment.getOrCreateStoryViewer().open(fragment.getContext(), dialogCell.getDialogId(), StoriesListPlaceProvider.of(ProfileChannelCell.this)); + return; + } + } + + @Override + public void showChatPreview(DialogCell dialogCell) { + + } + + @Override + public void openHiddenStories() { + StoriesController storiesController = fragment.getMessagesController().getStoriesController(); + if (storiesController.getHiddenList().isEmpty()) { + return; + } + boolean unreadOnly = storiesController.getUnreadState(DialogObject.getPeerDialogId(storiesController.getHiddenList().get(0).peer)) != StoriesController.STATE_READ; + ArrayList peerIds = new ArrayList<>(); + for (int i = 0; i < storiesController.getHiddenList().size(); i++) { + long dialogId = DialogObject.getPeerDialogId(storiesController.getHiddenList().get(i).peer); + if (!unreadOnly || storiesController.getUnreadState(dialogId) != StoriesController.STATE_READ) { + peerIds.add(dialogId); + } + } + + fragment.getOrCreateStoryViewer().open(context, null, peerIds, 0, null, null, StoriesListPlaceProvider.of(ProfileChannelCell.this), false); + } + }); + dialogCell.avatarStart = 15; + dialogCell.messagePaddingStart = 83; + addView(dialogCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.FILL_HORIZONTAL | Gravity.BOTTOM)); + + updateColors(); + + setWillNotDraw(false); + + loadingDrawable = new LoadingDrawable(); + loadingDrawable.setColors( + Theme.multAlpha(Theme.getColor(Theme.key_listSelector, resourcesProvider), 1.25f), + Theme.multAlpha(Theme.getColor(Theme.key_listSelector, resourcesProvider), .8f) + ); + loadingDrawable.setRadiiDp(8); + } + + private boolean loading; + private AnimatedFloat loadingAlpha = new AnimatedFloat(320, CubicBezierInterpolator.EASE_OUT_QUINT); + private final LoadingDrawable loadingDrawable; + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + float loading = loadingAlpha.set(this.loading); + if (loading > 0) { + loadingDrawable.setAlpha((int) (0xFF * loading)); + + AndroidUtilities.rectTmp.set( + dialogCell.getX() + dp(dialogCell.messagePaddingStart + 6), + dialogCell.getY() + dp(38), + dialogCell.getX() + dp(dialogCell.messagePaddingStart + 6) + getWidth() * .5f, + dialogCell.getY() + dp(38 + 8.33f) + ); + loadingDrawable.setBounds(AndroidUtilities.rectTmp); + loadingDrawable.draw(canvas); + + AndroidUtilities.rectTmp.set( + dialogCell.getX() + dp(dialogCell.messagePaddingStart + 6), + dialogCell.getY() + dp(38 + 18), + dialogCell.getX() + dp(dialogCell.messagePaddingStart + 6) + getWidth() * .36f, + dialogCell.getY() + dp(38 + 18 + 8.33f) + ); + loadingDrawable.setBounds(AndroidUtilities.rectTmp); + loadingDrawable.draw(canvas); + + AndroidUtilities.rectTmp.set( + dialogCell.getX() + dialogCell.getWidth() - dp(16) - dp(43), + dialogCell.getY() + dp(12), + dialogCell.getX() + dialogCell.getWidth() - dp(16), + dialogCell.getY() + dp(12 + 8.33f) + ); + loadingDrawable.setBounds(AndroidUtilities.rectTmp); + loadingDrawable.draw(canvas); + + invalidate(); + } + } + + @Override + protected boolean verifyDrawable(@NonNull Drawable who) { + return loadingDrawable == who || super.verifyDrawable(who); + } + + private boolean set = false; + + public void set(TLRPC.Chat channel, MessageObject messageObject) { + final boolean animated = set; + final boolean subscribersShown = channel == null || channel.participants_count > 0; + subscribersView.cancelAnimation(); + subscribersView.setPivotX(0); + if (animated) { + subscribersView.animate().alpha(subscribersShown ? 1f : 0f).scaleX(subscribersShown ? 1f : .8f).scaleY(subscribersShown ? 1f : .8f).setDuration(420).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + } else { + subscribersView.setAlpha(subscribersShown ? 1f : 0f); + subscribersView.setScaleX(subscribersShown ? 1f : 0f); + subscribersView.setScaleY(subscribersShown ? 1f : 0f); + } + + if (channel != null) { + int[] result = new int[1]; + boolean ignoreShort = AndroidUtilities.isAccessibilityScreenReaderEnabled(); + String shortNumber = ignoreShort ? String.valueOf(result[0] = channel.participants_count) : LocaleController.formatShortNumber(channel.participants_count, result); + subscribersView.setText(LocaleController.formatPluralString("Subscribers", result[0]).replace(String.format("%d", result[0]), shortNumber), true); + + if (loading = (messageObject == null)) { + dialogCell.setDialog(-channel.id, null, 0, false, animated); + } else { + dialogCell.setDialog(-channel.id, messageObject, messageObject.messageOwner.date, false, animated); + } + } + + if (!animated) { + loadingAlpha.set(loading, true); + } + invalidate(); + + set = true; + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(115.66f), MeasureSpec.EXACTLY)); + } + + + public static class ChannelMessageFetcher { + + public final int currentAccount; + public boolean loading, loaded, error; + public MessageObject messageObject; + + public ChannelMessageFetcher(int currentAccount) { + this.currentAccount = currentAccount; + } + + private int searchId; + public long channel_id; + public int message_id; + + public void fetch(TLRPC.UserFull userInfo) { + if (userInfo == null || (userInfo.flags2 & 64) == 0) { + searchId++; + loaded = true; + messageObject = null; + done(false); + return; + } + fetch(userInfo.personal_channel_id, userInfo.personal_channel_message); + } + + public void fetch(long channel_id, int message_id) { + if (loaded || loading) { + if (this.channel_id != channel_id || this.message_id != message_id) { + loaded = false; + messageObject = null; + } else { + return; + } + } + final int thisSearchId = ++this.searchId; + loading = true; + + this.channel_id = channel_id; + this.message_id = message_id; + + final long selfId = UserConfig.getInstance(currentAccount).getClientUserId(); + MessagesStorage storage = MessagesStorage.getInstance(currentAccount); + storage.getStorageQueue().postRunnable(() -> { + TLRPC.Message message = null; + ArrayList users = new ArrayList<>(); + ArrayList chats = new ArrayList<>(); + SQLiteCursor cursor = null; + try { + if (message_id <= 0) { + cursor = storage.getDatabase().queryFinalized("SELECT data, mid FROM messages_v2 WHERE uid = ? ORDER BY mid DESC LIMTI 1", -channel_id); + } else { + cursor = storage.getDatabase().queryFinalized("SELECT data, mid FROM messages_v2 WHERE uid = ? AND mid = ? LIMIT 1", -channel_id, message_id); + } + ArrayList usersToLoad = new ArrayList<>(); + ArrayList chatsToLoad = new ArrayList<>(); + if (cursor.next()) { + NativeByteBuffer data = cursor.byteBufferValue(0); + if (data != null) { + message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + message.readAttachPath(data, selfId); + data.reuse(); + message.id = cursor.intValue(1); + message.dialog_id = -channel_id; + MessagesStorage.addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad, null); + } + } + cursor.dispose(); + + if (message != null) { + + if (!usersToLoad.isEmpty()) { + storage.getUsersInternal(TextUtils.join(",", usersToLoad), users); + } + if (!chatsToLoad.isEmpty()) { + storage.getChatsInternal(TextUtils.join(",", chatsToLoad), chats); + } + } + } catch (Exception e) { + FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + } + final TLRPC.Message finalMessage = message; + AndroidUtilities.runOnUIThread(() -> { + if (thisSearchId != searchId) return; + MessageObject messageObject1 = null; + if (finalMessage != null) { + messageObject1 = new MessageObject(currentAccount, finalMessage, true, true); + } + + if (messageObject1 != null) { + this.messageObject = messageObject1; + done(false); + return; + } + + TLRPC.TL_channels_getMessages req = new TLRPC.TL_channels_getMessages(); + req.channel = MessagesController.getInstance(currentAccount).getInputChannel(channel_id); + req.id.add(message_id); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, err) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.messages_Messages) { + TLRPC.messages_Messages res = (TLRPC.messages_Messages) response; + MessagesController.getInstance(currentAccount).putUsers(res.users, false); + MessagesController.getInstance(currentAccount).putChats(res.chats, false); + storage.putUsersAndChats(res.users, res.chats, true, true); + storage.putMessages(res, -channel_id, -1, 0, false, 0, 0); + + if (thisSearchId != searchId) return; + + TLRPC.Message message1 = null; + for (TLRPC.Message m : res.messages) { + if (m.id == message_id) { + message1 = m; + break; + } + } + if (message1 != null) { + if (message1 instanceof TLRPC.TL_messageEmpty) { + this.messageObject = null; + } else { + this.messageObject = new MessageObject(currentAccount, message1, true, true); + } + done(false); + } + } else { + if (thisSearchId != searchId) return; + done(true); + } + })); + }); + }); + } + + private ArrayList callbacks = new ArrayList<>(); + public void subscribe(Runnable callback) { + if (loaded) { + callback.run(); + } else { + callbacks.add(callback); + } + } + private void done(boolean error) { + loading = false; + loaded = true; + this.error = error; + for (Runnable callback : callbacks) callback.run(); + callbacks.clear(); + } + } + + public int processColor(int color) { + return color; + } + + public void updateColors() { + final int headerColor = processColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueHeader, resourcesProvider)); + subscribersView.setTextColor(headerColor); + subscribersView.setBackground(Theme.createRoundRectDrawable(dp(4.5f), dp(4.5f), Theme.multAlpha(headerColor, .1f))); + headerView.setTextColor(headerColor); +// titleView.setTextColor(Theme.getColor(Theme.key_chats_name, resourcesProvider)); +// dateView.setTextColor(Theme.getColor(Theme.key_chats_date, resourcesProvider)); + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SlideIntChooseView.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SlideIntChooseView.java new file mode 100644 index 000000000..ad81f6bf5 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SlideIntChooseView.java @@ -0,0 +1,248 @@ +package org.telegram.ui.Cells; + +import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.formatString; +import static org.telegram.messenger.LocaleController.getString; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Color; +import android.graphics.ColorMatrix; +import android.graphics.ColorMatrixColorFilter; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; +import android.os.Build; +import android.view.Gravity; +import android.view.HapticFeedbackConstants; +import android.view.MotionEvent; +import android.widget.FrameLayout; + +import org.checkerframework.checker.units.qual.A; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Utilities; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ChannelMonetizationLayout; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedTextView; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.SeekBarView; + +import java.util.Arrays; + +public class SlideIntChooseView extends FrameLayout { + + private final Theme.ResourcesProvider resourcesProvider; + + private final AnimatedTextView minText; + private final AnimatedTextView valueText; + private final AnimatedTextView maxText; + private final SeekBarView seekBarView; + + private int stepsCount; + + public SlideIntChooseView(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + + this.resourcesProvider = resourcesProvider; + + minText = new AnimatedTextView(context, true, true, true); + minText.setAnimationProperties(.3f, 0, 220, CubicBezierInterpolator.EASE_OUT_QUINT); + minText.setTextSize(dp(13)); + minText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + minText.setGravity(Gravity.LEFT); + minText.setEmojiCacheType(AnimatedEmojiDrawable.CACHE_TYPE_COLORABLE); + minText.setEmojiColor(Color.WHITE); + addView(minText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 25, Gravity.TOP, 22, 13, 22, 0)); + + valueText = new AnimatedTextView(context, false, true, true); + valueText.setAnimationProperties(.3f, 0, 220, CubicBezierInterpolator.EASE_OUT_QUINT); + valueText.setTextSize(dp(13)); + valueText.setGravity(Gravity.CENTER); + valueText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteValueText, resourcesProvider)); + valueText.setEmojiColor(Color.WHITE); + valueText.setEmojiCacheType(AnimatedEmojiDrawable.CACHE_TYPE_COLORABLE); + addView(valueText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 25, Gravity.TOP, 22, 13, 22, 0)); + + maxText = new AnimatedTextView(context, true, true, true); + maxText.setAnimationProperties(.3f, 0, 220, CubicBezierInterpolator.EASE_OUT_QUINT); + maxText.setTextSize(dp(13)); + maxText.setGravity(Gravity.RIGHT); + maxText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + maxText.setEmojiColor(Color.WHITE); + maxText.setEmojiCacheType(AnimatedEmojiDrawable.CACHE_TYPE_COLORABLE); + addView(maxText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 25, Gravity.TOP, 22, 13, 22, 0)); + + seekBarView = new SeekBarView(context) { + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + getParent().requestDisallowInterceptTouchEvent(true); + } + return super.onTouchEvent(event); + } + }; + seekBarView.setReportChanges(true); + seekBarView.setDelegate(new SeekBarView.SeekBarViewDelegate() { + @Override + public void onSeekBarDrag(boolean stop, float progress) { + if (options == null || whenChanged == null) { + return; + } + final int newValue = (int) (options.min + stepsCount * progress); + if (value != newValue) { + value = newValue; + AndroidUtilities.vibrateCursor(seekBarView); + updateTexts(value, true); + if (whenChanged != null) { + whenChanged.run(value); + } + } + } + + @Override + public int getStepsCount() { + return stepsCount; + } + }); + addView(seekBarView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.FILL_HORIZONTAL, 6, 30, 6, 0)); + } + + private int value; + private Utilities.Callback whenChanged; + private Options options; + + public void set( + int value, + Options options, + Utilities.Callback whenChanged + ) { + this.value = value; + this.options = options; + this.whenChanged = whenChanged; + + stepsCount = options.max - options.min; + seekBarView.setProgress((value - options.min) / (float) stepsCount, false); + + updateTexts(value, false); + } + + public void updateTexts(int value, boolean animated) { + minText.cancelAnimation(); + minText.setText(processText(options.minStringResId, options.min), animated); + int valueResId; + if (value <= options.min) { + valueResId = options.valueMinStringResId; + } else if (value < options.max) { + valueResId = options.valueStringResId; + } else { + valueResId = options.valueMaxStringResId; + } + valueText.cancelAnimation(); + valueText.setText(processText(valueResId, value), animated); + maxText.cancelAnimation(); + maxText.setText(processText(options.maxStringResId, options.max), animated); + maxText.setTextColor(Theme.getColor(value >= options.max ? Theme.key_windowBackgroundWhiteValueText : Theme.key_windowBackgroundWhiteGrayText, resourcesProvider), animated); + setMaxTextEmojiSaturation(value >= options.max ? 1f : 0f, animated); + } + + private float maxTextEmojiSaturation; + private float toMaxTextEmojiSaturation = -1f; + private ValueAnimator maxTextEmojiSaturationAnimator; + private void setMaxTextEmojiSaturation(float value, boolean animated) { + if (Math.abs(toMaxTextEmojiSaturation - value) < 0.01f) { + return; + } + if (maxTextEmojiSaturationAnimator != null) { + maxTextEmojiSaturationAnimator.cancel(); + maxTextEmojiSaturationAnimator = null; + } + toMaxTextEmojiSaturation = value; + if (animated) { + maxTextEmojiSaturationAnimator = ValueAnimator.ofFloat(maxTextEmojiSaturation, value); + maxTextEmojiSaturationAnimator.addUpdateListener(anm -> { + ColorMatrix colorMatrix = new ColorMatrix(); + colorMatrix.setSaturation(maxTextEmojiSaturation = (float) anm.getAnimatedValue()); + if (Theme.isCurrentThemeDark()) { + AndroidUtilities.adjustBrightnessColorMatrix(colorMatrix, -.3f * (1f - maxTextEmojiSaturation)); + } + maxText.setEmojiColorFilter(new ColorMatrixColorFilter(colorMatrix)); + }); + maxTextEmojiSaturationAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + ColorMatrix colorMatrix = new ColorMatrix(); + colorMatrix.setSaturation(maxTextEmojiSaturation = value); + if (Theme.isCurrentThemeDark()) { + AndroidUtilities.adjustBrightnessColorMatrix(colorMatrix, -.3f * (1f - maxTextEmojiSaturation)); + } + maxText.setEmojiColorFilter(new ColorMatrixColorFilter(colorMatrix)); + } + }); + maxTextEmojiSaturationAnimator.setDuration(240); + maxTextEmojiSaturationAnimator.start(); + } else { + ColorMatrix colorMatrix = new ColorMatrix(); + colorMatrix.setSaturation(maxTextEmojiSaturation = value); + if (Theme.isCurrentThemeDark()) { + AndroidUtilities.adjustBrightnessColorMatrix(colorMatrix, -.3f * (1f - maxTextEmojiSaturation)); + } + maxText.setEmojiColorFilter(new ColorMatrixColorFilter(colorMatrix)); + } + } + + private CharSequence processText(int resId, int value) { + String string = getString(resId); + string = string.replace("%d", "" + value); + CharSequence cs = AndroidUtilities.replaceTags(string); + cs = ChannelMonetizationLayout.replaceTON(cs, valueText.getPaint()); + return cs; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure( + MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(dp(75), MeasureSpec.EXACTLY) + ); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + setSystemGestureExclusionRects(Arrays.asList( + new Rect(0, 0, dp(80), getMeasuredHeight()), + new Rect(getMeasuredWidth() - dp(80), 0, getMeasuredWidth(), getMeasuredHeight()) + )); + } + } + + public static class Options { + public int style; + + public int min; + public int max; + + public int minStringResId; + public int valueMinStringResId, valueStringResId, valueMaxStringResId; + public int maxStringResId; + + public static Options make( + int style, + int min, int minStringResId, + int valueMinStringResId, int valueStringResId, int valueMaxStringResId, + int max, int maxStringResId + ) { + Options o = new Options(); + o.style = style; + o.min = min; + o.minStringResId = minStringResId; + o.valueMinStringResId = valueMinStringResId; + o.valueStringResId = valueStringResId; + o.valueMaxStringResId = valueMaxStringResId; + o.max = max; + o.maxStringResId = maxStringResId; + return o; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java index 5acdf0a21..05c948be7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java @@ -8,9 +8,15 @@ package org.telegram.ui.Cells; +import static org.telegram.messenger.AndroidUtilities.dp; + import android.content.Context; +import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Paint; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.os.Vibrator; import android.util.TypedValue; import android.view.Gravity; @@ -18,6 +24,7 @@ import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AccelerateInterpolator; import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; @@ -26,7 +33,6 @@ import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; -import org.telegram.messenger.LiteMode; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessageObject; @@ -37,6 +43,7 @@ import org.telegram.messenger.SvgHelper; import org.telegram.messenger.UserConfig; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.ListView.RecyclerListViewWithOverlayDraw; import org.telegram.ui.Components.Premium.PremiumLockIconView; @@ -63,12 +70,12 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. private boolean isPremiumSticker; private float premiumAlpha = 1f; private boolean showPremiumLock; - - int stickerColor; + public ImageView editModeIcon; + private int editModeIconColor; private final static int STICKER_SIZE = 66; private boolean drawInParentView; - private Theme.ResourcesProvider resourceProvider; + private final Theme.ResourcesProvider resourceProvider; public StickerEmojiCell(Context context, boolean isEmojiPanel, Theme.ResourcesProvider resourcesProvider) { super(context); @@ -76,7 +83,21 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. fromEmojiPanel = isEmojiPanel; - imageView = new ImageReceiver(); + imageView = new ImageReceiver() { + @Override + protected boolean setImageBitmapByKey(Drawable drawable, String key, int type, boolean memCache, int guid) { + if (drawable instanceof BitmapDrawable && editModeIconColor == 0) { + Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); + editModeIconColor = AndroidUtilities.getDominantColor(bitmap); + if (editModeIconColor == Color.WHITE || editModeIconColor == 0) { + editModeIconColor = Theme.getColor(Theme.key_dialogTextGray2, resourcesProvider); + } + editModeIcon.setBackground(Theme.createRoundRectDrawable(dp(12), editModeIconColor)); + invalidate(); + } + return super.setImageBitmapByKey(drawable, key, type, memCache, guid); + } + }; imageView.setAspectFit(true); imageView.setAllowLoadingOnAttachedOnly(true); imageView.setLayerNum(1); @@ -92,7 +113,14 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. premiumIconView.setImageReceiver(imageView); premiumIconView.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4), AndroidUtilities.dp(4)); premiumIconView.setImageReceiver(imageView); - addView(premiumIconView, LayoutHelper.createFrame(24, 24, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0 ,0, 0, 0)); + addView(premiumIconView, LayoutHelper.createFrame(24, 24, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0, 0, 0)); + + editModeIcon = new ImageView(context); + editModeIcon.setImageResource(R.drawable.mini_more_dots); + editModeIcon.setPadding(dp(2), dp(2), dp(2), dp(2)); + editModeIcon.setBackground(Theme.createRoundRectDrawable(dp(12), Theme.getColor(Theme.key_dialogTextGray2, resourcesProvider))); + editModeIcon.setAlpha(0f); + addView(editModeIcon, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT)); setFocusable(true); } @@ -121,11 +149,11 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. } public void setSticker(TLRPC.Document document, Object parent, boolean showEmoji) { - setSticker(document, null, parent, null, showEmoji); + setSticker(document, null, parent, null, showEmoji, false); } public void setSticker(SendMessagesHelper.ImportingSticker path) { - setSticker(null, path, null, path.emoji, path.emoji != null); + setSticker(null, path, null, path.emoji, path.emoji != null, false); } public MessageObject.SendAnimationData getSendAnimationData() { @@ -144,10 +172,42 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. } public void setSticker(TLRPC.Document document, SendMessagesHelper.ImportingSticker path, Object parent, String emoji, boolean showEmoji) { + setSticker(document, path, parent, emoji, showEmoji, false); + } + + public void disableEditMode(boolean animate) { + if (animate) { + editModeIcon.animate().alpha(0f).scaleX(0.4f).scaleY(0.4f).setDuration(200).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); + } else { + editModeIcon.setAlpha(0f); + } + } + + public void enableEditMode(boolean animate) { + if (animate) { + editModeIcon.setAlpha(0f); + editModeIcon.setScaleX(0.4f); + editModeIcon.setScaleY(0.4f); + editModeIcon.animate().alpha(1f).scaleX(1f).scaleY(1f).setDuration(200).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); + } else { + editModeIcon.setAlpha(1f); + editModeIcon.setScaleX(1f); + editModeIcon.setScaleY(1f); + } + } + + public void setSticker(TLRPC.Document document, SendMessagesHelper.ImportingSticker path, Object parent, String emoji, boolean showEmoji, boolean editModeEnabled) { currentEmoji = emoji; isPremiumSticker = MessageObject.isPremiumSticker(document); drawInParentView = false; imageView.setColorFilter(null); + editModeIconColor = 0; + editModeIcon.setBackground(Theme.createRoundRectDrawable(dp(12), Theme.getColor(Theme.key_dialogTextGray2))); + if (editModeEnabled) { + enableEditMode(false); + } else { + disableEditMode(false); + } if (isPremiumSticker) { premiumIconView.setColor(Theme.getColor(Theme.key_windowBackgroundWhite)); premiumIconView.setWaitingImage(); @@ -190,7 +250,7 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. } else { if (svgThumb != null) { if (thumb != null) { - imageView.setImage(ImageLocation.getForDocument(thumb, document), imageFilter, svgThumb, "webp", parentObject, 1); + imageView.setImage(ImageLocation.getForDocument(thumb, document), imageFilter, svgThumb, "webp", parentObject, 1); } else { imageView.setImage(ImageLocation.getForDocument(document), imageFilter, svgThumb, "webp", parentObject, 1); } @@ -401,8 +461,9 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. int size = Math.min(AndroidUtilities.dp(STICKER_SIZE), Math.min(getMeasuredHeight(), getMeasuredWidth())); int cX = getMeasuredWidth() >> 1; int cY = getMeasuredHeight() >> 1; - imageView.setImageCoords(cX - size / 2f, cY - size / 2f , size, size); + imageView.setImageCoords(cX - size / 2f, cY - size / 2f, size, size); imageView.setAlpha(alpha * premiumAlpha); + if (scale != 1f) { canvas.save(); canvas.scale(scale, scale, cX, cY); @@ -412,5 +473,4 @@ public class StickerEmojiCell extends FrameLayout implements NotificationCenter. imageView.draw(canvas); } } - } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java index 0388ba27a..ce4cf523d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetCell.java @@ -349,7 +349,7 @@ public class StickerSetCell extends FrameLayout { boolean allowPlay = LiteMode.isEnabled(emojis ? LiteMode.FLAG_ANIMATED_EMOJI_KEYBOARD : LiteMode.FLAG_ANIMATED_STICKERS_KEYBOARD); String filter = "50_50" + (!allowPlay ? "_firstframe" : ""); - if (object instanceof TLRPC.Document && MessageObject.isAnimatedStickerDocument(sticker, true) || MessageObject.isVideoSticker(sticker)) { + if (object instanceof TLRPC.Document && (MessageObject.isAnimatedStickerDocument(sticker, true) || MessageObject.isVideoSticker(sticker))) { if (svgThumb != null) { imageView.setImage(ImageLocation.getForDocument(sticker), filter, svgThumb, 0, set); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetNameCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetNameCell.java index 5148fcd7c..c90069808 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetNameCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerSetNameCell.java @@ -8,6 +8,8 @@ package org.telegram.ui.Cells; +import static org.telegram.messenger.AndroidUtilities.dp; + import android.content.Context; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; @@ -21,10 +23,13 @@ import android.view.Gravity; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Emoji; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Components.ColorSpanUnderline; @@ -38,6 +43,7 @@ public class StickerSetNameCell extends FrameLayout { private TextView textView; private TextView urlTextView; + private TextView editView; private ImageView buttonView; private boolean empty; private boolean isEmoji; @@ -62,10 +68,14 @@ public class StickerSetNameCell extends FrameLayout { LayoutParams lp; + LinearLayout layout = new LinearLayout(context); + layout.setOrientation(LinearLayout.HORIZONTAL); + layout.setGravity(Gravity.CENTER); + textView = new TextView(context); textView.setTextColor(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); textView.setEllipsize(TextUtils.TruncateAt.END); textView.setSingleLine(true); if (emoji) { @@ -79,7 +89,23 @@ public class StickerSetNameCell extends FrameLayout { } else { lp = LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, emoji ? 5 : 15, 5, emoji ? 15 : 25, 0); } - addView(textView, lp); + addView(layout, lp); + layout.addView(textView); + + editView = new TextView(context); + editView.setTextColor(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); + editView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); + editView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + editView.setEllipsize(TextUtils.TruncateAt.END); + editView.setPadding(dp(6.33f), 0, dp(6.33f), 0); + editView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(9), + Theme.multAlpha(getThemedColor(Theme.key_chat_emojiPanelStickerSetName), .10f), + Theme.multAlpha(getThemedColor(Theme.key_chat_emojiPanelStickerSetName), .24f) + )); + editView.setGravity(Gravity.CENTER); + editView.setSingleLine(true); + layout.addView(editView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 5.33f, .66f, 0, 0)); + editView.setVisibility(View.GONE); urlTextView = new TextView(context); urlTextView.setTextColor(getThemedColor(Theme.key_chat_emojiPanelStickerSetName)); @@ -103,7 +129,7 @@ public class StickerSetNameCell extends FrameLayout { } else { lp = LayoutHelper.createFrame(24, 24, Gravity.TOP | Gravity.RIGHT, 0, 0, isEmoji ? 0 : 10, 0); } - buttonView.setTranslationY(AndroidUtilities.dp(4)); + buttonView.setTranslationY(dp(4)); addView(buttonView, lp); } @@ -155,7 +181,7 @@ public class StickerSetNameCell extends FrameLayout { if (searchLength != 0) { updateTextSearchSpan(); } else { - textView.setText(Emoji.replaceEmoji(text, textView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false)); + textView.setText(Emoji.replaceEmoji(text, textView.getPaint().getFontMetricsInt(), dp(14), false)); } if (resId != 0) { buttonView.setImageResource(resId); @@ -165,6 +191,13 @@ public class StickerSetNameCell extends FrameLayout { buttonView.setVisibility(INVISIBLE); } } + editView.setVisibility(View.GONE); + } + + public void setEdit(View.OnClickListener whenClickedEdit) { + editView.setVisibility(View.VISIBLE); + editView.setText(LocaleController.getString(R.string.EditPack)); + editView.setOnClickListener(whenClickedEdit); } private void updateTextSearchSpan() { @@ -174,7 +207,7 @@ public class StickerSetNameCell extends FrameLayout { builder.setSpan(new ForegroundColorSpan(getThemedColor(Theme.key_chat_emojiPanelStickerSetNameHighlight)), stickerSetNameSearchIndex, stickerSetNameSearchIndex + stickerSetNameSearchLength, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } catch (Exception ignore) { } - textView.setText(Emoji.replaceEmoji(builder, textView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false)); + textView.setText(Emoji.replaceEmoji(builder, textView.getPaint().getFontMetricsInt(), dp(14), false)); } } @@ -193,14 +226,14 @@ public class StickerSetNameCell extends FrameLayout { if (empty) { super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(1, MeasureSpec.EXACTLY)); } else { - super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(27), MeasureSpec.EXACTLY)); + super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(27), MeasureSpec.EXACTLY)); } } @Override protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { if (child == urlTextView) { - widthUsed += textView.getMeasuredWidth() + AndroidUtilities.dp(16); + widthUsed += textView.getMeasuredWidth() + dp(16); } super.measureChildWithMargins(child, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java index 19eeca4c9..1fb3230c5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java @@ -27,9 +27,12 @@ import android.widget.ImageView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.LocaleController; +import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AnimatedTextView; +import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RLottieDrawable; import org.telegram.ui.Components.RLottieImageView; @@ -61,6 +64,8 @@ public class TextCell extends FrameLayout { private float loadingProgress; private float drawLoadingProgress; + private AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable emojiDrawable; + private int lastWidth; public TextCell(Context context) { @@ -209,6 +214,16 @@ public class TextCell extends FrameLayout { } } + public void updateEmojiBounds() { + if (emojiDrawable == null) return; + emojiDrawable.setBounds( + getWidth() - emojiDrawable.getIntrinsicWidth() - AndroidUtilities.dp(18), + (getHeight() - emojiDrawable.getIntrinsicHeight()) / 2, + getWidth() - AndroidUtilities.dp(18), + (getHeight() + emojiDrawable.getIntrinsicHeight()) / 2 + ); + } + @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int height = bottom - top; @@ -266,9 +281,18 @@ public class TextCell extends FrameLayout { public void updateColors() { int textKey = textView.getTag() instanceof Integer ? (int) textView.getTag() : Theme.key_windowBackgroundWhiteBlackText; - textView.setTextColor(processColor(Theme.getColor(textKey, resourcesProvider))); + int textColor = Theme.getColor(textKey, resourcesProvider); + if (textKey != Theme.key_dialogTextBlack && textKey != Theme.key_windowBackgroundWhiteBlackText) { + textColor = processColor(textColor); + } + textView.setTextColor(textColor); if (imageView.getTag() instanceof Integer) { - imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor((int) imageView.getTag(), resourcesProvider), PorterDuff.Mode.MULTIPLY)); + int colorKey = (int) imageView.getTag(); + int color = Theme.getColor(colorKey, resourcesProvider); + if (colorKey != Theme.key_dialogIcon && colorKey != Theme.key_windowBackgroundWhiteGrayIcon) { + color = processColor(color); + } + imageView.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY)); } subtitleView.setTextColor(processColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider))); valueTextView.setTextColor(processColor(Theme.getColor(Theme.key_windowBackgroundWhiteValueText, resourcesProvider))); @@ -276,12 +300,13 @@ public class TextCell extends FrameLayout { } public void setColors(int icon, int text) { - textView.setTextColor(processColor(Theme.getColor(text, resourcesProvider))); + textView.setTextColor(Theme.getColor(text, resourcesProvider)); textView.setTag(text); if (icon >= 0) { imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(icon, resourcesProvider), PorterDuff.Mode.MULTIPLY)); imageView.setTag(icon); } + updateColors(); } private CharSequence valueText; @@ -297,6 +322,9 @@ public class TextCell extends FrameLayout { valueImageView.setVisibility(GONE); needDivider = divider; setWillNotDraw(!needDivider); + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setLockLevel(boolean plus, int level) { @@ -322,6 +350,9 @@ public class TextCell extends FrameLayout { imageView.setPadding(0, dp(7), 0, 0); needDivider = divider; setWillNotDraw(!needDivider); + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setTextAndColorfulIcon(CharSequence text, int resId, int color, boolean divider) { @@ -335,6 +366,9 @@ public class TextCell extends FrameLayout { valueImageView.setVisibility(GONE); needDivider = divider; setWillNotDraw(!needDivider); + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setTextAndIcon(String text, Drawable drawable, boolean divider) { @@ -355,6 +389,9 @@ public class TextCell extends FrameLayout { imageView.setPadding(0, dp(6), 0, 0); needDivider = divider; setWillNotDraw(!needDivider); + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setOffsetFromImage(int value) { @@ -384,6 +421,9 @@ public class TextCell extends FrameLayout { if (checkBox != null) { checkBox.setVisibility(GONE); } + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setValue(String value, boolean animated) { @@ -405,6 +445,9 @@ public class TextCell extends FrameLayout { if (checkBox != null) { checkBox.setVisibility(GONE); } + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setTextAndSpoilersValueAndIcon(String text, CharSequence value, int resId, boolean divider) { @@ -426,6 +469,9 @@ public class TextCell extends FrameLayout { if (checkBox != null) { checkBox.setVisibility(GONE); } + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setTextAndSpoilersValueAndColorfulIcon(String text, CharSequence value, int resId, int color, boolean divider) { @@ -443,6 +489,9 @@ public class TextCell extends FrameLayout { if (checkBox != null) { checkBox.setVisibility(GONE); } + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setTextAndValueAndIcon(CharSequence text, CharSequence value, int resId, boolean divider) { @@ -468,6 +517,9 @@ public class TextCell extends FrameLayout { if (checkBox != null) { checkBox.setVisibility(GONE); } + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public static CharSequence applyNewSpan(CharSequence str) { @@ -502,6 +554,9 @@ public class TextCell extends FrameLayout { checkBox.setChecked(checked, false); } setWillNotDraw(!needDivider); + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setTextAndCheckAndIcon(CharSequence text, boolean checked, int resId, boolean divider) { @@ -521,6 +576,9 @@ public class TextCell extends FrameLayout { imageView.setImageResource(resId); needDivider = divider; setWillNotDraw(!needDivider); + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setTextAndCheckAndIcon(String text, boolean checked, Drawable resDrawable, boolean divider) { @@ -540,6 +598,9 @@ public class TextCell extends FrameLayout { imageView.setImageDrawable(resDrawable); needDivider = divider; setWillNotDraw(!needDivider); + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } } public void setTextAndValueDrawable(String text, Drawable drawable, boolean divider) { @@ -559,6 +620,39 @@ public class TextCell extends FrameLayout { if (checkBox != null) { checkBox.setVisibility(GONE); } + if (emojiDrawable != null) { + emojiDrawable.set((Drawable) null, false); + } + } + + public void setTextAndSticker(CharSequence text, TLRPC.Document document, boolean divider) { + imageLeft = 21; + offsetFromImage = getOffsetFromImage(false); + textView.setText(text); + textView.setRightDrawable(null); + valueTextView.setText(valueText = null, false); + valueImageView.setVisibility(GONE); + valueTextView.setVisibility(GONE); + valueSpoilersTextView.setVisibility(GONE); + imageView.setVisibility(GONE); + imageView.setPadding(0, dp(7), 0, 0); + needDivider = divider; + setWillNotDraw(!needDivider); + if (checkBox != null) { + checkBox.setVisibility(GONE); + } + setValueSticker(document); + } + + public void setValueSticker(TLRPC.Document document) { + if (emojiDrawable == null) { + emojiDrawable = new AnimatedEmojiDrawable.SwapAnimatedEmojiDrawable(this, dp(30)); + if (attached) { + emojiDrawable.attach(); + } + } + emojiDrawable.set(document, AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES_LARGE, true); + invalidate(); } protected int getOffsetFromImage(boolean colourful) { @@ -658,12 +752,18 @@ public class TextCell extends FrameLayout { protected void onAttachedToWindow() { super.onAttachedToWindow(); attached = true; + if (emojiDrawable != null) { + emojiDrawable.attach(); + } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); attached = false; + if (emojiDrawable != null) { + emojiDrawable.detach(); + } } public void setDrawLoading(boolean drawLoading, int size, boolean animated) { @@ -734,9 +834,13 @@ public class TextCell extends FrameLayout { canvas.drawRoundRect(AndroidUtilities.rectTmp, dp(3), dp(3), paint); invalidate(); } - valueTextView.setAlpha(1f - drawLoadingProgress); - valueSpoilersTextView.setAlpha(1f - drawLoadingProgress); + valueTextView.setAlpha((1f - drawLoadingProgress) * (emojiDrawable == null ? 1f : 1f - emojiDrawable.isNotEmpty())); + valueSpoilersTextView.setAlpha((1f - drawLoadingProgress) * (emojiDrawable == null ? 1f : 1f - emojiDrawable.isNotEmpty())); super.dispatchDraw(canvas); + if (emojiDrawable != null) { + updateEmojiBounds(); + emojiDrawable.draw(canvas); + } } public void setSubtitle(CharSequence charSequence) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCheckCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCheckCell.java index e44c07a72..0137db4a9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCheckCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCheckCell.java @@ -33,6 +33,7 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.LocaleController; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.AvatarSpan; import org.telegram.ui.Components.AnimationProperties; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.LayoutHelper; @@ -164,6 +165,7 @@ public class TextCheckCell extends FrameLayout { } public void setTextAndCheck(CharSequence text, boolean checked, boolean divider) { + AvatarSpan.checkSpansParent(text, this); textView.setText(text); isMultiline = false; checkBox.setVisibility(View.VISIBLE); @@ -222,6 +224,7 @@ public class TextCheckCell extends FrameLayout { } public void setTextAndValueAndCheck(String text, String value, boolean checked, boolean multiline, boolean divider) { + AvatarSpan.checkSpansParent(text, this); textView.setText(text); valueTextView.setText(value); checkBox.setVisibility(View.VISIBLE); @@ -250,6 +253,7 @@ public class TextCheckCell extends FrameLayout { } public void setTextAndValue(String text, String value, boolean multiline, boolean divider) { + AvatarSpan.checkSpansParent(text, this); textView.setText(text); valueTextView.setText(value); checkBox.setVisibility(View.GONE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java index dac002634..3b471b914 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java @@ -8,11 +8,15 @@ package org.telegram.ui.Cells; +import static org.telegram.messenger.AndroidUtilities.dp; + import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.drawable.Drawable; +import android.text.Spannable; import android.text.TextUtils; +import android.text.style.ClickableSpan; import android.util.TypedValue; import android.view.Gravity; import android.view.HapticFeedbackConstants; @@ -27,12 +31,13 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.LinkSpanDrawable; public class TextDetailCell extends FrameLayout { - private final TextView textView; + public final LinkSpanDrawable.LinksTextView textView; public final LinkSpanDrawable.LinksTextView valueTextView; private final TextView showMoreTextView = null; private final ImageView imageView; @@ -54,8 +59,25 @@ public class TextDetailCell extends FrameLayout { super(context); this.resourcesProvider = resourcesProvider; - textView = new TextView(context); - textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + textView = new LinkSpanDrawable.LinksTextView(context, resourcesProvider) { + @Override + protected int processColor(int color) { + return TextDetailCell.this.processColor(color); + } + + @Override + public int overrideColor() { + return processColor(super.overrideColor()); + } + }; + textView.setOnLinkLongPressListener(span -> { + if (span != null) { + try { + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + } catch (Exception ignore) {}; + span.onClick(textView); + } + }); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); textView.setLines(1); @@ -63,9 +85,19 @@ public class TextDetailCell extends FrameLayout { textView.setSingleLine(true); textView.setEllipsize(TextUtils.TruncateAt.END); textView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); - addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 23, 8, 23, 0)); + textView.setPadding(dp(6), dp(2), dp(6), dp(5)); + addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 23 - 6, 8 - 2, 23 - 6, 0)); - valueTextView = new LinkSpanDrawable.LinksTextView(context); + valueTextView = new LinkSpanDrawable.LinksTextView(context, resourcesProvider) { + @Override + protected int processColor(int color) { + return TextDetailCell.this.processColor(color); + } + @Override + public int overrideColor() { + return processColor(super.overrideColor()); + } + }; valueTextView.setOnLinkLongPressListener(span -> { if (span != null) { try { @@ -75,17 +107,19 @@ public class TextDetailCell extends FrameLayout { } }); if (this.multiline = multiline) { - setMinimumHeight(AndroidUtilities.dp(60)); + setMinimumHeight(dp(60)); } else { valueTextView.setLines(1); valueTextView.setSingleLine(true); } - valueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider)); valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); valueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); valueTextView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); valueTextView.setEllipsize(TextUtils.TruncateAt.END); - addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 23, 33, 23, 10)); + valueTextView.setPadding(0, dp(1), 0, dp(6)); + addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, 23, 33 - 1, 23, 10 - 6)); + + updateColors(); imageView = new ImageView(context); imageView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); @@ -93,9 +127,16 @@ public class TextDetailCell extends FrameLayout { addView(imageView, LayoutHelper.createFrameRelatively(48, 48, Gravity.END | Gravity.CENTER_VERTICAL, 0, 0, 12, 0)); } + protected int processColor(int color) { + return color; + } + @Override public boolean onTouchEvent(MotionEvent ev) { boolean hit = valueTextView.hit((int) ev.getX() - valueTextView.getLeft(), (int) ev.getY() - valueTextView.getTop()) != null; + if (!hit) { + hit = textView.hit((int) ev.getX() - textView.getLeft(), (int) ev.getY() - textView.getTop()) != null; + } if (hit) { return true; } @@ -106,7 +147,7 @@ public class TextDetailCell extends FrameLayout { protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure( MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), - multiline ? heightMeasureSpec : MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(60) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY) + multiline ? heightMeasureSpec : MeasureSpec.makeMeasureSpec(dp(60) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY) ); } @@ -122,7 +163,7 @@ public class TextDetailCell extends FrameLayout { } public void setImage(Drawable drawable, CharSequence imageContentDescription) { - ((MarginLayoutParams) valueTextView.getLayoutParams()).rightMargin = !LocaleController.isRTL && drawable != null ? AndroidUtilities.dp(28 + 12 + 12 + 6) : AndroidUtilities.dp(23); + ((MarginLayoutParams) valueTextView.getLayoutParams()).rightMargin = !LocaleController.isRTL && drawable != null ? dp(28 + 12 + 12 + 6) : dp(23); imageView.setImageDrawable(drawable); imageView.setFocusable(drawable != null); imageView.setContentDescription(imageContentDescription); @@ -130,10 +171,10 @@ public class TextDetailCell extends FrameLayout { imageView.setBackground(null); imageView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); } else { - imageView.setBackground(Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(48), Color.TRANSPARENT, Theme.getColor(Theme.key_listSelector, resourcesProvider))); + imageView.setBackground(Theme.createSimpleSelectorCircleDrawable(dp(48), Color.TRANSPARENT, Theme.getColor(Theme.key_listSelector, resourcesProvider))); imageView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); } - int margin = AndroidUtilities.dp(23) + (drawable == null ? 0 : AndroidUtilities.dp(48)); + int margin = dp(23) + (drawable == null ? 0 : dp(48)); if (LocaleController.isRTL) { ((MarginLayoutParams) textView.getLayoutParams()).leftMargin = margin; } else { @@ -142,6 +183,14 @@ public class TextDetailCell extends FrameLayout { textView.requestLayout(); } + public boolean hasImage() { + return imageView.getDrawable() != null; + } + + public ImageView getImageView() { + return imageView; + } + public void setImageClickListener(View.OnClickListener clickListener) { imageView.setOnClickListener(clickListener); if (clickListener == null) { @@ -150,7 +199,7 @@ public class TextDetailCell extends FrameLayout { } public void setTextWithEmojiAndValue(CharSequence text, CharSequence value, boolean divider) { - textView.setText(Emoji.replaceEmoji(text, textView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false)); + textView.setText(Emoji.replaceEmoji(text, textView.getPaint().getFontMetricsInt(), dp(14), false)); valueTextView.setText(value); needDivider = divider; setWillNotDraw(!divider); @@ -170,9 +219,9 @@ public class TextDetailCell extends FrameLayout { protected void onDraw(Canvas canvas) { if (needDivider) { canvas.drawLine( - LocaleController.isRTL ? 0 : AndroidUtilities.dp(20), + LocaleController.isRTL ? 0 : dp(20), getMeasuredHeight() - 1, - getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(20) : 0), + getMeasuredWidth() - (LocaleController.isRTL ? dp(20) : 0), getMeasuredHeight() - 1, Theme.dividerPaint ); @@ -188,4 +237,13 @@ public class TextDetailCell extends FrameLayout { info.setText((contentDescriptionValueFirst ? valueText : text) + ": " + (contentDescriptionValueFirst ? text : valueText)); } } + + public void updateColors() { + textView.setLinkTextColor(processColor(Theme.getColor(Theme.key_chat_messageLinkIn, resourcesProvider))); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + textView.invalidate(); + valueTextView.setLinkTextColor(processColor(Theme.getColor(Theme.key_chat_messageLinkIn, resourcesProvider))); + valueTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider)); + valueTextView.invalidate(); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java index b11c1f6eb..f45fbd174 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java @@ -140,6 +140,10 @@ public class TextInfoPrivacyCell extends FrameLayout { fixedSize = size; } + public CharSequence getText() { + return textView.getText(); + } + public void setText(CharSequence text) { if (!TextUtils.equals(text, this.text)) { this.text = text; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextRightIconCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextRightIconCell.java new file mode 100644 index 000000000..c0a3b7a70 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextRightIconCell.java @@ -0,0 +1,60 @@ +package org.telegram.ui.Cells; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.view.Gravity; +import android.widget.FrameLayout; +import android.widget.ImageView; + +import org.telegram.ui.ActionBar.SimpleTextView; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.LayoutHelper; + +public class TextRightIconCell extends FrameLayout { + private final ImageView ivIcon; + private final SimpleTextView textView; + private final Theme.ResourcesProvider resourcesProvider; + private boolean needDivider; + + public TextRightIconCell(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + this.resourcesProvider = resourcesProvider; + + textView = new SimpleTextView(context); + textView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack, resourcesProvider)); + textView.setTextSize(16); + textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); + addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.CENTER_VERTICAL, 22, 0, 56, 0)); + + ivIcon = new ImageView(context); + ivIcon.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText5, resourcesProvider), PorterDuff.Mode.SRC_IN)); + addView(ivIcon, LayoutHelper.createFrame(24, 24, Gravity.CENTER_VERTICAL | Gravity.END, 0, 0, 16, 0)); + setBackground(Theme.AdaptiveRipple.filledRectByKey(Theme.key_dialogBackground)); + } + + public void setTextAndIcon(CharSequence text, int iconRes) { + textView.setText(text); + ivIcon.setImageResource(iconRes); + } + + public void setDivider(boolean needDivider) { + this.needDivider = needDivider; + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (needDivider) { + Paint paint = resourcesProvider != null ? resourcesProvider.getPaint(Theme.key_paint_divider) : null; + if (paint == null) { + paint = Theme.dividerPaint; + } + canvas.drawLine(dp(22), getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, paint); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java index 106f2a4b6..24b91d6af 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextSelectionHelper.java @@ -933,9 +933,7 @@ public abstract class TextSelectionHelper= Build.VERSION_CODES.O_MR1) { - textSelectionOverlay.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } + AndroidUtilities.vibrateCursor(textSelectionOverlay); TextSelectionHelper.this.invalidate(); } else if (Layout.DIR_RIGHT_TO_LEFT == layoutNew.getParagraphDirection(layoutNew.getLineForOffset(newSelection)) || layoutNew.isRtlCharAt(newSelection) || nextWhitespaceLine != currentLine || newSelectionLine != nextWhitespaceLine) { selectionStart = newSelection; @@ -945,9 +943,7 @@ public abstract class TextSelectionHelper= Build.VERSION_CODES.O_MR1) { - textSelectionOverlay.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } + AndroidUtilities.vibrateCursor(textSelectionOverlay); TextSelectionHelper.this.invalidate(); } else { int previousWhitespace = newSelection; @@ -996,9 +992,7 @@ public abstract class TextSelectionHelper= Build.VERSION_CODES.O_MR1) { - textSelectionOverlay.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } + AndroidUtilities.vibrateCursor(textSelectionOverlay); TextSelectionHelper.this.invalidate(); } } @@ -1034,9 +1028,7 @@ public abstract class TextSelectionHelper= Build.VERSION_CODES.O_MR1) { - textSelectionOverlay.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } + AndroidUtilities.vibrateCursor(textSelectionOverlay); TextSelectionHelper.this.invalidate(); } else if (Layout.DIR_RIGHT_TO_LEFT == layoutNew.getParagraphDirection(layoutNew.getLineForOffset(newSelection)) || layoutNew.isRtlCharAt(newSelection) || currentLine != nextWhitespaceLine || newSelectionLine != nextWhitespaceLine) { selectionEnd = newSelection; @@ -1046,9 +1038,7 @@ public abstract class TextSelectionHelper= Build.VERSION_CODES.O_MR1) { - textSelectionOverlay.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } + AndroidUtilities.vibrateCursor(textSelectionOverlay); TextSelectionHelper.this.invalidate(); } else { int previousWhitespace = newSelection; @@ -1078,9 +1068,7 @@ public abstract class TextSelectionHelper= Build.VERSION_CODES.O_MR1) { - textSelectionOverlay.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } + AndroidUtilities.vibrateCursor(textSelectionOverlay); TextSelectionHelper.this.invalidate(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java index f86e22bf9..823b32079 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java @@ -17,6 +17,7 @@ import android.graphics.drawable.Drawable; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; +import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import android.widget.ImageView; @@ -61,6 +62,7 @@ public class UserCell extends FrameLayout implements NotificationCenter.Notifica private ImageView imageView; private CheckBox2 checkBox; private CheckBoxSquare checkBoxBig; + private ImageView checkBox3; private TextView adminTextView; private TextView addButton; private Drawable premiumDrawable; @@ -196,6 +198,13 @@ public class UserCell extends FrameLayout implements NotificationCenter.Notifica checkBox.setDrawBackgroundAsArc(3); checkBox.setColor(-1, Theme.key_windowBackgroundWhite, Theme.key_checkboxCheck); addView(checkBox, LayoutHelper.createFrame(24, 24, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 0 : 37 + padding, 36, LocaleController.isRTL ? 37 + padding : 0, 0)); + } else if (checkbox == 3) { + checkBox3 = new ImageView(context); + checkBox3.setScaleType(ImageView.ScaleType.CENTER); + checkBox3.setImageResource(R.drawable.account_check); + checkBox3.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider), PorterDuff.Mode.MULTIPLY)); + checkBox3.setVisibility(View.GONE); + addView(checkBox3, LayoutHelper.createFrame(24, 24, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, LocaleController.isRTL ? 10 + padding : 0, 0, LocaleController.isRTL ? 0 : 10 + padding, 0)); } if (admin) { @@ -390,6 +399,8 @@ public class UserCell extends FrameLayout implements NotificationCenter.Notifica checkBoxBig.setVisibility(VISIBLE); } checkBoxBig.setChecked(checked, animated); + } else if (checkBox3 != null) { + checkBox3.setVisibility(checked ? View.VISIBLE : View.GONE); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java new file mode 100644 index 000000000..eda310db9 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java @@ -0,0 +1,1151 @@ +package org.telegram.ui; + +import static org.telegram.messenger.AndroidUtilities.REPLACING_TAG_TYPE_LINK_NBSP; +import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.AndroidUtilities.dpf2; +import static org.telegram.messenger.AndroidUtilities.makeBlurBitmap; +import static org.telegram.messenger.LocaleController.formatPluralString; +import static org.telegram.messenger.LocaleController.formatString; +import static org.telegram.messenger.LocaleController.getString; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; +import android.text.Editable; +import android.text.InputType; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.text.style.DynamicDrawableSpan; +import android.text.style.RelativeSizeSpan; +import android.util.Base64; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import org.telegram.messenger.AccountInstance; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BillingController; +import org.telegram.messenger.BuildVars; +import org.telegram.messenger.ChatObject; +import org.telegram.messenger.Emoji; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.UserObject; +import org.telegram.messenger.browser.Browser; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; +import org.telegram.tgnet.tl.TL_stats; +import org.telegram.tgnet.tl.TL_stories; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AlertsCreator; +import org.telegram.ui.Components.AnimatedEmojiDrawable; +import org.telegram.ui.Components.AnimatedEmojiSpan; +import org.telegram.ui.Components.AnimatedTextView; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.CircularProgressDrawable; +import org.telegram.ui.Components.ColoredImageSpan; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.EditTextBoldCursor; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LinkSpanDrawable; +import org.telegram.ui.Components.OutlineTextContainerView; +import org.telegram.ui.Components.Premium.LimitReachedBottomSheet; +import org.telegram.ui.Components.RLottieImageView; +import org.telegram.ui.Components.UItem; +import org.telegram.ui.Components.UniversalAdapter; +import org.telegram.ui.Components.UniversalRecyclerView; +import org.telegram.ui.Stories.recorder.ButtonWithCounterView; +import org.telegram.ui.Stories.recorder.HintView2; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Locale; + +public class ChannelMonetizationLayout extends FrameLayout { + + private final BaseFragment fragment; + private final Theme.ResourcesProvider resourcesProvider; + private final int currentAccount; + private final long dialogId; + private TL_stories.TL_premium_boostsStatus boostsStatus; + private int currentBoostLevel; + + private final CharSequence titleInfo; + private final CharSequence balanceInfo; + + private final LinearLayout balanceLayout; + private final RelativeSizeSpan balanceTitleSizeSpan; + private final AnimatedTextView balanceTitle; + private final AnimatedTextView balanceSubtitle; + private final ButtonWithCounterView balanceButton; + private int shakeDp = 4; + + private boolean transfering; + + private final UniversalRecyclerView listView; + private final FrameLayout progress; + + private DecimalFormat formatter; + + public ChannelMonetizationLayout( + Context context, + BaseFragment fragment, + int currentAccount, + long dialogId, + Theme.ResourcesProvider resourcesProvider + ) { + super(context); + + DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); + symbols.setDecimalSeparator('.'); + formatter = new DecimalFormat("#.##", symbols); + formatter.setMinimumFractionDigits(2); + formatter.setMaximumFractionDigits(12); + formatter.setGroupingUsed(false); + + this.fragment = fragment; + this.resourcesProvider = resourcesProvider; + + this.currentAccount = currentAccount; + this.dialogId = dialogId; + initLevel(); + loadTransactions(); + + titleInfo = AndroidUtilities.replaceArrows(AndroidUtilities.replaceSingleTag(formatString(R.string.MonetizationInfo, 50), -1, REPLACING_TAG_TYPE_LINK_NBSP, () -> { + showLearnSheet(); + }, resourcesProvider), true); + balanceInfo = AndroidUtilities.replaceArrows(AndroidUtilities.replaceSingleTag(getString(MessagesController.getInstance(currentAccount).channelRevenueWithdrawalEnabled ? R.string.MonetizationBalanceInfo : R.string.MonetizationBalanceInfoNotAvailable), -1, REPLACING_TAG_TYPE_LINK_NBSP, () -> { + showLearnSheet(); + }), true); + + setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray, resourcesProvider)); + + balanceLayout = new LinearLayout(context) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure( + MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), + heightMeasureSpec + ); + } + }; + balanceLayout.setOrientation(LinearLayout.VERTICAL); + balanceLayout.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite, resourcesProvider)); + balanceLayout.setPadding(0, 0, 0, dp(17)); + + balanceTitle = new AnimatedTextView(context, false, true, true); + balanceTitle.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + balanceTitle.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + balanceTitle.setTextSize(dp(32)); + balanceTitle.setGravity(Gravity.CENTER); + balanceTitleSizeSpan = new RelativeSizeSpan(65f / 96f); + balanceLayout.addView(balanceTitle, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 38, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 22, 15, 22, 0)); + + balanceSubtitle = new AnimatedTextView(context, true, true, true); + balanceSubtitle.setGravity(Gravity.CENTER); + balanceSubtitle.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + balanceSubtitle.setTextSize(dp(14)); + balanceLayout.addView(balanceSubtitle, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 17, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 22, 4, 22, 0)); + + final CircularProgressDrawable circularProgressDrawable = new CircularProgressDrawable(dp(15), dpf2(2), Theme.getColor(Theme.key_featuredStickers_buttonText, resourcesProvider)) { + @Override + public int getIntrinsicWidth() { + return dp(24); + } + @Override + public int getIntrinsicHeight() { + return dp(24); + } + }; + circularProgressDrawable.setBounds(0, 0, dp(24), dp(24)); + + balanceButton = new ButtonWithCounterView(context, resourcesProvider) { + @Override + protected boolean verifyDrawable(@NonNull Drawable who) { + return who == circularProgressDrawable || super.verifyDrawable(who); + } + }; + balanceButton.setEnabled(MessagesController.getInstance(currentAccount).channelRevenueWithdrawalEnabled); + circularProgressDrawable.setCallback(balanceButton); + balanceButton.setText(getString(R.string.MonetizationWithdraw), false); + balanceButton.setVisibility(View.GONE); + balanceButton.setOnClickListener(v -> { + if (!v.isEnabled()) { + return; + } + TwoStepVerificationActivity passwordFragment = new TwoStepVerificationActivity(); + passwordFragment.setDelegate(1, password -> initWithdraw(password, passwordFragment)); + fragment.presentFragment(passwordFragment); + }); + balanceLayout.addView(balanceButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.FILL_HORIZONTAL, 18, 13, 18, 0)); + + listView = new UniversalRecyclerView(fragment, this::fillItems, this::onClick, this::onLongClick); + addView(listView); + + LinearLayout progressLayout = new LinearLayout(context); + progressLayout.setOrientation(LinearLayout.VERTICAL); + + progress = new FrameLayout(context); + progress.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite, resourcesProvider)); + progress.addView(progressLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + + RLottieImageView imageView = new RLottieImageView(context); + imageView.setAutoRepeat(true); + imageView.setAnimation(R.raw.statistic_preload, 120, 120); + imageView.playAnimation(); + + TextView loadingTitle = new TextView(context); + loadingTitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + loadingTitle.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + loadingTitle.setTextColor(Theme.getColor(Theme.key_player_actionBarTitle)); + loadingTitle.setTag(Theme.key_player_actionBarTitle); + loadingTitle.setText(getString("LoadingStats", R.string.LoadingStats)); + loadingTitle.setGravity(Gravity.CENTER_HORIZONTAL); + + TextView loadingSubtitle = new TextView(context); + loadingSubtitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + loadingSubtitle.setTextColor(Theme.getColor(Theme.key_player_actionBarSubtitle)); + loadingSubtitle.setTag(Theme.key_player_actionBarSubtitle); + loadingSubtitle.setText(getString("LoadingStatsDescription", R.string.LoadingStatsDescription)); + loadingSubtitle.setGravity(Gravity.CENTER_HORIZONTAL); + + progressLayout.addView(imageView, LayoutHelper.createLinear(120, 120, Gravity.CENTER_HORIZONTAL, 0, 0, 0, 20)); + progressLayout.addView(loadingTitle, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 0, 0, 10)); + progressLayout.addView(loadingSubtitle, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL)); + + addView(progress, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); + } + + private void initWithdraw(TLRPC.InputCheckPasswordSRP password, TwoStepVerificationActivity passwordFragment) { + if (fragment == null) return; + Activity parentActivity = fragment.getParentActivity(); + TLRPC.User currentUser = UserConfig.getInstance(currentAccount).getCurrentUser(); + if (parentActivity == null || currentUser == null) return; + + TL_stats.TL_getBroadcastRevenueWithdrawalUrl req = new TL_stats.TL_getBroadcastRevenueWithdrawalUrl(); + req.channel = MessagesController.getInstance(currentAccount).getInputChannel(-dialogId); + req.password = password != null ? password : new TLRPC.TL_inputCheckPasswordEmpty(); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (error != null) { + if ("PASSWORD_MISSING".equals(error.text) || error.text.startsWith("PASSWORD_TOO_FRESH_") || error.text.startsWith("SESSION_TOO_FRESH_")) { + if (passwordFragment != null) { + passwordFragment.needHideProgress(); + } + AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity); + builder.setTitle(LocaleController.getString("EditAdminTransferAlertTitle", R.string.EditAdminTransferAlertTitle)); + + LinearLayout linearLayout = new LinearLayout(parentActivity); + linearLayout.setPadding(AndroidUtilities.dp(24), AndroidUtilities.dp(2), AndroidUtilities.dp(24), 0); + linearLayout.setOrientation(LinearLayout.VERTICAL); + builder.setView(linearLayout); + + TextView messageTextView = new TextView(parentActivity); + messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString(R.string.WithdrawChannelAlertText))); + linearLayout.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + + LinearLayout linearLayout2 = new LinearLayout(parentActivity); + linearLayout2.setOrientation(LinearLayout.HORIZONTAL); + linearLayout.addView(linearLayout2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 11, 0, 0)); + + ImageView dotImageView = new ImageView(parentActivity); + dotImageView.setImageResource(R.drawable.list_circle); + dotImageView.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(11) : 0, AndroidUtilities.dp(9), LocaleController.isRTL ? 0 : AndroidUtilities.dp(11), 0); + dotImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_dialogTextBlack), PorterDuff.Mode.MULTIPLY)); + + messageTextView = new TextView(parentActivity); + messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString("EditAdminTransferAlertText1", R.string.EditAdminTransferAlertText1))); + if (LocaleController.isRTL) { + linearLayout2.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + linearLayout2.addView(dotImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT)); + } else { + linearLayout2.addView(dotImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); + linearLayout2.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + } + + linearLayout2 = new LinearLayout(parentActivity); + linearLayout2.setOrientation(LinearLayout.HORIZONTAL); + linearLayout.addView(linearLayout2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 11, 0, 0)); + + dotImageView = new ImageView(parentActivity); + dotImageView.setImageResource(R.drawable.list_circle); + dotImageView.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(11) : 0, AndroidUtilities.dp(9), LocaleController.isRTL ? 0 : AndroidUtilities.dp(11), 0); + dotImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_dialogTextBlack), PorterDuff.Mode.MULTIPLY)); + + messageTextView = new TextView(parentActivity); + messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString("EditAdminTransferAlertText2", R.string.EditAdminTransferAlertText2))); + if (LocaleController.isRTL) { + linearLayout2.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + linearLayout2.addView(dotImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT)); + } else { + linearLayout2.addView(dotImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); + linearLayout2.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + } + + if ("PASSWORD_MISSING".equals(error.text)) { + builder.setPositiveButton(LocaleController.getString("EditAdminTransferSetPassword", R.string.EditAdminTransferSetPassword), (dialogInterface, i) -> fragment.presentFragment(new TwoStepVerificationSetupActivity(TwoStepVerificationSetupActivity.TYPE_INTRO, null))); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + } else { + messageTextView = new TextView(parentActivity); + messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + messageTextView.setText(LocaleController.getString("EditAdminTransferAlertText3", R.string.EditAdminTransferAlertText3)); + linearLayout.addView(messageTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 11, 0, 0)); + + builder.setNegativeButton(LocaleController.getString("OK", R.string.OK), null); + } + if (passwordFragment != null) { + passwordFragment.showDialog(builder.create()); + } else { + fragment.showDialog(builder.create()); + } + } else if ("SRP_ID_INVALID".equals(error.text)) { + TLRPC.TL_account_getPassword getPasswordReq = new TLRPC.TL_account_getPassword(); + ConnectionsManager.getInstance(currentAccount).sendRequest(getPasswordReq, (response2, error2) -> AndroidUtilities.runOnUIThread(() -> { + if (error2 == null) { + TLRPC.account_Password currentPassword = (TLRPC.account_Password) response2; + passwordFragment.setCurrentPasswordInfo(null, currentPassword); + TwoStepVerificationActivity.initPasswordNewAlgo(currentPassword); + initWithdraw(passwordFragment.getNewSrpPassword(), passwordFragment); + } + }), ConnectionsManager.RequestFlagWithoutLogin); + } else { + if (passwordFragment != null) { + passwordFragment.needHideProgress(); + passwordFragment.finishFragment(); + } + BulletinFactory.showError(error); + } + } else { + passwordFragment.needHideProgress(); + passwordFragment.finishFragment(); + if (response instanceof TL_stats.TL_broadcastRevenueWithdrawalUrl) { + Browser.openUrl(getContext(), ((TL_stats.TL_broadcastRevenueWithdrawalUrl) response).url); + } + } + })); + } + + private void setBalance(long crypto_amount, long amount) { + if (formatter == null) { + DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); + symbols.setDecimalSeparator('.'); + formatter = new DecimalFormat("#.##", symbols); + formatter.setMinimumFractionDigits(2); + formatter.setMaximumFractionDigits(6); + formatter.setGroupingUsed(false); + } + formatter.setMaximumFractionDigits(crypto_amount / 1_000_000_000.0 > 1.5 ? 2 : 6); + SpannableStringBuilder ssb = new SpannableStringBuilder(replaceTON("TON " + formatter.format(crypto_amount / 1_000_000_000.0), balanceTitle.getPaint())); + int index = TextUtils.indexOf(ssb, "."); + if (index >= 0) { + ssb.setSpan(balanceTitleSizeSpan, index, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + balanceTitle.setText(ssb); + balanceSubtitle.setText("~" + BillingController.getInstance().formatCurrency(amount, "USD")); + } + + private void initLevel() { + TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId); + if (chat != null) { + currentBoostLevel = chat.level; + } + MessagesController.getInstance(currentAccount).getBoostsController().getBoostsStats(dialogId, boostsStatus -> AndroidUtilities.runOnUIThread(() -> { + this.boostsStatus = boostsStatus; + if (boostsStatus != null) { + currentBoostLevel = boostsStatus.level; + } + if (listView != null && listView.adapter != null) { + listView.adapter.update(true); + } + })); + + TLObject req; + if (ChatObject.isMegagroup(chat)) { + return; + } else { + TL_stats.TL_getBroadcastRevenueStats getBroadcastStats = new TL_stats.TL_getBroadcastRevenueStats(); + getBroadcastStats.dark = Theme.isCurrentThemeDark(); + getBroadcastStats.channel = MessagesController.getInstance(currentAccount).getInputChannel(-dialogId); + req = getBroadcastStats; + } + int stats_dc = -1; + TLRPC.ChatFull chatFull = MessagesController.getInstance(currentAccount).getChatFull(-dialogId); + if (chatFull != null) { + stats_dc = chatFull.stats_dc; + switchOffValue = chatFull.restricted_sponsored; + } + if (stats_dc == -1) return; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TL_stats.TL_broadcastRevenueStats) { + TL_stats.TL_broadcastRevenueStats stats = (TL_stats.TL_broadcastRevenueStats) res; + + impressionsChart = StatisticActivity.createViewData(stats.top_hours_graph, getString(R.string.MonetizationGraphImpressions), 0); + if (stats.revenue_graph != null) { + stats.revenue_graph.rate = (float) (1_000_000_000.0 / 100.0 / stats.usd_rate); + } + revenueChart = StatisticActivity.createViewData(stats.revenue_graph, getString(R.string.MonetizationGraphRevenue), 2); + if (impressionsChart != null) { + impressionsChart.useHourFormat = true; + } + + availableValue.crypto_amount = stats.available_balance; + availableValue.amount = (long) (availableValue.crypto_amount / 1_000_000_000.0 * stats.usd_rate * 100.0); + setBalance(availableValue.crypto_amount, availableValue.amount); + availableValue.currency = "USD"; + lastWithdrawalValue.crypto_amount = stats.current_balance; + lastWithdrawalValue.amount = (long) (lastWithdrawalValue.crypto_amount / 1_000_000_000.0 * stats.usd_rate * 100.0); + lastWithdrawalValue.currency = "USD"; + lifetimeValue.crypto_amount = stats.overall_revenue; + lifetimeValue.amount = (long) (lifetimeValue.crypto_amount / 1_000_000_000.0 * stats.usd_rate * 100.0); + lifetimeValue.currency = "USD"; + proceedsAvailable = true; + + balanceButton.setVisibility(stats.available_balance > 0 || BuildVars.DEBUG_PRIVATE_VERSION ? View.VISIBLE : View.GONE); + + if (listView != null && listView.adapter != null) { + listView.adapter.update(true); + } + + progress.animate().alpha(0).setDuration(380).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).withEndAction(() -> { + progress.setVisibility(View.GONE); + }).start(); + + checkLearnSheet(); + } + }), null, null, 0, stats_dc, ConnectionsManager.ConnectionTypeGeneric, true); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + checkLearnSheet(); + } + + private void checkLearnSheet() { + if (isAttachedToWindow() && proceedsAvailable && MessagesController.getGlobalMainSettings().getBoolean("monetizationadshint", true)) { + showLearnSheet(); + MessagesController.getGlobalMainSettings().edit().putBoolean("monetizationadshint", false).apply(); + } + } + + private boolean switchOffValue = false; + + private StatisticActivity.ChartViewData impressionsChart; + private StatisticActivity.ChartViewData revenueChart; + private boolean proceedsAvailable = false; + private final ProceedOverview availableValue = ProceedOverview.as(getString(R.string.MonetizationOverviewAvailable)); + private final ProceedOverview lastWithdrawalValue = ProceedOverview.as(getString(R.string.MonetizationOverviewLastWithdrawal)); + private final ProceedOverview lifetimeValue = ProceedOverview.as(getString(R.string.MonetizationOverviewTotal)); + + private final ArrayList transactions = new ArrayList<>(); + private int transactionsTotalCount; + + private final static int CHECK_SWITCHOFF = 1; + private final static int BUTTON_LOAD_MORE_TRANSACTIONS = 2; + + private void fillItems(ArrayList items, UniversalAdapter adapter) { + int stats_dc = -1; + TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId); + TLRPC.ChatFull chatFull = MessagesController.getInstance(currentAccount).getChatFull(-dialogId); + if (chatFull != null) { + stats_dc = chatFull.stats_dc; + } + items.add(UItem.asCenterShadow(titleInfo)); + if (impressionsChart != null && !impressionsChart.isEmpty) { + items.add(UItem.asChart(StatisticActivity.VIEW_TYPE_LINEAR, stats_dc, impressionsChart)); + items.add(UItem.asShadow(-1, null)); + } + if (revenueChart != null && !revenueChart.isEmpty) { + items.add(UItem.asChart(StatisticActivity.VIEW_TYPE_STACKBAR, stats_dc, revenueChart)); + items.add(UItem.asShadow(-2, null)); + } + if (proceedsAvailable) { + items.add(UItem.asBlackHeader(getString(R.string.MonetizationOverview))); + items.add(UItem.asProceedOverview(availableValue)); + items.add(UItem.asProceedOverview(lastWithdrawalValue)); + items.add(UItem.asProceedOverview(lifetimeValue)); + items.add(UItem.asShadow(-3, null)); + } + if (chat != null && chat.creator) { + items.add(UItem.asBlackHeader(getString(R.string.MonetizationBalance))); + items.add(UItem.asCustom(balanceLayout)); + items.add(UItem.asShadow(-4, balanceInfo)); + } + if (!transactions.isEmpty() || transactionsTotalCount > 0) { + items.add(UItem.asBlackHeader(getString(R.string.MonetizationTransactions))); + for (TL_stats.BroadcastRevenueTransaction t : transactions) { + items.add(UItem.asTransaction(t)); + } + if (transactionsTotalCount - transactions.size() > 0) { + items.add(UItem.asButton(BUTTON_LOAD_MORE_TRANSACTIONS, R.drawable.arrow_more, formatPluralString("MonetizationMoreTransactions", transactionsTotalCount - transactions.size())).accent()); + } + items.add(UItem.asShadow(-5, null)); + } + if (chat != null && chat.creator) { + final int switchOffLevel = MessagesController.getInstance(currentAccount).channelRestrictSponsoredLevelMin; + items.add(UItem.asCheck(CHECK_SWITCHOFF, PeerColorActivity.withLevelLock(getString(R.string.MonetizationSwitchOff), currentBoostLevel < switchOffLevel ? switchOffLevel : 0)).setChecked(currentBoostLevel >= switchOffLevel && switchOffValue)); + items.add(UItem.asShadow(-6, getString(R.string.MonetizationSwitchOffInfo))); + } + items.add(UItem.asShadow(-7, null)); + items.add(UItem.asShadow(-8, null)); + } + + private void onClick(UItem item, View view, int position, float x, float y) { + if (item.id == CHECK_SWITCHOFF) { + if (currentBoostLevel < MessagesController.getInstance(currentAccount).channelRestrictSponsoredLevelMin) { + if (boostsStatus == null) return; + LimitReachedBottomSheet sheet = new LimitReachedBottomSheet(fragment, getContext(), LimitReachedBottomSheet.TYPE_BOOSTS_FOR_ADS, currentAccount, resourcesProvider); + sheet.setDialogId(dialogId); + sheet.setBoostsStats(boostsStatus, true); + MessagesController.getInstance(currentAccount).getBoostsController().userCanBoostChannel(dialogId, boostsStatus, canApplyBoost -> { + sheet.setCanApplyBoost(canApplyBoost); + fragment.showDialog(sheet); + }); + return; + } + switchOffValue = !switchOffValue; + AndroidUtilities.cancelRunOnUIThread(sendCpmUpdateRunnable); + AndroidUtilities.runOnUIThread(sendCpmUpdateRunnable, 1000); + listView.adapter.update(true); + } else if (item.object instanceof TL_stats.BroadcastRevenueTransaction) { + showTransactionSheet((TL_stats.BroadcastRevenueTransaction) item.object, dialogId); + } else if (item.id == BUTTON_LOAD_MORE_TRANSACTIONS) { + loadTransactions(); + } + } + + private boolean loadingTransactions = false; + private void loadTransactions() { + if (loadingTransactions) return; + if (transactions.size() >= transactionsTotalCount && transactionsTotalCount != 0) return; + TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId); + if (chat == null || !chat.creator) { + return; + } + + loadingTransactions = true; + TL_stats.TL_getBroadcastRevenueTransactions req = new TL_stats.TL_getBroadcastRevenueTransactions(); + req.channel = MessagesController.getInstance(currentAccount).getInputChannel(-dialogId); + req.offset = transactions.size(); + req.limit = transactions.isEmpty() ? 5 : 20; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TL_stats.TL_broadcastRevenueTransactions) { + TL_stats.TL_broadcastRevenueTransactions r = (TL_stats.TL_broadcastRevenueTransactions) res; + transactionsTotalCount = r.count; + transactions.addAll(r.transactions); + + if (listView != null) { + listView.adapter.update(true); + } + loadingTransactions = false; + } else if (err != null) { + BulletinFactory.showError(err); + } + })); + } + + private final Runnable sendCpmUpdateRunnable = this::sendCpmUpdate; + private void sendCpmUpdate() { + AndroidUtilities.cancelRunOnUIThread(sendCpmUpdateRunnable); + + TLRPC.TL_channels_restrictSponsoredMessages req = new TLRPC.TL_channels_restrictSponsoredMessages(); + req.channel = MessagesController.getInstance(currentAccount).getInputChannel(-dialogId); + req.restricted = switchOffValue; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (err != null) { + BulletinFactory.showError(err); + } else if (res instanceof TLRPC.Updates) { + MessagesController.getInstance(currentAccount).processUpdates((TLRPC.Updates) res, false); + } + })); + } + + private boolean onLongClick(UItem item, View view, int position, float x, float y) { + return false; + } + + private static final long DIAMOND_EMOJI = 5471952986970267163L; + private static HashMap tonString; + public static CharSequence replaceTON(CharSequence text, TextPaint textPaint) { + return replaceTON(text, textPaint, 1f, true); + } + public static CharSequence replaceTON(CharSequence text, TextPaint textPaint, boolean animated) { + return replaceTON(text, textPaint, 1f, animated); + } + public static CharSequence replaceTON(CharSequence text, TextPaint textPaint, float scale, boolean animated) { + if (ChannelMonetizationLayout.tonString == null) { + ChannelMonetizationLayout.tonString = new HashMap<>(); + } + final int key = textPaint.getFontMetricsInt().bottom * (animated ? 1 : -1); + SpannableString tonString = ChannelMonetizationLayout.tonString.get(key); + if (tonString == null) { + tonString = new SpannableString("T"); + if (animated) { + AnimatedEmojiSpan span = new AnimatedEmojiSpan(DIAMOND_EMOJI, scale, textPaint.getFontMetricsInt()); + span.emoji = "๐Ÿ’Ž"; + span.cacheType = AnimatedEmojiDrawable.CACHE_TYPE_STANDARD_EMOJI; + tonString.setSpan(span, 0, tonString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } else { + ColoredImageSpan span = new ColoredImageSpan(R.drawable.mini_ton); + span.setTranslateY(-dp(.66f)); + span.spaceScaleX = .95f; + tonString.setSpan(span, 0, tonString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + ChannelMonetizationLayout.tonString.put(key, tonString); + } + text = AndroidUtilities.replaceMultipleCharSequence("TON", text, tonString); + return text; + } + + public static class ProceedOverviewCell extends LinearLayout { + + private final Theme.ResourcesProvider resourcesProvider; + + private final LinearLayout layout; + private final AnimatedEmojiSpan.TextViewEmojis cryptoAmountView; + private final TextView amountView; + private final TextView titleView; + + private final DecimalFormat formatter; + + public ProceedOverviewCell(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + this.resourcesProvider = resourcesProvider; + + setOrientation(VERTICAL); + + layout = new LinearLayout(context); + layout.setOrientation(HORIZONTAL); + addView(layout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 22, 9, 22, 0)); + + cryptoAmountView = new AnimatedEmojiSpan.TextViewEmojis(context); + cryptoAmountView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + cryptoAmountView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + cryptoAmountView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + layout.addView(cryptoAmountView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM, 0, 0, 5, 0)); + + amountView = new AnimatedEmojiSpan.TextViewEmojis(context); + amountView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + amountView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + layout.addView(amountView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM)); + + titleView = new TextView(context); + titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + addView(titleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.FILL_HORIZONTAL, 22, 5, 22, 9)); + + DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); + symbols.setDecimalSeparator('.'); + formatter = new DecimalFormat("#.##", symbols); + formatter.setMinimumFractionDigits(2); + formatter.setMaximumFractionDigits(12); + formatter.setGroupingUsed(false); + } + + public void set(ProceedOverview value) { + titleView.setText(value.text); + SpannableStringBuilder cryptoAmount = new SpannableStringBuilder(replaceTON("TON " + formatter.format(value.crypto_amount / 1_000_000_000.0), cryptoAmountView.getPaint(), .87f, true)); + int index = TextUtils.indexOf(cryptoAmount, "."); + if (index >= 0) { + cryptoAmount.setSpan(new RelativeSizeSpan(13f / 16f), index, cryptoAmount.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + cryptoAmountView.setText(cryptoAmount); + amountView.setText("~" + BillingController.getInstance().formatCurrency(value.amount, value.currency)); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), heightMeasureSpec); + } + } + + public static class ProceedOverview { + public CharSequence text; + public long crypto_amount; + public long amount; + public String currency; + + public static ProceedOverview as(CharSequence text) { + ProceedOverview o = new ProceedOverview(); + o.text = text; + return o; + } + } + + public static class TransactionCell extends FrameLayout { + + private final Theme.ResourcesProvider resourcesProvider; + + private final AnimatedEmojiSpan.TextViewEmojis valueText; + private final LinearLayout layout; + private final TextView titleView; +// private final TextView addressView; + private final TextView dateView; + + private final DecimalFormat formatter; + + public TransactionCell(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + this.resourcesProvider = resourcesProvider; + + layout = new LinearLayout(context); + layout.setOrientation(LinearLayout.VERTICAL); + addView(layout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.FILL, 17, 9, 130, 9)); + + titleView = new TextView(context); + titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + layout.addView(titleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + +// addressView = new TextView(context); +// addressView.setSingleLine(false); +// addressView.setLines(2); +// addressView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MONO)); +// addressView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); +// addressView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); +// layout.addView(addressView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 4, 0, 0)); + + dateView = new TextView(context); + dateView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + dateView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + layout.addView(dateView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 4, 0, 0)); + + valueText = new AnimatedEmojiSpan.TextViewEmojis(context); + valueText.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + valueText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + addView(valueText, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.RIGHT, 0, 0, 18, 0)); + + DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); + symbols.setDecimalSeparator('.'); + formatter = new DecimalFormat("#.##", symbols); + formatter.setMinimumFractionDigits(2); + formatter.setMaximumFractionDigits(12); + formatter.setGroupingUsed(false); + } + + private boolean needDivider; + + public void set(TL_stats.BroadcastRevenueTransaction transaction, boolean divider) { + int type; + long amount; + boolean failed = false; + if (transaction instanceof TL_stats.TL_broadcastRevenueTransactionWithdrawal) { + TL_stats.TL_broadcastRevenueTransactionWithdrawal t = (TL_stats.TL_broadcastRevenueTransactionWithdrawal) transaction; + titleView.setText(getString(R.string.MonetizationTransactionWithdraw)); + if (t.pending) { + dateView.setText(getString(R.string.MonetizationTransactionPending)); + } else { + failed = t.failed; + dateView.setText(LocaleController.formatShortDateTime(t.date) + (failed ? " โ€” " + getString(R.string.MonetizationTransactionNotCompleted) : "")); + } + amount = t.amount; + type = -1; + } else if (transaction instanceof TL_stats.TL_broadcastRevenueTransactionProceeds) { + TL_stats.TL_broadcastRevenueTransactionProceeds t = (TL_stats.TL_broadcastRevenueTransactionProceeds) transaction; + titleView.setText(getString(R.string.MonetizationTransactionProceed)); + dateView.setText(LocaleController.formatShortDateTime(t.from_date) + " - " + LocaleController.formatShortDateTime(t.to_date)); + amount = t.amount; + type = +1; + } else if (transaction instanceof TL_stats.TL_broadcastRevenueTransactionRefund) { + TL_stats.TL_broadcastRevenueTransactionRefund t = (TL_stats.TL_broadcastRevenueTransactionRefund) transaction; + titleView.setText(getString(R.string.MonetizationTransactionRefund)); + dateView.setText(LocaleController.formatShortDateTime(t.from_date)); + amount = t.amount; + type = +1; + } else { + return; + } + + dateView.setTextColor(Theme.getColor(failed ? Theme.key_text_RedRegular : Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + + SpannableStringBuilder value = new SpannableStringBuilder(); + value.append(type < 0 ? "-" : "+"); + value.append(formatter.format((Math.abs(amount) / 1_000_000_000.0))); + value.append(" TON"); + int index = TextUtils.indexOf(value, "."); + if (index >= 0) { + value.setSpan(new RelativeSizeSpan(1.15f), 0, index + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + valueText.setText(value); + valueText.setTextColor(Theme.getColor(type < 0 ? Theme.key_text_RedBold : Theme.key_avatar_nameInMessageGreen, resourcesProvider)); + + setWillNotDraw(!(needDivider = divider)); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (needDivider) { + Paint dividerPaint = resourcesProvider != null ? resourcesProvider.getPaint(Theme.key_paint_divider) : Theme.dividerPaint; + if (dividerPaint != null) { + canvas.drawLine(LocaleController.isRTL ? 0 : dp(17), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? dp(17) : 0), getMeasuredHeight() - 1, dividerPaint); + } + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), heightMeasureSpec); + } + } + + public static boolean validateTONAddress(String address) { + try { + byte[] bytes = Base64.decode(address, Base64.URL_SAFE); + if (bytes.length != 36) return false; + byte[] addr = Arrays.copyOfRange(bytes, 0, 34); + byte[] crc = Arrays.copyOfRange(bytes, 34, 36); + byte[] calculatedCrc = crc16(addr); + if ( + crc[0] != calculatedCrc[0] || + crc[1] != calculatedCrc[1] + ) { + return false; + } + boolean isTestOnly = true; + int tag = addr[0]; + if ((tag & 0x80) != 0) { + isTestOnly = false; + tag = tag ^ 0x80; + } + if (!BuildVars.DEBUG_VERSION && isTestOnly) { + return false; + } + if (tag != 0x11 && tag != 0x51) { + return false; + } + return true; + } catch (Exception e) { + FileLog.e(e); + } + return false; + } + + private static byte[] crc16(byte[] data) { + final int poly = 0x1021; + int reg = 0; + byte[] message = new byte[data.length + 2]; + System.arraycopy(data, 0, message, 0, data.length); + + for (byte b : message) { + int mask = 0x80; + while (mask > 0) { + reg <<= 1; + if ((b & mask) != 0) { + reg += 1; + } + mask >>= 1; + if (reg > 0xffff) { + reg &= 0xffff; + reg ^= poly; + } + } + } + + byte[] result = new byte[2]; + result[0] = (byte) ((reg >> 8) & 0xff); + result[1] = (byte) (reg & 0xff); + + return result; + } + + private void showTransactionSheet(TL_stats.BroadcastRevenueTransaction transaction, long dialogId) { + BottomSheet sheet = new BottomSheet(getContext(), false, resourcesProvider); + sheet.fixNavigationBar(); + + LinearLayout layout = new LinearLayout(getContext()); + layout.setOrientation(LinearLayout.VERTICAL); + + long dateFrom, dateTo; + CharSequence title; + int type; + long amount; + boolean pending = false; + boolean failed = false; + if (transaction instanceof TL_stats.TL_broadcastRevenueTransactionWithdrawal) { + TL_stats.TL_broadcastRevenueTransactionWithdrawal t = (TL_stats.TL_broadcastRevenueTransactionWithdrawal) transaction; + title = getString(R.string.MonetizationTransactionDetailWithdraw); + dateFrom = t.date; + dateTo = 0; + type = -1; + amount = t.amount; + pending = t.pending; + failed = t.failed; + } else if (transaction instanceof TL_stats.TL_broadcastRevenueTransactionProceeds) { + TL_stats.TL_broadcastRevenueTransactionProceeds t = (TL_stats.TL_broadcastRevenueTransactionProceeds) transaction; + title = getString(R.string.MonetizationTransactionDetailProceed); + dateFrom = t.from_date; + dateTo = t.to_date; + type = +1; + amount = t.amount; + } else if (transaction instanceof TL_stats.TL_broadcastRevenueTransactionRefund) { + TL_stats.TL_broadcastRevenueTransactionRefund t = (TL_stats.TL_broadcastRevenueTransactionRefund) transaction; + title = getString(R.string.MonetizationTransactionDetailRefund); + dateFrom = t.from_date; + dateTo = 0; + type = +1; + amount = t.amount; + } else { + return; + } + + TextView textView = new TextView(getContext()); + textView.setGravity(Gravity.CENTER); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + textView.setTextColor(Theme.getColor(type < 0 ? Theme.key_text_RedBold : Theme.key_avatar_nameInMessageGreen)); + SpannableStringBuilder amountText = new SpannableStringBuilder(); + amountText.append(type < 0 ? "-" : "+"); + amountText.append(formatter.format(Math.round(Math.abs(amount) / 1_000_000_000.0 * 100000.0) / 100000.0)); + amountText.append(" TON"); + int index = TextUtils.indexOf(amountText, "."); + if (index >= 0) { + amountText.setSpan(new RelativeSizeSpan(24f / 18f), 0, index, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + textView.setText(amountText); + layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 24, 0, 6)); + + textView = new TextView(getContext()); + textView.setGravity(Gravity.CENTER); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + if (pending) { + textView.setText(getString(R.string.MonetizationTransactionPending)); + } else if (dateFrom == 0) { + textView.setText(LocaleController.formatShortDateTime(dateTo)); + } else if (dateTo == 0) { + textView.setText(LocaleController.formatShortDateTime(dateFrom)); + } else { + textView.setText(LocaleController.formatShortDateTime(dateFrom) + " - " + LocaleController.formatShortDateTime(dateTo)); + } + if (failed) { + textView.setTextColor(Theme.getColor(Theme.key_text_RedBold, resourcesProvider)); + textView.setText(TextUtils.concat(textView.getText(), " โ€” ", getString(R.string.MonetizationTransactionNotCompleted))); + } + layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0, 0, 0)); + + textView = new TextView(getContext()); + textView.setGravity(Gravity.CENTER); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + textView.setText(title); + layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 27, 0, 0)); + +// if (transaction.type == Transaction.TYPE_WITHDRAW) { +// textView = new TextView(getContext()); +// textView.setPadding(dp(14), dp(8), dp(14), dp(8)); +// textView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(8), Theme.getColor(Theme.key_windowBackgroundGray, resourcesProvider), Theme.blendOver(Theme.getColor(Theme.key_windowBackgroundGray, resourcesProvider), Theme.getColor(Theme.key_listSelector, resourcesProvider)))); +// textView.setOnClickListener(v -> { +// AndroidUtilities.addToClipboard(transaction.address); +// BulletinFactory.of(sheet.getContainer(), resourcesProvider).createCopyBulletin(getString(R.string.TextCopied)).show(true); +// }); +// textView.setGravity(Gravity.CENTER); +// textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MONO)); +// textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); +// textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); +// int center = transaction.address.length() / 2; +// textView.setText(transaction.address.substring(0, center) + "\n" + transaction.address.substring(center)); +// layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 8, 0, 0)); +// } else { + if (transaction instanceof TL_stats.TL_broadcastRevenueTransactionProceeds) { + FrameLayout chipLayout = new FrameLayout(getContext()); + chipLayout.setBackground(Theme.createRoundRectDrawable(dp(28), dp(28), Theme.getColor(Theme.key_groupcreate_spanBackground, resourcesProvider))); + + String ownerName; + TLObject owner; + if (dialogId < 0) { + TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-dialogId); + ownerName = chat == null ? "" : chat.title; + owner = chat; + } else { + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(dialogId); + ownerName = UserObject.getUserName(user); + owner = user; + } + + BackupImageView chipAvatar = new BackupImageView(getContext()); + chipAvatar.setRoundRadius(dp(28)); + AvatarDrawable avatarDrawable = new AvatarDrawable(); + avatarDrawable.setInfo(owner); + chipAvatar.setForUserOrChat(owner, avatarDrawable); + chipLayout.addView(chipAvatar, LayoutHelper.createFrame(28, 28, Gravity.LEFT | Gravity.TOP)); + + TextView chipText = new TextView(getContext()); + chipText.setTextColor(Theme.getColor(Theme.key_dialogTextBlack, resourcesProvider)); + chipText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + chipText.setSingleLine(); + chipText.setText(ownerName); + chipLayout.addView(chipText, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.LEFT, 37, 0, 10, 0)); + + layout.addView(chipLayout, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 28, Gravity.CENTER_HORIZONTAL, 42, 10, 42, 0)); + } + + ButtonWithCounterView button = new ButtonWithCounterView(getContext(), resourcesProvider); + if (transaction instanceof TL_stats.TL_broadcastRevenueTransactionWithdrawal && (((TL_stats.TL_broadcastRevenueTransactionWithdrawal) transaction).flags & 2) != 0) { + TL_stats.TL_broadcastRevenueTransactionWithdrawal t = (TL_stats.TL_broadcastRevenueTransactionWithdrawal) transaction; + button.setText(getString(R.string.MonetizationTransactionDetailWithdrawButton), false); + button.setOnClickListener(v -> { + Browser.openUrl(getContext(), t.transaction_url); + }); + } else { + button.setText(getString(R.string.OK), false); + button.setOnClickListener(v -> { + sheet.dismiss(); + }); + } + layout.addView(button, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, Gravity.FILL_HORIZONTAL | Gravity.TOP, 18, 30, 18, 14)); + + sheet.setCustomView(layout); + + fragment.showDialog(sheet); + } + + private void showLearnSheet() { + BottomSheet sheet = new BottomSheet(getContext(), false, resourcesProvider); + sheet.fixNavigationBar(); + + LinearLayout layout = new LinearLayout(getContext()); + layout.setOrientation(LinearLayout.VERTICAL); + layout.setPadding(dp(8), 0, dp(8), 0); + + RLottieImageView imageView = new RLottieImageView(getContext()); + imageView.setScaleType(ImageView.ScaleType.CENTER); + imageView.setImageResource(R.drawable.large_monetize); + imageView.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)); + imageView.setBackground(Theme.createCircleDrawable(dp(80), Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider))); + layout.addView(imageView, LayoutHelper.createLinear(80, 80, Gravity.CENTER_HORIZONTAL, 0, 16, 0, 16)); + + TextView textView = new TextView(getContext()); + textView.setGravity(Gravity.CENTER); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + textView.setText(getString(R.string.MonetizationInfoTitle)); + layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 8, 0, 8, 25)); + + layout.addView( + new FeatureCell(getContext(), R.drawable.msg_channel, getString(R.string.MonetizationInfoFeature1Name), getString(R.string.MonetizationInfoFeature1Text)), + LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0, 0, 16) + ); + + layout.addView( + new FeatureCell(getContext(), R.drawable.menu_feature_split, getString(R.string.MonetizationInfoFeature2Name), getString(R.string.MonetizationInfoFeature2Text)), + LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0, 0, 16) + ); + + layout.addView( + new FeatureCell(getContext(), R.drawable.menu_feature_withdrawals, getString(R.string.MonetizationInfoFeature3Name), getString(R.string.MonetizationInfoFeature3Text)), + LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0, 0, 16) + ); + + View separator = new View(getContext()); + separator.setBackgroundColor(Theme.getColor(Theme.key_divider, resourcesProvider)); + layout.addView(separator, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 1f / AndroidUtilities.density, Gravity.TOP | Gravity.FILL_HORIZONTAL, 12, 0, 12, 0)); + + textView = new AnimatedEmojiSpan.TextViewEmojis(getContext()); + textView.setGravity(Gravity.CENTER); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + SpannableString animatedDiamond = new SpannableString("๐Ÿ’Ž"); + AnimatedEmojiSpan span = new AnimatedEmojiSpan(DIAMOND_EMOJI, .98f, textView.getPaint().getFontMetricsInt()); + span.emoji = "๐Ÿ’Ž"; + span.cacheType = AnimatedEmojiDrawable.CACHE_TYPE_ALERT_STANDARD_EMOJI; + animatedDiamond.setSpan(span, 0, animatedDiamond.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + textView.setText(AndroidUtilities.replaceCharSequence("๐Ÿ’Ž", getString(R.string.MonetizationInfoTONTitle), animatedDiamond)); + layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 8, 20, 8, 0)); + + textView = new LinkSpanDrawable.LinksTextView(getContext(), resourcesProvider); + textView.setGravity(Gravity.CENTER); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + textView.setLinkTextColor(Theme.getColor(Theme.key_chat_messageLinkIn, resourcesProvider)); + textView.setText(AndroidUtilities.withLearnMore(AndroidUtilities.replaceTags(getString(R.string.MonetizationInfoTONText)), () -> Browser.openUrl(getContext(), getString(R.string.MonetizationInfoTONLink)))); + layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 28, 9, 28, 0)); + + ButtonWithCounterView button = new ButtonWithCounterView(getContext(), resourcesProvider); + button.setText(getString(R.string.GotIt), false); + button.setOnClickListener(v -> { + sheet.dismiss(); + }); + layout.addView(button, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, Gravity.FILL_HORIZONTAL | Gravity.TOP, 10, 25, 10, 14)); + + sheet.setCustomView(layout); + + fragment.showDialog(sheet); + } + + private class FeatureCell extends FrameLayout { + public FeatureCell(Context context, int icon, CharSequence header, CharSequence text) { + super(context); + + ImageView imageView = new ImageView(context); + imageView.setScaleType(ImageView.ScaleType.CENTER); + imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider), PorterDuff.Mode.SRC_IN)); + imageView.setImageResource(icon); + addView(imageView, LayoutHelper.createFrame(24, 24, Gravity.TOP | Gravity.LEFT, 0, 5, 18, 0)); + + LinearLayout layout = new LinearLayout(context); + layout.setOrientation(LinearLayout.VERTICAL); + addView(layout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.FILL_HORIZONTAL, 42, 0, 0, 0)); + + TextView textView = new TextView(context); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + textView.setText(header); + layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0, 0, 2)); + + textView = new TextView(context); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText, resourcesProvider)); + textView.setText(text); + layout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0, 0, 0)); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(MeasureSpec.makeMeasureSpec(Math.min(MeasureSpec.getSize(widthMeasureSpec), dp(325)), MeasureSpec.getMode(widthMeasureSpec)), heightMeasureSpec); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Charts/BaseChartView.java b/TMessagesProj/src/main/java/org/telegram/ui/Charts/BaseChartView.java index 296c09793..1fab72022 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Charts/BaseChartView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Charts/BaseChartView.java @@ -52,7 +52,7 @@ public abstract class BaseChartView public final static float HORIZONTAL_PADDING = AndroidUtilities.dpf2(16f); private final static float LINE_WIDTH = 1; private final static float SELECTED_LINE_WIDTH = AndroidUtilities.dpf2(1.5f); - private final static float SIGNATURE_TEXT_SIZE = AndroidUtilities.dpf2(12f); + public final static float SIGNATURE_TEXT_SIZE = AndroidUtilities.dpf2(12f); public final static int SIGNATURE_TEXT_HEIGHT = AndroidUtilities.dp(18f); private final static int BOTTOM_SIGNATURE_TEXT_HEIGHT = AndroidUtilities.dp(14f); public final static int BOTTOM_SIGNATURE_START_ALPHA = AndroidUtilities.dp(10f); @@ -101,8 +101,8 @@ public abstract class BaseChartView Paint linePaint = new Paint(); Paint selectedLinePaint = new Paint(); - Paint signaturePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); - Paint signaturePaint2 = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); + TextPaint signaturePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); + TextPaint signaturePaint2 = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); Paint bottomSignaturePaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); Paint pickerSelectorPaint = new Paint(Paint.ANTI_ALIAS_FLAG); Paint unactiveBottomChartPaint = new Paint(); @@ -270,11 +270,8 @@ public abstract class BaseChartView } public void updateColors() { - if (useAlphaSignature) { - signaturePaint.setColor(Theme.getColor(Theme.key_statisticChartSignatureAlpha, resourcesProvider)); - } else { - signaturePaint.setColor(Theme.getColor(Theme.key_statisticChartSignature, resourcesProvider)); - } + signaturePaint.setColor(Theme.getColor(useAlphaSignature ? Theme.key_statisticChartSignatureAlpha : Theme.key_statisticChartSignature, resourcesProvider)); + signaturePaint2.setColor(Theme.getColor(useAlphaSignature ? Theme.key_statisticChartSignatureAlpha : Theme.key_statisticChartSignature, resourcesProvider)); bottomSignaturePaint.setColor(Theme.getColor(Theme.key_statisticChartSignature, resourcesProvider)); linePaint.setColor(Theme.getColor(Theme.key_statisticChartHintLine, resourcesProvider)); @@ -296,7 +293,7 @@ public abstract class BaseChartView } if (legendShowing && selectedIndex < chartData.x.length) { - legendSignatureView.setData(selectedIndex, chartData.x[selectedIndex], (ArrayList) lines, false); + legendSignatureView.setData(selectedIndex, chartData.x[selectedIndex], (ArrayList) lines, false, chartData.yTooltipFormatter); } invalidatePickerChart = true; @@ -503,6 +500,7 @@ public abstract class BaseChartView linePaint.setAlpha((int) (hintLinePaintAlpha * transitionAlpha)); signaturePaint.setAlpha((int) (255 * signaturePaintAlpha * transitionAlpha)); + signaturePaint2.setAlpha((int) (255 * signaturePaintAlpha * transitionAlpha)); int textOffset = (int) (SIGNATURE_TEXT_HEIGHT - signaturePaint.getTextSize()); int y = (getMeasuredHeight() - chartBottom - 1); canvas.drawLine( @@ -576,6 +574,7 @@ public abstract class BaseChartView } linePaint.setAlpha((int) (a.alpha * (hintLinePaintAlpha / 255f) * transitionAlpha * additionalOutAlpha)); signaturePaint.setAlpha((int) (a.alpha * signaturePaintAlpha * transitionAlpha * additionalOutAlpha)); + signaturePaint2.setAlpha((int) (a.alpha * signaturePaintAlpha * transitionAlpha * additionalOutAlpha)); int chartHeight = getMeasuredHeight() - chartBottom - SIGNATURE_TEXT_HEIGHT; for (int i = useMinHeight ? 0 : 1; i < n; i++) { int y = (int) ((getMeasuredHeight() - chartBottom) - chartHeight * ((a.values[i] - currentMinHeight) / (currentMaxHeight - currentMinHeight))); @@ -604,12 +603,16 @@ public abstract class BaseChartView } linePaint.setAlpha((int) (a.alpha * (hintLinePaintAlpha / 255f) * transitionAlpha * additionalOutAlpha)); signaturePaint.setAlpha((int) (a.alpha * signaturePaintAlpha * transitionAlpha * additionalOutAlpha)); + signaturePaint2.setAlpha((int) (a.alpha * signaturePaintAlpha * transitionAlpha * additionalOutAlpha)); int chartHeight = getMeasuredHeight() - chartBottom - SIGNATURE_TEXT_HEIGHT; int textOffset = (int) (SIGNATURE_TEXT_HEIGHT - signaturePaint.getTextSize()); for (int i = useMinHeight ? 0 : 1; i < n; i++) { int y = (int) ((getMeasuredHeight() - chartBottom) - chartHeight * ((a.values[i] - currentMinHeight) / (currentMaxHeight - currentMinHeight))); - canvas.drawText(a.valuesStr[i], HORIZONTAL_PADDING, y - textOffset, signaturePaint); + a.drawText(canvas, 0, i, HORIZONTAL_PADDING, y - textOffset, signaturePaint); + if (a.valuesStr2 != null) { + a.drawText(canvas, 1, i, getMeasuredWidth() - HORIZONTAL_PADDING, y - textOffset, signaturePaint2); + } } } @@ -807,7 +810,7 @@ public abstract class BaseChartView } if (!heightChanged && newMaxHeight == animateToMinHeight) return; - final ChartHorizontalLinesData newData = createHorizontalLinesData(newMaxHeight, newMinHeight); + final ChartHorizontalLinesData newData = createHorizontalLinesData(newMaxHeight, newMinHeight, chartData.yTickFormatter); newMaxHeight = newData.values[newData.values.length - 1]; newMinHeight = newData.values[0]; @@ -915,8 +918,8 @@ public abstract class BaseChartView alphaAnimator.start(); } - protected ChartHorizontalLinesData createHorizontalLinesData(int newMaxHeight, int newMinHeight) { - return new ChartHorizontalLinesData(newMaxHeight, newMinHeight, useMinHeight); + protected ChartHorizontalLinesData createHorizontalLinesData(int newMaxHeight, int newMinHeight, int formatter) { + return new ChartHorizontalLinesData(newMaxHeight, newMinHeight, useMinHeight, chartData.yRate, formatter, signaturePaint, signaturePaint2); } ValueAnimator createAnimator(float f1, float f2, ValueAnimator.AnimatorUpdateListener l) { @@ -1114,7 +1117,7 @@ public abstract class BaseChartView public void moveLegend(float offset) { if (chartData == null || selectedIndex == -1 || !legendShowing) return; - legendSignatureView.setData(selectedIndex, chartData.x[selectedIndex], (ArrayList) lines, false); + legendSignatureView.setData(selectedIndex, chartData.x[selectedIndex], (ArrayList) lines, false, chartData.yTooltipFormatter); legendSignatureView.setVisibility(VISIBLE); legendSignatureView.measure( MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.AT_MOST), @@ -1419,7 +1422,7 @@ public abstract class BaseChartView updatePickerMinMaxHeight(); if (legendShowing) - legendSignatureView.setData(selectedIndex, chartData.x[selectedIndex], (ArrayList) lines, true); + legendSignatureView.setData(selectedIndex, chartData.x[selectedIndex], (ArrayList) lines, true, chartData.yTooltipFormatter); } protected void updatePickerMinMaxHeight() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Charts/DoubleLinearChartView.java b/TMessagesProj/src/main/java/org/telegram/ui/Charts/DoubleLinearChartView.java index a604d66c0..2825ddae1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Charts/DoubleLinearChartView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Charts/DoubleLinearChartView.java @@ -251,12 +251,12 @@ public class DoubleLinearChartView extends BaseChartView 1) { signaturePaint2.setColor(lines.get(rightIndex).lineColor); signaturePaint2.setAlpha((int) (a.alpha * lines.get(rightIndex).alpha * transitionAlpha * additionalOutAlpha)); - canvas.drawText(a.valuesStr2[i], getMeasuredWidth() - HORIZONTAL_PADDING, y - textOffset, signaturePaint2); + a.drawText(canvas, 1, i, getMeasuredWidth() - HORIZONTAL_PADDING, y - textOffset, signaturePaint2); } } } @@ -323,7 +323,8 @@ public class DoubleLinearChartView extends BaseChartView { pieLegendView.setTranslationX(xl); pieLegendView.setTranslationY(yl); - - boolean v = false; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { - v = performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } - if (!v) { - performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } - + AndroidUtilities.vibrateCursor(this); } moveLegend(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Charts/data/ChartData.java b/TMessagesProj/src/main/java/org/telegram/ui/Charts/data/ChartData.java index c660dbb82..e3d8a0388 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Charts/data/ChartData.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Charts/data/ChartData.java @@ -29,6 +29,14 @@ public class ChartData { public float oneDayPercentage = 0f; + public static final int FORMATTER_TON = 1; + + public int xTickFormatter = 0; + public int xTooltipFormatter = 0; + public float yRate = 0; + public int yTickFormatter = 0; + public int yTooltipFormatter = 0; + protected ChartData() { } @@ -70,6 +78,13 @@ public class ChartData { JSONObject colors = jsonObject.optJSONObject("colors"); JSONObject names = jsonObject.optJSONObject("names"); + try { + xTickFormatter = getFormatter(jsonObject.getString("xTickFormatter")); + yTickFormatter = getFormatter(jsonObject.getString("yTickFormatter")); + xTooltipFormatter = getFormatter(jsonObject.getString("xTooltipFormatter")); + yTooltipFormatter = getFormatter(jsonObject.getString("yTooltipFormatter")); + } catch (Exception ignore) {} + Pattern colorPattern = Pattern.compile("(.*)(#.*)"); for (int i = 0; i < lines.size(); i++) { ChartData.Line line = lines.get(i); @@ -94,6 +109,12 @@ public class ChartData { } } + public int getFormatter(String value) { + if (TextUtils.isEmpty(value)) return 0; + if (value.contains("TON")) return FORMATTER_TON; + return 0; + } + protected void measure() { int n = x.length; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/ChartHeaderView.java b/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/ChartHeaderView.java index e982ca901..02bdf8bef 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/ChartHeaderView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/ChartHeaderView.java @@ -53,7 +53,7 @@ public class ChartHeaderView extends FrameLayout { title = new TextView(context); title.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - title.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + title.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); addView(title, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.START | Gravity.CENTER_VERTICAL, 16, 0, textMargin, 0)); back = new TextView(context); @@ -64,13 +64,13 @@ public class ChartHeaderView extends FrameLayout { dates = new TextView(context); dates.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); - dates.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + dates.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); dates.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); addView(dates, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.END | Gravity.CENTER_VERTICAL, 16, 0, 16, 0)); datesTmp = new TextView(context); datesTmp.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); - datesTmp.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + datesTmp.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); datesTmp.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); addView(datesTmp, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.END | Gravity.CENTER_VERTICAL, 16, 0, 16, 0)); datesTmp.setVisibility(View.GONE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/ChartHorizontalLinesData.java b/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/ChartHorizontalLinesData.java index 521358921..0e8ef682c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/ChartHorizontalLinesData.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/ChartHorizontalLinesData.java @@ -1,28 +1,47 @@ package org.telegram.ui.Charts.view_data; +import android.graphics.Canvas; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; + import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BillingController; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ChannelMonetizationLayout; +import org.telegram.ui.Charts.data.ChartData; +import org.telegram.ui.Components.AnimatedEmojiSpan; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; public class ChartHorizontalLinesData { public int[] values; - public String[] valuesStr; - public String[] valuesStr2; + public CharSequence[] valuesStr; + public CharSequence[] valuesStr2; + private StaticLayout[] layouts; + private StaticLayout[] layouts2; public int alpha; public int fixedAlpha = 255; - public ChartHorizontalLinesData(int newMaxHeight, int newMinHeight, boolean useMinHeight) { - this(newMaxHeight, newMinHeight, useMinHeight, 0); - } - - public ChartHorizontalLinesData(int newMaxHeight, int newMinHeight, boolean useMinHeight, float k) { + public ChartHorizontalLinesData( + int newMaxHeight, + int newMinHeight, + boolean useMinHeight, + float k, + int formatter, + TextPaint firstTextPaint, TextPaint secondTextPaint + ) { if (!useMinHeight) { int v = newMaxHeight; if (newMaxHeight > 100) { v = round(newMaxHeight); } - int step = Math.max(1, (int) Math.ceil(v / 5f)); + int step = Math.max(1, (int) Math.ceil(v / 5.0)); int n; if (v < 6) { @@ -37,11 +56,28 @@ public class ChartHorizontalLinesData { } values = new int[n]; - valuesStr = new String[n]; - + valuesStr = new CharSequence[n]; + layouts = new StaticLayout[n]; + if (k > 0) { + valuesStr2 = new CharSequence[n]; + layouts2 = new StaticLayout[n]; + } + boolean skipFloatValues = step / k < 1; for (int i = 1; i < n; i++) { values[i] = i * step; - valuesStr[i] = AndroidUtilities.formatWholeNumber(values[i], 0); + valuesStr[i] = format(0, firstTextPaint, values[i], formatter); + if (k > 0) { + float v2 = (values[i] / k); + if (skipFloatValues) { + if (v2 - ((int) v2) < 0.01f) { + valuesStr2[i] = format(1, secondTextPaint, (long) v2, formatter); + } else { + valuesStr2[i] = ""; + } + } else { + valuesStr2[i] = format(1, secondTextPaint, (long) v2, formatter); + } + } } } else { int n; @@ -68,28 +104,52 @@ public class ChartHorizontalLinesData { } values = new int[n]; - valuesStr = new String[n]; - if (k > 0) valuesStr2 = new String[n]; + valuesStr = new CharSequence[n]; + layouts = new StaticLayout[n]; + if (k > 0) { + valuesStr2 = new CharSequence[n]; + layouts2 = new StaticLayout[n]; + } boolean skipFloatValues = step / k < 1; for (int i = 0; i < n; i++) { values[i] = newMinHeight + (int) (i * step); - valuesStr[i] = AndroidUtilities.formatWholeNumber(values[i], 0); + valuesStr[i] = format(0, firstTextPaint, newMinHeight + (long) (i * step), formatter); if (k > 0) { float v = (values[i] / k); if (skipFloatValues) { if (v - ((int) v) < 0.01f) { - valuesStr2[i] = AndroidUtilities.formatWholeNumber((int) v, 0); + valuesStr2[i] = format(1, secondTextPaint, (long) v, formatter); } else { valuesStr2[i] = ""; } } else { - valuesStr2[i] = AndroidUtilities.formatWholeNumber((int) v, 0); + valuesStr2[i] = format(1, secondTextPaint, (long) v, formatter); } } } } } + private DecimalFormat formatterTON; + public CharSequence format(int a, TextPaint paint, long v, int formatter) { + if (formatter == ChartData.FORMATTER_TON) { + if (a == 1) { + return BillingController.getInstance().formatCurrency(v, "USD"); + } + if (formatterTON == null) { + DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); + symbols.setDecimalSeparator('.'); + formatterTON = new DecimalFormat("#.##", symbols); + formatterTON.setMinimumFractionDigits(2); + formatterTON.setMaximumFractionDigits(6); + formatterTON.setGroupingUsed(false); + } + formatterTON.setMaximumFractionDigits(v > 1_000_000_000 ? 2 : 6); + return ChannelMonetizationLayout.replaceTON("TON " + formatterTON.format(v / 1_000_000_000.0), paint, false); + } + return AndroidUtilities.formatWholeNumber((int) v, 0); + } + public static int lookupHeight(int maxValue) { int v = maxValue; if (maxValue > 100) { @@ -105,4 +165,23 @@ public class ChartHorizontalLinesData { if (k % 10 == 0) return maxValue; else return ((maxValue / 10 + 1) * 10); } + + public void drawText(Canvas canvas, int a, int i, float x, float y, TextPaint paint) { + StaticLayout layout = (a == 0 ? layouts : layouts2)[i]; + if (layout == null) { + CharSequence string = (a == 0 ? valuesStr : valuesStr2)[i]; + (a == 0 ? layouts : layouts2)[i] = layout = new StaticLayout( + string, + paint, + AndroidUtilities.displaySize.x, + Layout.Alignment.ALIGN_NORMAL, + 1f, 0f, false + ); + } + canvas.save(); + canvas.translate(x, y + paint.ascent()); + layout.draw(canvas); + canvas.restore(); + } + } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/LegendSignatureView.java b/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/LegendSignatureView.java index 056965b8c..c2f4bb89b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/LegendSignatureView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Charts/view_data/LegendSignatureView.java @@ -20,11 +20,15 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.R; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ChannelMonetizationLayout; import org.telegram.ui.Charts.data.ChartData; +import org.telegram.ui.Components.AnimatedEmojiSpan; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RadialProgressView; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -130,7 +134,13 @@ public class LegendSignatureView extends FrameLayout { } - public void setData(int index, long date, ArrayList lines, boolean animateChanges) { + public void setData( + int index, + long date, + ArrayList lines, + boolean animateChanges, + int formatter + ) { int n = holdes.length; if (animateChanges) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { @@ -172,7 +182,7 @@ public class LegendSignatureView extends FrameLayout { h.root.requestLayout(); } h.root.setVisibility(View.VISIBLE); - h.value.setText(formatWholeNumber(l.y[index])); + h.value.setText(formatWholeNumber(l.y[index], formatter, h.value)); h.signature.setText(l.name); if (l.colorKey >= 0 && Theme.hasThemeKey(l.colorKey)) { h.value.setTextColor(Theme.getColor(l.colorKey, resourcesProvider)); @@ -215,13 +225,26 @@ public class LegendSignatureView extends FrameLayout { } - public String formatWholeNumber(int v) { + private DecimalFormat formatterTON; + public CharSequence formatWholeNumber(int v, int formatter, TextView textView) { + if (formatter == ChartData.FORMATTER_TON) { + if (formatterTON == null) { + DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US); + symbols.setDecimalSeparator('.'); + formatterTON = new DecimalFormat("#.##", symbols); + formatterTON.setMinimumFractionDigits(2); + formatterTON.setMaximumFractionDigits(6); + formatterTON.setGroupingUsed(false); + } + formatterTON.setMaximumFractionDigits(v > 1_000_000_000 ? 2 : 6); + return ChannelMonetizationLayout.replaceTON("TON " + formatterTON.format(v / 1_000_000_000.), textView.getPaint(), false); + } float num_ = v; int count = 0; if (v < 10_000) { return String.format("%d", v); } - while (num_ >= 10_000 && count < AndroidUtilities.numbersSignatureArray.length - 1) { + while (num_ >= 1_000 && count < AndroidUtilities.numbersSignatureArray.length - 1) { num_ /= 1000; count++; } @@ -255,7 +278,7 @@ public class LegendSignatureView extends FrameLayout { } class Holder { - final TextView value; + final AnimatedEmojiSpan.TextViewEmojis value; final TextView signature; TextView percentage; final LinearLayout root; @@ -268,21 +291,21 @@ public class LegendSignatureView extends FrameLayout { root.addView(percentage = new TextView(getContext())); percentage.getLayoutParams().width = AndroidUtilities.dp(36); percentage.setVisibility(GONE); - percentage.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + percentage.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); percentage.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); } - root.addView(signature = new TextView(getContext())); - signature.getLayoutParams().width = showPercentage ? AndroidUtilities.dp(80) : AndroidUtilities.dp(96); - root.addView(value = new TextView(getContext()), LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + root.addView(signature = new TextView(getContext()), LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, 0, 20, 0)); +// signature.getLayoutParams().width = showPercentage ? AndroidUtilities.dp(80) : AndroidUtilities.dp(96); + root.addView(value = new AnimatedEmojiSpan.TextViewEmojis(getContext()), LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); signature.setGravity(Gravity.START); value.setGravity(Gravity.END); - value.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + value.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); value.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); - value.setMinEms(4); - value.setMaxEms(4); +// value.setMinEms(4); +// value.setMaxEms(4); signature.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 61cfb7626..23bbf7b13 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -9,6 +9,7 @@ package org.telegram.ui; import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.getString; import android.Manifest; import android.animation.Animator; @@ -193,9 +194,13 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Adapters.FiltersView; import org.telegram.ui.Adapters.MessagesSearchAdapter; -import org.telegram.ui.Business.BusinessChatEmptyView; +import org.telegram.ui.Business.BusinessBotButton; +import org.telegram.ui.Business.BusinessLinksActivity; +import org.telegram.ui.Business.BusinessLinksController; +import org.telegram.ui.Business.BusinessLinksEmptyView; import org.telegram.ui.Business.QuickRepliesActivity; import org.telegram.ui.Business.QuickRepliesController; +import org.telegram.ui.Business.QuickRepliesEmptyView; import org.telegram.ui.Cells.BotHelpCell; import org.telegram.ui.Cells.BotSwitchCell; import org.telegram.ui.Cells.ChatActionCell; @@ -206,6 +211,7 @@ import org.telegram.ui.Cells.CheckBoxCell; import org.telegram.ui.Cells.ContextLinkCell; import org.telegram.ui.Cells.DialogCell; import org.telegram.ui.Cells.MentionCell; +import org.telegram.ui.Cells.ProfileChannelCell; import org.telegram.ui.Cells.ShareDialogCell; import org.telegram.ui.Cells.StickerCell; import org.telegram.ui.Cells.TextCell; @@ -234,6 +240,8 @@ import org.telegram.ui.Stories.recorder.HintView2; import org.telegram.ui.Stories.recorder.PreviewView; import org.telegram.ui.Stories.recorder.StoryEntry; import org.telegram.ui.Stories.recorder.StoryRecorder; +import org.telegram.ui.bots.BotCommandsMenuView; +import org.telegram.ui.bots.BotWebViewSheet; import java.io.BufferedWriter; import java.io.File; @@ -258,6 +266,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; @SuppressWarnings("unchecked") public class ChatActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, DialogsActivity.DialogsActivityDelegate, LocationActivity.LocationActivityDelegate, ChatAttachAlertDocumentLayout.DocumentSelectActivityDelegate, ChatActivityInterface, FloatingDebugProvider, InstantCameraView.Delegate { @@ -336,8 +345,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private TextView replyButton; @Nullable private FrameLayout emptyViewContainer; + private LinearLayout emptyViewContent; private ChatGreetingsView greetingsViewContainer; - private BusinessChatEmptyView businessEmptyView; + private ChatActionCell greetingsInfo; + private QuickRepliesEmptyView quickRepliesEmptyView; + private BusinessLinksEmptyView businessLinksEmptyView; public ChatActivityFragmentView contentView; private ChatBigEmptyView bigEmptyView; private ArrayList actionModeViews = new ArrayList<>(); @@ -374,6 +386,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private HintView2 savedMessagesSearchHint; private HintView2 savedMessagesTagHint; private HintView2 groupEmojiPackHint; + private HintView2 botMessageHint; private int reactionsMentionCount; private FrameLayout reactionsMentiondownButton; @@ -407,6 +420,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Nullable private TranslateButton translateButton; @Nullable + private BusinessBotButton bizBotButton; + @Nullable private View topViewSeparator1, topViewSeparator2, topViewSeparator3; @Nullable private LinkSpanDrawable.LinksTextView emojiStatusSpamHint; @@ -520,6 +535,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public static final int MODE_PINNED = 2; public static final int MODE_SAVED = 3; public static final int MODE_QUICK_REPLIES = 5; + public static final int MODE_EDIT_BUSINESS_LINK = 6; + + public TLRPC.TL_businessChatLink businessLink = null; public String quickReplyShortcut; private int chatMode; @@ -747,7 +765,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not skeletonOutlinePaint.setStrokeWidth(AndroidUtilities.dp(1)); } - private String inlineQueryForInput; + private String textToSet; private boolean premiumInvoiceBot; private boolean showScrollToMessageError; private int startLoadFromMessageId; @@ -784,6 +802,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not protected TLRPC.ChatFull chatInfo; protected TLRPC.UserFull userInfo; + public ProfileChannelCell.ChannelMessageFetcher profileChannelMessageFetcher; + public ProfileBirthdayEffect.BirthdayEffectFetcher birthdayAssetsFetcher; + private LongSparseArray botInfo = new LongSparseArray<>(); private String botUser; private long inlineReturn; @@ -937,6 +958,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private final ChatMessagesMetadataController chatMessagesMetadataController = new ChatMessagesMetadataController(this); private TLRPC.TL_channels_sendAsPeers sendAsPeersObj; + private TLRPC.TL_account_resolvedBusinessChatLinks resolvedChatLink; + private boolean switchFromTopics; private boolean switchingFromTopics; private float switchingFromTopicsProgress; @@ -974,6 +997,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private final static int OPTION_TRANSCRIBE = 30; private final static int OPTION_HIDE_SPONSORED_MESSAGE = 31; private final static int OPTION_VIEW_IN_TOPIC = 32; + private final static int OPTION_ABOUT_REVENUE_SHARING_ADS = 33; + private final static int OPTION_REPORT_AD = 34; + private final static int OPTION_REMOVE_ADS = 35; private final static int OPTION_SEND_NOW = 100; private final static int OPTION_EDIT_SCHEDULE_TIME = 102; private final static int OPTION_SPEED_PROMO = 103; @@ -1349,6 +1375,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private final static int scheduled = 63; private final static int edit_quick_reply = 64; + private final static int copy_business_link = 65; + private final static int share_business_link = 66; + private final static int rename_business_link = 67; + private final static int delete_business_link = 68; + private final static int id_chat_compose_panel = 1000; RecyclerListView.OnItemLongClickListenerExtended onItemLongClickListener = new RecyclerListView.OnItemLongClickListenerExtended() { @@ -1886,7 +1917,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public void needSendTyping() { - if (chatMode == MODE_QUICK_REPLIES) return; + if (chatMode == MODE_QUICK_REPLIES || chatMode == MODE_EDIT_BUSINESS_LINK) return; getMessagesController().sendTyping(dialog_id, threadMessageId, 0, classGuid); } @@ -2224,7 +2255,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not attachMenuBotStartCommand = arguments.getString("attach_bot_start_command", null); inlineReturn = arguments.getLong("inline_return", 0); String inlineQuery = arguments.getString("inline_query"); - inlineQueryForInput = arguments.getString("inline_query_input"); + textToSet = arguments.getString("start_text"); premiumInvoiceBot = arguments.getBoolean("premium_bot", false); startLoadFromMessageId = arguments.getInt("message_id", 0); startLoadFromDate = arguments.getInt("start_from_date", 0); @@ -2360,6 +2391,16 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not dialog_id = DialogObject.makeEncryptedDialogId(encId); maxMessageId[0] = maxMessageId[1] = Integer.MIN_VALUE; minMessageId[0] = minMessageId[1] = Integer.MAX_VALUE; + } else if (chatMode == MODE_EDIT_BUSINESS_LINK) { + String businessLinkArgument = arguments.getString("business_link"); + if (businessLinkArgument == null) { + return false; + } + businessLink = BusinessLinksController.getInstance(currentAccount).findLink(businessLinkArgument); + if (businessLink == null) { + return false; + } + forceEmptyHistory(); } else { return false; } @@ -2407,6 +2448,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().addObserver(this, NotificationCenter.didVerifyMessagesStickers); } } + getNotificationCenter().addObserver(this, NotificationCenter.premiumFloodWaitReceived); getNotificationCenter().addObserver(this, NotificationCenter.messagesDidLoad); NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.emojiLoaded); NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.invalidateMotionBackground); @@ -2428,6 +2470,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().addObserver(this, NotificationCenter.messageSendError); getNotificationCenter().addObserver(this, NotificationCenter.chatInfoDidLoad); getNotificationCenter().addObserver(this, NotificationCenter.groupRestrictionsUnlockedByBoosts); + getNotificationCenter().addObserver(this, NotificationCenter.customStickerCreated); getNotificationCenter().addObserver(this, NotificationCenter.contactsDidLoad); getNotificationCenter().addObserver(this, NotificationCenter.messagePlayingProgressDidChanged); getNotificationCenter().addObserver(this, NotificationCenter.messagePlayingDidReset); @@ -2477,6 +2520,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().addObserver(this, NotificationCenter.savedMessagesDialogsUpdate); getNotificationCenter().addObserver(this, NotificationCenter.quickRepliesDeleted); getNotificationCenter().addObserver(this, NotificationCenter.quickRepliesUpdated); + if (chatMode == MODE_EDIT_BUSINESS_LINK) { + getNotificationCenter().addObserver(this, NotificationCenter.businessLinksUpdated); + } + if (actionBarSearchTags != null) { actionBarSearchTags.attach(); } @@ -2639,7 +2686,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (isTopic) { getMessagesController().getTopicsController().getTopicRepliesCount(dialog_id, getTopicId()); } - getMessagesController().getSavedMessagesController().preloadDialogs(false); + if (chatMode != MODE_EDIT_BUSINESS_LINK) { + getMessagesController().getSavedMessagesController().preloadDialogs(false); + } if (chatMode == MODE_SAVED) { getMessagesController().getSavedMessagesController().checkSavedDialogCount(getTopicId()); } @@ -2774,6 +2823,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().removePostponeNotificationsCallback(postponeNotificationsWhileLoadingCallback); getMessagesController().setLastCreatedDialogId(dialog_id, chatMode == MODE_SCHEDULED, false); getNotificationCenter().removeObserver(this, NotificationCenter.messagesDidLoad); + getNotificationCenter().removeObserver(this, NotificationCenter.premiumFloodWaitReceived); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.emojiLoaded); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.invalidateMotionBackground); getNotificationCenter().removeObserver(this, NotificationCenter.didUpdateConnectionState); @@ -2792,6 +2842,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().removeObserver(this, NotificationCenter.messageSendError); getNotificationCenter().removeObserver(this, NotificationCenter.chatInfoDidLoad); getNotificationCenter().removeObserver(this, NotificationCenter.groupRestrictionsUnlockedByBoosts); + getNotificationCenter().removeObserver(this, NotificationCenter.customStickerCreated); getNotificationCenter().removeObserver(this, NotificationCenter.didLoadChatInviter); getNotificationCenter().removeObserver(this, NotificationCenter.groupCallUpdated); getNotificationCenter().removeObserver(this, NotificationCenter.encryptedChatUpdated); @@ -2860,6 +2911,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().removeObserver(this, NotificationCenter.savedMessagesDialogsUpdate); getNotificationCenter().removeObserver(this, NotificationCenter.quickRepliesDeleted); getNotificationCenter().removeObserver(this, NotificationCenter.quickRepliesUpdated); + if (chatMode == MODE_EDIT_BUSINESS_LINK) { + getNotificationCenter().removeObserver(this, NotificationCenter.businessLinksUpdated); + } + if (actionBarSearchTags != null) { actionBarSearchTags.detach(); } @@ -2915,6 +2970,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not progressDialogCurrent = null; } chatMessagesMetadataController.onFragmentDestroy(); + if (birthdayAssetsFetcher != null) { + birthdayAssetsFetcher.detach(true); + birthdayAssetsFetcher = null; + } } private static class ChatActivityTextSelectionHelper extends TextSelectionHelper.ChatListTextSelectionHelper { @@ -3101,6 +3160,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not showQuickRepliesRemoveAlert(); return; } + if (chatMode == MODE_EDIT_BUSINESS_LINK && chatActivityEnterView.businessLinkHasChanges()) { + showBusinessLinksDiscardAlert(() -> { + finishFragment(); + }); + return; + } if (!checkRecordLocked(true)) { finishFragment(); } @@ -3368,6 +3433,39 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not // Bundle bundle = new Bundle(); // bundle.putLong("chat_id", -dialog_id); // presentFragment(new TopicsFragment(bundle)); + } else if (id == copy_business_link) { + AndroidUtilities.addToClipboard(businessLink.link); + BulletinFactory.of(LaunchActivity.getLastFragment()).createCopyLinkBulletin().show(); + } else if (id == share_business_link) { + Runnable shareTask = () -> { + Intent intent = new Intent(getContext(), LaunchActivity.class); + intent.setAction(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, businessLink.link); + startActivityForResult(intent, 500); + }; + if (chatActivityEnterView.businessLinkHasChanges()) { + showBusinessLinksDiscardAlert(shareTask); + } else { + shareTask.run(); + } + } else if (id == rename_business_link) { + BusinessLinksActivity.openRenameAlert(getContext(), currentAccount, businessLink, resourceProvider, false); + } else if (id == delete_business_link) { + AlertDialog dialog = new AlertDialog.Builder(getContext(), getResourceProvider()) + .setTitle(getString(R.string.BusinessLinksDeleteTitle)) + .setMessage(getString(R.string.BusinessLinksDeleteMessage)) + .setPositiveButton(getString(R.string.Remove), (di, w) -> { + finishFragment(); + getNotificationCenter().postNotificationName(NotificationCenter.needDeleteBusinessLink, businessLink); + }) + .setNegativeButton(getString(R.string.Cancel), null) + .create(); + showDialog(dialog); + TextView button = (TextView) dialog.getButton(DialogInterface.BUTTON_POSITIVE); + if (button != null) { + button.setTextColor(getThemedColor(Theme.key_text_RedBold)); + } } } }); @@ -3676,7 +3774,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not headerItem.lazilyAddSubItem(report, R.drawable.msg_report, LocaleController.getString("ReportChat", R.string.ReportChat)); } if (currentUser != null) { - addContactItem = headerItem.lazilyAddSubItem(share_contact, R.drawable.msg_addcontact, ""); + addContactItem = headerItem.lazilyAddSubItem(share_contact, R.drawable.msg_addcontact, LocaleController.getString("AddToContacts", R.string.AddToContacts)); } if (currentEncryptedChat != null) { timeItem2 = headerItem.lazilyAddSubItem(chat_enc_timer, R.drawable.msg_autodelete, LocaleController.getString("SetTimer", R.string.SetTimer)); @@ -3722,6 +3820,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not headerItem.lazilyAddSubItem(bot_help, R.drawable.msg_help, LocaleController.getString("BotHelp", R.string.BotHelp)); updateBotButtons(); } + } else if (chatMode == MODE_EDIT_BUSINESS_LINK) { + headerItem = menu.addItem(chat_menu_options, R.drawable.ic_ab_other, themeDelegate); + headerItem.setContentDescription(LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions)); + + headerItem.lazilyAddSubItem(copy_business_link, R.drawable.msg_copy, getString(R.string.Copy)); + headerItem.lazilyAddSubItem(share_business_link, R.drawable.msg_share, getString(R.string.LinkActionShare)); + headerItem.lazilyAddSubItem(rename_business_link, R.drawable.msg_edit, getString(R.string.Rename)); + headerItem.lazilyAddSubItem(delete_business_link, R.drawable.msg_delete, getString(R.string.Delete)).setColors(Theme.getColor(Theme.key_text_RedRegular), Theme.getColor(Theme.key_text_RedRegular)); } if (ChatObject.isForum(currentChat) && isTopic && getParentLayout() != null && getParentLayout().getFragmentStack() != null && chatMode == MODE_DEFAULT) { boolean hasMyForum = false; @@ -5896,6 +6002,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not AndroidUtilities.runOnUIThread(ChatActivity.this::checkSavedMessagesTagHint, 2000); } } + if (botMessageHint != null && botMessageHint.shown()) { + botMessageHint.hide(); + } else { + AndroidUtilities.cancelRunOnUIThread(ChatActivity.this::checkBotMessageHint); + AndroidUtilities.runOnUIThread(ChatActivity.this::checkBotMessageHint, 2000); + } + if (chatActivityEnterView != null) { + chatActivityEnterView.hideHints(); + } } }); @@ -6030,6 +6145,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not restartTopicButton = null; closeReportSpam = null; translateButton = null; + bizBotButton = null; pagedownButton = new FrameLayout(context); pagedownButton.setVisibility(View.INVISIBLE); @@ -6761,7 +6877,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not replyButton = null; forwardButton = null; - chatActivityEnterView = new ChatActivityEnterView(getParentActivity(), contentView, this, true, themeDelegate) { + chatActivityEnterView = new ChatActivityEnterView(getParentActivity(), contentView, this, chatMode != MODE_EDIT_BUSINESS_LINK, themeDelegate) { int lastContentViewHeight; int messageEditTextPredrawHeigth; @@ -6923,7 +7039,77 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } }; chatActivityEnterView.getEditField().adaptiveCreateLinkDialog = true; - chatActivityEnterView.setDelegate(new ChatActivityEnterViewDelegate()); + if (chatMode == MODE_EDIT_BUSINESS_LINK) { + chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { + @Override + public void onMessageSend(CharSequence message, boolean notify, int scheduleDate) {} + + @Override + public void needSendTyping() {} + + @Override + public void onTextChanged(CharSequence text, boolean bigChange, boolean fromDraft) {} + + @Override + public void onTextSelectionChanged(int start, int end) {} + + @Override + public void onTextSpansChanged(CharSequence text) {} + + @Override + public void onAttachButtonHidden() {} + + @Override + public void onAttachButtonShow() {} + + @Override + public void onWindowSizeChanged(int size) {} + + @Override + public void onStickersTab(boolean opened) {} + + @Override + public void onMessageEditEnd(boolean loading) {} + + @Override + public void didPressAttachButton() {} + + @Override + public void needStartRecordVideo(int state, boolean notify, int scheduleDate, int ttl) {} + + @Override + public void toggleVideoRecordingPause() {} + + @Override + public void needChangeVideoPreviewState(int state, float seekProgress) {} + + @Override + public void onSwitchRecordMode(boolean video) {} + + @Override + public void onPreAudioVideoRecord() {} + + @Override + public void needStartRecordAudio(int state) {} + + @Override + public void needShowMediaBanHint() {} + + @Override + public void onStickersExpandedChange() {} + + @Override + public void onUpdateSlowModeButton(View button, boolean show, CharSequence time) {} + + @Override + public void onSendLongClick() {} + + @Override + public void onAudioVideoInterfaceUpdated() {} + }); + } else { + chatActivityEnterView.setDelegate(new ChatActivityEnterViewDelegate()); + } chatActivityEnterView.setDialogId(dialog_id, currentAccount); if (chatInfo != null) { chatActivityEnterView.setChatInfo(chatInfo); @@ -6933,9 +7119,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not chatActivityEnterView.updateBotWebView(false); chatActivityEnterView.setMinimumHeight(AndroidUtilities.dp(51)); chatActivityEnterView.setAllowStickersAndGifs(true, true, currentEncryptedChat == null || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46); - if (inlineQueryForInput != null) { - chatActivityEnterView.setFieldText(inlineQueryForInput); - inlineQueryForInput = null; + if (textToSet != null) { + chatActivityEnterView.setFieldText(textToSet); + textToSet = null; } if (inPreviewMode || isInsideContainer) { chatActivityEnterView.setVisibility(View.INVISIBLE); @@ -6944,7 +7130,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not chatActivityEnterView.setBotInfo(botInfo, false); } contentView.addView(chatActivityEnterView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.BOTTOM)); - chatActivityEnterView.checkChannelRights(); + if (chatMode != MODE_EDIT_BUSINESS_LINK) { + chatActivityEnterView.checkChannelRights(); + } chatActivityEnterTopView = new ChatActivityEnterTopView(context) { @Override @@ -6991,6 +7179,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not replyLineView.setBackgroundColor(getThemedColor(Theme.key_chat_replyPanelLine)); chatActivityEnterView.addTopView(chatActivityEnterTopView, replyLineView, 48); + if (chatMode == MODE_EDIT_BUSINESS_LINK) { + chatActivityEnterView.setEditingBusinessLink(businessLink); + } + final FrameLayout replyLayout = new FrameLayout(context); chatActivityEnterTopView.addReplyView(replyLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.NO_GRAVITY, 0, 0, 52, 0)); @@ -7772,6 +7964,79 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return fragmentView; } + private void checkBotMessageHint() { + if (botMessageHint != null) { + return; + } + ChatMessageCell cell = null; + for (int i = chatListView.getChildCount() - 1; i >= 0; --i) { + View child = chatListView.getChildAt(i); + if (child instanceof ChatMessageCell) { + ChatMessageCell messageCell = ((ChatMessageCell) child); + MessageObject msg = messageCell.getPrimaryMessageObject(); + if (msg.messageOwner != null && msg.messageOwner.via_business_bot_id != 0) { + cell = messageCell; + } + } + } + showBotMessageHint(cell, false); + } + + private boolean bizbothint; + private void showBotMessageHint(ChatMessageCell cell, boolean byClick) { + if ( + getContext() == null || cell == null || cell.timeLayout == null || + cell.getPrimaryMessageObject() == null || cell.getPrimaryMessageObject().messageOwner == null || + cell.getPrimaryMessageObject().messageOwner.via_business_bot_id == 0) { + return; + } + if (!byClick) { + if (getMessagesController().getMainSettings().getBoolean("bizbothint", false)) { + return; + } + getMessagesController().getMainSettings().edit().putBoolean("bizbothint", true).apply(); + if (bizbothint) return; + bizbothint = true; + } + if (botMessageHint != null) { + if (byClick) { + HintView2 hint = botMessageHint; + hint.setOnHiddenListener(() -> contentView.removeView(hint)); + hint.hide(); + botMessageHint = null; + } else { + return; + } + } + botMessageHint = new HintView2(getContext(), HintView2.DIRECTION_BOTTOM) + .setMultilineText(true) + .setTextAlign(Layout.Alignment.ALIGN_NORMAL) + .setDuration(-1) + .setHideByTouch(true) + .useScale(true) + .setCloseButton(true) + .setRounding(8); + botMessageHint.setText(AndroidUtilities.replaceTags(LocaleController.getString(R.string.MessageBizBot))); + botMessageHint.setMaxWidthPx(HintView2.cutInFancyHalf(botMessageHint.getText(), botMessageHint.getTextPaint())); + contentView.addView(botMessageHint, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 120, Gravity.TOP | Gravity.FILL_HORIZONTAL, 16, 0, 16, 0)); + contentView.post(() -> { + int[] loc = new int[2]; + cell.getLocationInWindow(loc); + botMessageHint.setTranslationY(loc[1] - botMessageHint.getTop() - dp(120) + cell.getTimeY()); + botMessageHint.setJointPx(0, -dp(16) + loc[0] + cell.timeX + cell.timeWidth - cell.signWidth / 2f); + botMessageHint.show(); + }); + } + + private void hideHints() { + if (savedMessagesTagHint != null && savedMessagesTagHint.shown()) { + savedMessagesTagHint.hide(); + } + if (chatActivityEnterView != null) { + chatActivityEnterView.hideHints(); + } + } + public void setTagFilter(ReactionsLayoutInBubble.VisibleReaction reaction) { if (actionBarSearchTags != null) { actionBarSearchTags.setChosen(reaction, true); @@ -8413,7 +8678,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not addToContactsButton.setTextColor(getThemedColor(Theme.key_chat_addContact)); addToContactsButton.setVisibility(View.GONE); addToContactsButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - addToContactsButton.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + addToContactsButton.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); addToContactsButton.setSingleLine(true); addToContactsButton.setMaxLines(1); addToContactsButton.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), 0); @@ -8540,6 +8805,36 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not topChatPanelView.addView(translateButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.BOTTOM, 0, 0, 0, 2)); } + private void createBizBotButton() { + if (bizBotButton != null || getContext() == null) { + return; + } + + createTopPanel(); + if (topChatPanelView == null) { + return; + } + bizBotButton = new BusinessBotButton(getContext(), this, themeDelegate) { +// @Override +// protected void onButtonClick() { +// if (getUserConfig().isPremium()) { +// getMessagesController().getTranslateController().toggleTranslatingDialog(getDialogId()); +// } else { +// MessagesController.getNotificationsSettings(currentAccount).edit().putInt("dialog_show_translate_count" + getDialogId(), 14).commit(); +// showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_TRANSLATIONS, false)); +// } +// updateTopPanel(true); +// } +// +// @Override +// protected void onCloseClick() { +// MessagesController.getNotificationsSettings(currentAccount).edit().putInt("dialog_show_translate_count" + getDialogId(), 140).commit(); +// updateTopPanel(true); +// } + }; + topChatPanelView.addView(bizBotButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.BOTTOM, 0, 0, 0, 2)); + } + private void createUndoView() { if (undoView != null || getContext() == null) { return; @@ -10036,6 +10331,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not blurredView.setVisibility(View.VISIBLE); } + blurredView.setOnClickListener(e -> { + finishPreviewFragment(); + }); blurredView.setAlpha(0.0f); blurredView.animate().setListener(null).cancel(); blurredView.animate().alpha(1f).setListener(new AnimatorListenerAdapter() { @@ -11091,9 +11389,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (searchExpandList != null) { searchExpandList.setText(LocaleController.getString(messagesSearchListView != null && messagesSearchListView.getTag() != null ? R.string.SearchAsChat : R.string.SearchAsList), !LocaleController.isRTL); } - if (savedMessagesTagHint != null && savedMessagesTagHint.shown()) { - savedMessagesTagHint.hide(); - } + hideHints(); } public boolean playFirstUnreadVoiceMessage() { @@ -11322,7 +11618,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } private void showScheduledOrNoSoundHint() { - boolean disableNoSound = (UserObject.isUserSelf(currentUser) || (chatInfo != null && chatInfo.slowmode_next_send_date > 0) && chatMode == 0); + boolean disableNoSound = UserObject.isUserSelf(currentUser) || (chatInfo != null && chatInfo.slowmode_next_send_date > 0) && chatMode == 0 || chatMode == MODE_EDIT_BUSINESS_LINK; long scheduledOrNoSoundHintTimeFromLastSeen = System.currentTimeMillis() - SharedConfig.scheduledOrNoSoundHintSeenAt; long scheduledHintTimeFromLastSeen = System.currentTimeMillis() - SharedConfig.scheduledHintSeenAt; if (disableNoSound || SharedConfig.scheduledOrNoSoundHintShows >= 3 || scheduledOrNoSoundHintTimeFromLastSeen < 86400000L || scheduledHintTimeFromLastSeen < 86400000L || chatActivityEnterView.isEditingMessage()) { @@ -11716,12 +12012,35 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else { chatAttachAlert.setMaxSelectedPhotos(-1, true); } + chatAttachAlert.enableDefaultMode(); chatAttachAlert.init(); chatAttachAlert.getCommentTextView().setText(chatActivityEnterView.getFieldText()); chatAttachAlert.parentThemeDelegate = themeDelegate; showDialog(chatAttachAlert); } + public void openAttachMenuForCreatingSticker() { + ContentPreviewViewer.getInstance().setStickerSetForCustomSticker(null); + if (getParentActivity() == null) { + return; + } + createChatAttachView(); + chatAttachAlert.getPhotoLayout().loadGalleryPhotos(); + if (Build.VERSION.SDK_INT == 21 || Build.VERSION.SDK_INT == 22) { + chatActivityEnterView.closeKeyboard(); + } + chatAttachAlert.setMaxSelectedPhotos(1, false); + chatAttachAlert.setOpenWithFrontFaceCamera(true); + chatAttachAlert.enableStickerMode(); + chatAttachAlert.init(); + chatAttachAlert.parentThemeDelegate = themeDelegate; + if (visibleDialog != null) { + chatAttachAlert.show(); + } else { + showDialog(chatAttachAlert); + } + } + private void showFloatingDateView(boolean scroll) { if (floatingDateView == null || chatMode == MODE_QUICK_REPLIES) { return; @@ -13627,6 +13946,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not float clipTopFinal = clipTop - chatListViewPaddingVisibleOffset; float clipBottomFinal = chatListView.getMeasuredHeight() - blurredViewBottomOffset; + boolean checkPremiumFloodWait = !UserConfig.getInstance(currentAccount).isPremium(); + for (int a = 0; a < count; a++) { View view = chatListView.getChildAt(a); MessageObject messageObject = null; @@ -13661,6 +13982,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } if (messageCell != null) { messageCell.setVisibleOnScreen(true, clipTopFinal - top, bottom - clipBottomFinal); + if (checkPremiumFloodWait) { + if (messageCell.checkLoadCaughtPremiumFloodWait()) { + showPremiumFloodWaitBulletin(false); + checkPremiumFloodWait = false; + } else if (messageCell.checkUploadCaughtPremiumFloodWait()) { + showPremiumFloodWaitBulletin(true); + checkPremiumFloodWait = false; + } + } } int viewTop = top >= 0 ? 0 : -top; @@ -13972,6 +14302,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not AndroidUtilities.runOnUIThread(() -> { updatePinnedMessageView(animated, animateToNext); }); + } else if (isTopic && currentPinnedMessageId != 0 && (pinnedMessageView == null || pinnedMessageView.getTag() != null)) { + AndroidUtilities.runOnUIThread(() -> { + updatePinnedMessageView(animated, 0); + }); } else { updatePinnedListButton(animated); } @@ -15020,7 +15354,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (((int) getTag(BlurBehindDrawable.TAG_DRAWING_AS_BACKGROUND)) == BlurBehindDrawable.STATIC_CONTENT) { needBlur = child == actionBar || child == fragmentContextView || child == pinnedMessageView; } else { - needBlur = child == chatListView || child == chatActivityEnterView || chatActivityEnterView.isPopupView(child); + needBlur = child == chatListView || child == chatActivityEnterView || chatActivityEnterView.isPopupView(child) || child == bottomOverlayChat; } if (!needBlur) { return false; @@ -15445,6 +15779,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (savedMessagesTagHint != null && savedMessagesTagHint.getVisibility() == View.VISIBLE) { super.drawChild(canvas, savedMessagesTagHint, SystemClock.uptimeMillis()); } + if (botMessageHint != null && botMessageHint.getVisibility() == View.VISIBLE) { + super.drawChild(canvas, botMessageHint, SystemClock.uptimeMillis()); + } + if (chatActivityEnterView != null && chatActivityEnterView.birthdayHint != null) { + canvas.save(); + canvas.translate(chatActivityEnterView.getX() + chatActivityEnterView.birthdayHint.getX(), chatActivityEnterView.getY() + chatActivityEnterView.birthdayHint.getY()); + chatActivityEnterView.birthdayHint.draw(canvas); + canvas.restore(); + } } if (fixedKeyboardHeight > 0 && keyboardHeight < AndroidUtilities.dp(20)) { @@ -16790,6 +17133,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else { avatarContainer.setTitle(quickReplyShortcut); } + } else if (chatMode == MODE_EDIT_BUSINESS_LINK) { + if (!TextUtils.isEmpty(businessLink.title)) { + avatarContainer.setTitle(businessLink.title); + } else { + avatarContainer.setTitle(LocaleController.getString(R.string.BusinessLink)); + } } else if (chatMode == MODE_SAVED) { long dialogId = threadMessageId; TLRPC.User user = null; @@ -17952,7 +18301,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (messagesDict[loadIndex].indexOfKey(messageId) >= 0) { continue; } - if (threadMessageId != 0 && obj.messageOwner instanceof TLRPC.TL_messageEmpty) { + if (obj.messageOwner instanceof TLRPC.TL_messageEmpty) { continue; } if (getTopicId() != 0 && obj.messageOwner.action instanceof TLRPC.TL_messageActionTopicCreate) { @@ -18627,6 +18976,28 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (messageEnterTransitionContainer != null) { messageEnterTransitionContainer.invalidate(); } + } else if (id == NotificationCenter.customStickerCreated) { + boolean isSending = args.length > 0 ? (Boolean) args[0] : false; + if (chatAttachAlert != null && chatAttachAlert.isShowing()) { + chatAttachAlert.dismiss(true); + } + if (isSending && chatActivityEnterView != null && chatActivityEnterView.isPopupShowing()) { + chatActivityEnterView.hidePopup(true); + } + if (args.length > 1 && args[1] instanceof TLRPC.TL_messages_stickerSet) { + TLRPC.StickerSet set = ((TLRPC.TL_messages_stickerSet) args[1]).set; + TLRPC.TL_inputStickerSetID inputStickerSet = new TLRPC.TL_inputStickerSetID(); + inputStickerSet.access_hash = set.access_hash; + inputStickerSet.id = set.id; + StickersAlert alert = new StickersAlert(getParentActivity(), ChatActivity.this, inputStickerSet, null, chatActivityEnterView, themeDelegate); + alert.setOnShowListener(dialog -> { + if (args.length > 2 && args[2] instanceof TLRPC.Document) { + TLRPC.Document stickerDocument = (TLRPC.Document) args[2]; + BulletinFactory.of((FrameLayout) alert.getContainerView(), resourceProvider).createEmojiBulletin(stickerDocument, LocaleController.formatString(R.string.StickersStickerAddedToSetToast, set.title)).setDuration(Bulletin.DURATION_LONG).show(); + } + }); + showDialog(alert); + } } else if (id == NotificationCenter.emojiLoaded) { if (chatListView != null) { chatListView.invalidateViews(); @@ -18742,7 +19113,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (did == dialog_id) { boolean scheduled = (Boolean) args[2]; int mode = (Integer) args[3]; - if (mode != chatMode) { + if (mode != chatMode && chatMode != MODE_SAVED) { if (chatMode != MODE_SCHEDULED && mode == MODE_SCHEDULED && !isPaused && messagePreviewParams == null) { if (!arr.isEmpty() && arr.get(0).getId() < 0) { openScheduledMessages(); @@ -19887,7 +20258,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (index >= 0 && index < messages.size()) { int position = index + chatAdapter.messagesStartRow; chatAdapter.updateRowAtPosition(position); - if (args.length > 3 && args[3] != null) { + if (args.length > 3 && args[3] != null || messageObject.messageOwner.voiceTranscriptionOpen) { for (int i = 0; i < chatListView.getChildCount(); ++i) { View child = chatListView.getChildAt(i); if (child instanceof ChatMessageCell && ((ChatMessageCell) child).getMessageObject() == messageObject) { @@ -20512,7 +20883,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (currentUser != null && currentUser.id == uid) { userInfo = (TLRPC.UserFull) args[1]; if (greetingsViewContainer != null) { - greetingsViewContainer.setPremiumLock(userInfo != null && userInfo.contact_require_premium && !getUserConfig().isPremium(), dialog_id); + greetingsViewContainer.setPremiumLock(userInfo != null && getDialogId() != getUserConfig().getClientUserId() && userInfo.contact_require_premium && !getUserConfig().isPremium(), dialog_id); } updateBottomOverlay(); checkThemeEmoticonOrWallpaper(); @@ -20557,6 +20928,16 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not loadingPinnedMessagesList = true; } updateVisibleWallpaperActions(); + if (greetingsViewContainer != null && userInfo != null && userInfo.business_intro != null) { + greetingsViewContainer.setPreview(userInfo.business_intro.title, userInfo.business_intro.description); + greetingsViewContainer.setSticker(userInfo.business_intro.sticker); + } + updateGreetInfo(); + if (profileChannelMessageFetcher == null) { + profileChannelMessageFetcher = new ProfileChannelCell.ChannelMessageFetcher(currentAccount); + profileChannelMessageFetcher.fetch(userInfo); + } + birthdayAssetsFetcher = ProfileBirthdayEffect.BirthdayEffectFetcher.of(currentAccount, userInfo, birthdayAssetsFetcher); } } else if (id == NotificationCenter.didSetNewWallpapper) { if (fragmentView != null) { @@ -20940,6 +21321,17 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not // if (chatActivityEnterView != null) { // chatActivityEnterView.setBotsCount(botsCount, hasBotsCommands, hasQuickReplies, true); // } + } else if (id == NotificationCenter.businessLinksUpdated) { + String businessLinkArgument = arguments.getString("business_link"); + if (businessLinkArgument != null) { + TLRPC.TL_businessChatLink link = BusinessLinksController.getInstance(currentAccount).findLink(businessLinkArgument); + if (link != null) { + businessLink = link; + updateTitle(true); + } + } + } else if (id == NotificationCenter.premiumFloodWaitReceived) { + invalidateMessagesVisiblePart(); } } @@ -21197,6 +21589,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not processNewMessages(res.messages); } + private void removeFromSponsored(MessageObject message) { + MessagesController.SponsoredMessagesInfo sponsoredMessagesInfo = getMessagesController().getSponsoredMessages(dialog_id); + if (sponsoredMessagesInfo != null) { + sponsoredMessagesInfo.messages.remove(message); + } + } + private void checkGroupCallJoin(boolean fromServer) { if (groupCall == null || voiceChatHash == null || !openAnimationEnded) { if (voiceChatHash != null && fromServer && chatInfo != null && chatInfo.call == null && fragmentView != null && getParentActivity() != null) { @@ -21738,7 +22137,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (action instanceof TLRPC.TL_messageActionChannelMigrateFrom) { continue; } - if (threadMessageId != 0 && obj.messageOwner instanceof TLRPC.TL_messageEmpty) { + if (obj.messageOwner instanceof TLRPC.TL_messageEmpty) { continue; } if (!isTopic && threadMessageObject != null && obj.isReply() && !(obj.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage)) { @@ -21861,7 +22260,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (action instanceof TLRPC.TL_messageActionChannelMigrateFrom) { continue; } - if (threadMessageId != 0 && obj.messageOwner instanceof TLRPC.TL_messageEmpty) { + if (obj.messageOwner instanceof TLRPC.TL_messageEmpty) { continue; } if (threadMessageObject != null && threadMessageObject.messageOwner.replies != null && obj.isReply() && !(obj.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage)) { @@ -22248,6 +22647,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (savedMessagesTagHint != null && savedMessagesTagHint.shown()) { savedMessagesTagHint.hide(); } + if (botMessageHint != null && botMessageHint.shown()) { + botMessageHint.hide(); + } } private int getStableIdForDateObject(int date) { @@ -22343,7 +22745,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not int commentsDeleted = 0; for (int a = 0; a < size; a++) { Integer mid = markAsDeletedMessages.get(a); - MessageObject obj = chatAdapter.isFiltered ? filteredMessagesDict.get(mid) : messagesDict[loadIndex].get(mid); + MessageObject obj = chatAdapter != null && chatAdapter.isFiltered ? filteredMessagesDict.get(mid) : messagesDict[loadIndex].get(mid); if (selectedObject != null && obj == selectedObject || obj != null && selectedObjectGroup != null && selectedObjectGroup == groupedMessagesMap.get(obj.getGroupId())) { closeMenu(); } @@ -22484,7 +22886,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (updatedReplies) { updateReplyMessageHeader(true); } - if (commentsDeleted != 0) { + if (commentsDeleted != 0 && replyOriginalChat != null) { getNotificationCenter().postNotificationName(NotificationCenter.changeRepliesCounter, replyOriginalChat.id, replyOriginalMessageId, -commentsDeleted); getMessagesStorage().updateRepliesCount(replyOriginalChat.id, replyOriginalMessageId, null, 0, -commentsDeleted); } @@ -23180,7 +23582,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not showScheduledOrNoSoundHint(); if (!backward && firstOpen) { - if (chatActivityEnterView != null && threadMessageObject != null && threadMessageObject.getRepliesCount() == 0 && ChatObject.canSendMessages(currentChat) && !isTopic) { + if (chatActivityEnterView != null && (threadMessageObject != null && threadMessageObject.getRepliesCount() == 0 && ChatObject.canSendMessages(currentChat) && !isTopic || chatMode == MODE_EDIT_BUSINESS_LINK)) { chatActivityEnterView.setFieldFocused(); chatActivityEnterView.openKeyboard(); } @@ -23499,7 +23901,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not bottomOverlayChatWaitsReply = false; bottomOverlayLinks = false; boolean forceNoBottom = false; - if (chatMode == MODE_DEFAULT && userInfo != null && userInfo.contact_require_premium && !getUserConfig().isPremium()) { + if (chatMode == MODE_DEFAULT && getDialogId() != getUserConfig().getClientUserId() && userInfo != null && userInfo.contact_require_premium && !getUserConfig().isPremium()) { bottomOverlayLinks = true; bottomOverlayChatText.setVisibility(View.GONE); bottomOverlayLinksText.setVisibility(View.VISIBLE); @@ -24220,7 +24622,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not TLRPC.KeyboardButton botButton = pinnedButton(pinnedMessageObject); pinnedMessageButtonShown = botButton != null; SharedPreferences preferences = MessagesController.getNotificationsSettings(currentAccount); - if (threadMessageObject == null && (chatInfo == null && userInfo == null || pinned_msg_id == 0 || !pinnedMessageIds.isEmpty() && pinnedMessageIds.get(0) == preferences.getInt("pin_" + dialog_id, 0)) || reportType >= 0 || actionBar != null && (actionBar.isActionModeShowed() || actionBar.isSearchFieldVisible())) { + if ((threadMessageObject == null || isTopic) && (chatInfo == null && userInfo == null || pinned_msg_id == 0 || !pinnedMessageIds.isEmpty() && pinnedMessageIds.get(0) == preferences.getInt("pin_" + dialog_id, 0)) || reportType >= 0 || actionBar != null && (actionBar.isActionModeShowed() || actionBar.isSearchFieldVisible())) { changed = hidePinnedMessageView(animated); } else { if (pinnedMessageView == null) { @@ -24930,20 +25332,32 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getMessagesController().getTranslateController().isDialogTranslatable(getDialogId()) && !getMessagesController().getTranslateController().isTranslateDialogHidden(getDialogId()) : !getMessagesController().premiumFeaturesBlocked() && preferences.getInt("dialog_show_translate_count" + did, 5) <= 0 ); + boolean showBizBot = getUserConfig().isPremium() && preferences.getLong("dialog_botid" + did, 0) != 0; if (showRestartTopic) { shownRestartTopic = true; } - if (showTranslate) { + if (showTranslate || showBizBot) { shownTranslateTopic = true; } boolean showRestartTopic1 = (showRestartTopic || shownRestartTopic) && !(showReport || showBlock || showGeo); - if (show || showReport || showBlock || showGeo || showTranslate || showRestartTopic1) { + if (show || showReport || showBlock || showGeo || showTranslate || showBizBot || showRestartTopic1) { createTopPanel(); if (topChatPanelView == null) { return; } } + if (showBizBot) { + createBizBotButton(); + if (bizBotButton != null) { + bizBotButton.set( + did, + preferences.getLong("dialog_botid" + did, 0), + preferences.getString("dialog_boturl" + did, null), + preferences.getInt("dialog_botflags" + did, 0) + ); + } + } if (showTranslate) { createTranslateButton(); if (translateButton != null) { @@ -24964,14 +25378,17 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (translateButton != null) { translateButton.setVisibility(showTranslate ? View.VISIBLE : View.GONE); } + if (bizBotButton != null) { + bizBotButton.setVisibility(showBizBot ? View.VISIBLE : View.GONE); + } if (closeReportSpam != null) { - closeReportSpam.setVisibility(showRestartTopic1 || showTranslate && !(showReport || showBlock || showGeo) ? View.GONE : View.VISIBLE); + closeReportSpam.setVisibility(showRestartTopic1 || (showTranslate || showBizBot) && !(showReport || showBlock || showGeo) ? View.GONE : View.VISIBLE); } if (!showRestartTopic) { shownRestartTopic = false; } - if (!showTranslate) { + if (!showTranslate && !showBizBot) { shownTranslateTopic = false; } @@ -25128,7 +25545,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (chatWithAdminTextView != null) { chatWithAdminTextView.setVisibility(isChatWithAdmin ? View.VISIBLE : View.GONE); } - if (userBlocked || ((addToContactsButton == null || addToContactsButton.getVisibility() == View.GONE) && (reportSpamButton == null || reportSpamButton.getVisibility() == View.GONE) && (chatWithAdminTextView == null || chatWithAdminTextView.getVisibility() == View.GONE) && (restartTopicButton == null || restartTopicButton.getVisibility() == View.GONE) && (translateButton == null || translateButton.getVisibility() == View.GONE))) { + if (userBlocked || ((addToContactsButton == null || addToContactsButton.getVisibility() == View.GONE) && (reportSpamButton == null || reportSpamButton.getVisibility() == View.GONE) && (chatWithAdminTextView == null || chatWithAdminTextView.getVisibility() == View.GONE) && (restartTopicButton == null || restartTopicButton.getVisibility() == View.GONE) && (translateButton == null || translateButton.getVisibility() == View.GONE) && (bizBotButton == null || bizBotButton.getVisibility() == View.GONE))) { show = false; } @@ -25191,7 +25608,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not topViewSeparator2.setVisibility(View.GONE); } } - if (showTranslate) { + if (showTranslate || showBizBot) { createTopPanel(); if (topChatPanelView == null) { return; @@ -25206,7 +25623,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not topChatPanelHeight -= AndroidUtilities.dp(48); topViewSeparator3.setVisibility(View.GONE); } - topChatPanelHeight += AndroidUtilities.dp(36); + if (showTranslate) { + topChatPanelHeight += AndroidUtilities.dp(36); + } + if (showBizBot) { + topChatPanelHeight += AndroidUtilities.dp(48); + } + if (bizBotButton != null) { + bizBotButton.setTranslationY(AndroidUtilities.dp(showBizBot && showTranslate ? -36 : 0)); + } } else if (topViewSeparator3 != null) { topViewSeparator3.setVisibility(View.GONE); } @@ -25550,6 +25975,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not fixLayout(); applyDraftMaybe(false); + applyChatLinkMessageMaybe(); if (bottomOverlayChat != null && bottomOverlayChat.getVisibility() != View.VISIBLE && !actionBar.isSearchFieldVisible()) { chatActivityEnterView.setFieldFocused(true); } @@ -25755,6 +26181,110 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } + public void setResolvedChatLink(TLRPC.TL_account_resolvedBusinessChatLinks resolvedChatLink) { + this.resolvedChatLink = resolvedChatLink; + } + + public void applyChatLinkMessageMaybe() { + if (chatActivityEnterView == null || chatMode != 0 || resolvedChatLink == null) { + return; + } + + ArrayList entities; + final boolean isPremium = UserConfig.getInstance(currentAccount).isPremium(); + if (!isPremium && UserConfig.getInstance(currentAccount).getClientUserId() != dialog_id && resolvedChatLink.entities != null) { + entities = resolvedChatLink.entities.stream().filter(entity -> { + if (entity instanceof TLRPC.TL_messageEntityCustomEmoji) { + TLRPC.TL_messageEntityCustomEmoji emojiEntity = (TLRPC.TL_messageEntityCustomEmoji) entity; + long documentId = emojiEntity.document_id; + + TLRPC.Document emoji = emojiEntity.document; + if (emoji == null) { + emoji = AnimatedEmojiDrawable.findDocument(currentAccount, documentId); + } + if (emoji == null) { + ArrayList sets1 = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_EMOJIPACKS); + for (TLRPC.TL_messages_stickerSet set : sets1) { + if (set != null && set.documents != null && !set.documents.isEmpty()) { + for (TLRPC.Document document : set.documents) { + if (document.id == documentId) { + emoji = document; + break; + } + } + } + if (emoji != null) { + break; + } + } + } + if (emoji == null) { + ArrayList sets2 = MediaDataController.getInstance(currentAccount).getFeaturedEmojiSets(); + for (TLRPC.StickerSetCovered set : sets2) { + if (set != null && set.covers != null && !set.covers.isEmpty()) { + for (TLRPC.Document document : set.covers) { + if (document.id == documentId) { + emoji = document; + break; + } + } + } + if (emoji != null) { + break; + } + ArrayList documents = null; + if (set instanceof TLRPC.TL_stickerSetFullCovered) { + documents = ((TLRPC.TL_stickerSetFullCovered) set).documents; + } else if (set instanceof TLRPC.TL_stickerSetNoCovered && set.set != null) { + TLRPC.TL_inputStickerSetID inputStickerSetID = new TLRPC.TL_inputStickerSetID(); + inputStickerSetID.id = set.set.id; + TLRPC.TL_messages_stickerSet fullSet = MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSetID, true); + if (fullSet != null && fullSet.documents != null) { + documents = fullSet.documents; + } + } + if (documents != null && !documents.isEmpty()) { + for (TLRPC.Document document : documents) { + if (document.id == documentId) { + emoji = document; + break; + } + } + } + if (emoji != null) { + break; + } + } + } + if (emoji != null) { + TLRPC.ChatFull chatFull = MessagesController.getInstance(currentAccount).getChatFull(-dialog_id); + if (chatFull != null && chatFull.emojiset != null) { + TLRPC.TL_messages_stickerSet stickerSet = MediaDataController.getInstance(currentAccount).getGroupStickerSetById(chatFull.emojiset); + if (stickerSet != null) { + for (TLRPC.Document document : stickerSet.documents) { + if (document.id == documentId) { + return true; + } + } + } + } + } + return !(emoji == null || !MessageObject.isFreeEmoji(emoji)); + } else { + return true; + } + }).collect(Collectors.toCollection(ArrayList::new)); + } else { + entities = resolvedChatLink.entities; + } + + CharSequence message = ChatActivityEnterView.applyMessageEntities(entities, resolvedChatLink.message, chatActivityEnterView.getEditField().getPaint().getFontMetricsInt()); + + chatActivityEnterView.setFieldText(message, true, true); + + resolvedChatLink = null; + } + private int appliedDraftDate; public void applyDraftMaybe(boolean canClear) { if (chatActivityEnterView == null || chatMode != 0 && (chatMode != MODE_SAVED || getUserConfig().getClientUserId() != getSavedDialogId())) { @@ -26209,6 +26739,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (actionBar.isActionModeShowed() || reportType >= 0) { return false; } + if (chatActivityEnterView != null) { + chatActivityEnterView.hideHints(); + } MessageObject message; MessageObject primaryMessage; @@ -26449,11 +26982,27 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not messageTextToTranslate = null; } - if (message.isSponsored() && !getUserConfig().isPremium() && !getMessagesController().premiumFeaturesBlocked()) { + if (message.isSponsored() && !getUserConfig().isPremium() && !getMessagesController().premiumFeaturesBlocked() && !message.sponsoredCanReport) { items.add(LocaleController.getString("HideAd", R.string.HideAd)); options.add(OPTION_HIDE_SPONSORED_MESSAGE); icons.add(R.drawable.msg_block2); } + + if (message.isSponsored() && message.sponsoredCanReport) { + items.add(LocaleController.getString("AboutRevenueSharingAds", R.string.AboutRevenueSharingAds)); + options.add(OPTION_ABOUT_REVENUE_SHARING_ADS); + icons.add(R.drawable.msg_report); + + items.add(LocaleController.getString("ReportAd", R.string.ReportAd)); + options.add(OPTION_REPORT_AD); + icons.add(R.drawable.msg_block2); + + if (!getMessagesController().premiumFeaturesBlocked()) { + items.add(LocaleController.getString("RemoveAds", R.string.RemoveAds)); + options.add(OPTION_REMOVE_ADS); + icons.add(R.drawable.msg_cancel); + } + } if (type == -1) { if ((selectedObject.type == MessageObject.TYPE_TEXT || selectedObject.isAnimatedEmoji() || selectedObject.isAnimatedEmojiStickers() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards && !message.isExpiredStory()) { items.add(LocaleController.getString("Copy", R.string.Copy)); @@ -26558,7 +27107,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not options.add(OPTION_REPLY); icons.add(R.drawable.msg_reply); } - if ((selectedObject.type == MessageObject.TYPE_TEXT || selectedObject.isDice() || selectedObject.isAnimatedEmoji() || selectedObject.isAnimatedEmojiStickers() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards) { + if ((selectedObject.type == MessageObject.TYPE_TEXT || selectedObject.isDice() || selectedObject.isAnimatedEmoji() || selectedObject.isAnimatedEmojiStickers() || getMessageCaption(selectedObject, selectedObjectGroup) != null) && !noforwards && !selectedObject.sponsoredCanReport) { items.add(LocaleController.getString("Copy", R.string.Copy)); options.add(OPTION_COPY); icons.add(R.drawable.msg_copy); @@ -27403,7 +27952,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not popupLayout.addView(rateTranscriptionLayout, rateTranscriptionLayoutParams); } - if (selectedObject != null && selectedObject.isSponsored()) { + if (selectedObject != null && selectedObject.isSponsored() && !selectedObject.sponsoredCanReport) { if (selectedObject.sponsoredInfo != null || selectedObject.sponsoredAdditionalInfo != null || selectedObject.sponsoredWebPage != null) { LinearLayout linearLayout = new LinearLayout(getParentActivity()); linearLayout.setOrientation(LinearLayout.VERTICAL); @@ -27504,7 +28053,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not }); popupLayout.addView(new ActionBarPopupWindow.GapView(contentView.getContext(), themeDelegate), LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); } - + FrameLayout sponsoredAbout = new FrameLayout(getParentActivity()) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { @@ -27568,6 +28117,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not cell.setSubtextColor(getThemedColor(Theme.key_windowBackgroundWhiteGrayText6)); } scrimPopupWindowItems[a] = cell; + if (option == OPTION_REMOVE_ADS) { + popupLayout.addView(new ActionBarPopupWindow.GapView(contentView.getContext(), themeDelegate), LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); + } popupLayout.addView(cell); final int i = a; cell.setOnClickListener(v1 -> { @@ -27585,7 +28137,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not didPressMessageUrl(link, false, selectedObject, v instanceof ChatMessageCell ? (ChatMessageCell) v : null); return true; }; - TLRPC.InputPeer inputPeer = selectedObject != null && (selectedObject.isPoll() || selectedObject.isVoiceTranscriptionOpen() || selectedObject.isSponsored() || selectedObject.scheduled) ? null : getMessagesController().getInputPeer(dialog_id); + TLRPC.InputPeer inputPeer = selectedObject != null && (selectedObject.isPoll() || selectedObject.isVoiceTranscriptionOpen() || selectedObject.isSponsored() || selectedObject.scheduled || chatMode == MODE_QUICK_REPLIES) ? null : getMessagesController().getInputPeer(dialog_id); if (selectedObject != null && selectedObject.messageOwner != null && selectedObject.messageOwner.originalLanguage != null) { waitForLangDetection.set(false); String fromLang = selectedObject.messageOwner.originalLanguage; @@ -28102,18 +28654,37 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not emptyView.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(2), AndroidUtilities.dp(10), AndroidUtilities.dp(3)); emptyViewContainer.addView(emptyView, new FrameLayout.LayoutParams(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); } else if (chatMode == MODE_QUICK_REPLIES) { - businessEmptyView = new BusinessChatEmptyView(getContext(), chatMode, dialog_id, threadMessageId, quickReplyShortcut, getResourceProvider()); - businessEmptyView.setBackground(Theme.createServiceDrawable(AndroidUtilities.dp(16), businessEmptyView, contentView, getThemedPaint(Theme.key_paint_chatActionBackground))); - emptyViewContainer.addView(businessEmptyView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); - } else if ((distance >= 0 || preloadedGreetingsSticker != null) && currentUser != null && !userBlocked || userInfo != null && userInfo.contact_require_premium && !getUserConfig().isPremium()) { - greetingsViewContainer = new ChatGreetingsView(getContext(), currentUser, distance, currentAccount, preloadedGreetingsSticker, themeDelegate); - greetingsViewContainer.setPremiumLock(userInfo != null && userInfo.contact_require_premium && !getUserConfig().isPremium(), dialog_id); + quickRepliesEmptyView = new QuickRepliesEmptyView(getContext(), chatMode, dialog_id, threadMessageId, quickReplyShortcut, getResourceProvider()); + quickRepliesEmptyView.setBackground(Theme.createServiceDrawable(AndroidUtilities.dp(16), quickRepliesEmptyView, contentView, getThemedPaint(Theme.key_paint_chatActionBackground))); + emptyViewContainer.addView(quickRepliesEmptyView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + } else if (chatMode == MODE_EDIT_BUSINESS_LINK) { + businessLinksEmptyView = new BusinessLinksEmptyView(getContext(), this, businessLink, getResourceProvider()); + businessLinksEmptyView.setBackground(Theme.createServiceDrawable(AndroidUtilities.dp(16), businessLinksEmptyView, contentView, getThemedPaint(Theme.key_paint_chatActionBackground))); + emptyViewContainer.addView(businessLinksEmptyView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + } else if ((distance >= 0 || preloadedGreetingsSticker != null) && currentUser != null && !userBlocked || userInfo != null && getDialogId() != getUserConfig().getClientUserId() && userInfo.contact_require_premium && !getUserConfig().isPremium()) { + greetingsViewContainer = new ChatGreetingsView(getContext(), currentUser, distance, currentAccount, preloadedGreetingsSticker, themeDelegate) { + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + setVisiblePart(getY() + emptyViewContent.getY(), getServiceHeight(this)); + } + }; + greetingsViewContainer.setPremiumLock(userInfo != null && getDialogId() != getUserConfig().getClientUserId() && userInfo.contact_require_premium && !getUserConfig().isPremium(), dialog_id); greetingsViewContainer.setListener((sticker) -> { animatingDocuments.put(sticker, 0); SendMessagesHelper.getInstance(currentAccount).sendSticker(sticker, null, dialog_id, null, null, null, replyingQuote, null, true, 0, false, null, quickReplyShortcut, getQuickReplyId()); }); - greetingsViewContainer.setBackground(Theme.createServiceDrawable(AndroidUtilities.dp(16), greetingsViewContainer, contentView, getThemedPaint(Theme.key_paint_chatActionBackground))); - emptyViewContainer.addView(greetingsViewContainer, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); +// greetingsViewContainer.setBackground(Theme.createServiceDrawable(AndroidUtilities.dp(16), greetingsViewContainer, contentView, getThemedPaint(Theme.key_paint_chatActionBackground))); + emptyViewContent = new LinearLayout(getContext()); + emptyViewContent.setOrientation(LinearLayout.VERTICAL); + emptyViewContent.setGravity(Gravity.CENTER); + emptyViewContent.addView(greetingsViewContainer, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + emptyViewContainer.addView(emptyViewContent, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + if (userInfo != null && userInfo.business_intro != null) { + greetingsViewContainer.setPreview(userInfo.business_intro.title, userInfo.business_intro.description); + greetingsViewContainer.setSticker(userInfo.business_intro.sticker); + } + updateGreetInfo(); } else if (currentEncryptedChat == null) { if (isTopic && chatMode == 0) { CreateTopicEmptyView createTopicEmptyView = new CreateTopicEmptyView(getContext(), contentView, themeDelegate); @@ -28140,14 +28711,29 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not emptyMessage = LocaleController.getString(R.string.NoMessages); } if (emptyMessage == null) { - greetingsViewContainer = new ChatGreetingsView(getContext(), currentUser, distance, currentAccount, preloadedGreetingsSticker, themeDelegate); - greetingsViewContainer.setPremiumLock(userInfo != null && userInfo.contact_require_premium && !getUserConfig().isPremium(), dialog_id); + greetingsViewContainer = new ChatGreetingsView(getContext(), currentUser, distance, currentAccount, preloadedGreetingsSticker, themeDelegate) { + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + setVisiblePart(getY() + emptyViewContent.getY(), getServiceHeight(this)); + } + }; + greetingsViewContainer.setPremiumLock(userInfo != null && getDialogId() != getUserConfig().getClientUserId() && userInfo.contact_require_premium && !getUserConfig().isPremium(), dialog_id); greetingsViewContainer.setListener((sticker) -> { animatingDocuments.put(sticker, 0); SendMessagesHelper.getInstance(currentAccount).sendSticker(sticker, null, dialog_id, null, null, null, replyingQuote, null, true, 0, false, null, quickReplyShortcut, getQuickReplyId()); }); - greetingsViewContainer.setBackground(Theme.createServiceDrawable(AndroidUtilities.dp(16), greetingsViewContainer, contentView, getThemedPaint(Theme.key_paint_chatActionBackground))); - emptyViewContainer.addView(greetingsViewContainer, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); +// greetingsViewContainer.setBackground(Theme.createServiceDrawable(AndroidUtilities.dp(16), greetingsViewContainer, contentView, getThemedPaint(Theme.key_paint_chatActionBackground))); + if (userInfo != null && userInfo.business_intro != null) { + greetingsViewContainer.setPreview(userInfo.business_intro.title, userInfo.business_intro.description); + greetingsViewContainer.setSticker(userInfo.business_intro.sticker); + } + emptyViewContent = new LinearLayout(getContext()); + emptyViewContent.setOrientation(LinearLayout.VERTICAL); + emptyViewContent.setGravity(Gravity.CENTER); + emptyViewContent.addView(greetingsViewContainer, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + emptyViewContainer.addView(emptyViewContent, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + updateGreetInfo(); } else { emptyView = new TextView(getContext()); emptyView.setText(emptyMessage); @@ -28201,6 +28787,62 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } + private void updateGreetInfo() { + showGreetInfo( + getDialogId() != getUserConfig().getClientUserId() && + userInfo != null && userInfo.business_intro != null && + !(userInfo != null && userInfo.contact_require_premium && !getUserConfig().isPremium()) + ); + } + + private void showGreetInfo(boolean show) { + if (emptyViewContent == null) return; + if (show && greetingsInfo == null) { + greetingsInfo = new ChatActionCell(getContext(), false, getResourceProvider()) { + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + setVisiblePart(getY() + emptyViewContent.getY(), getServiceHeight(this)); + } + }; + ScaleStateListAnimator.apply(greetingsInfo, .02f, 1.2f); + greetingsInfo.setOnClickListener(v -> { + showDialog(new PremiumFeatureBottomSheet(this, PremiumPreviewFragment.PREMIUM_FEATURE_BUSINESS, true)); + }); + } + if (greetingsInfo == null) return; + if (!show) { + greetingsInfo.setVisibility(View.GONE); + return; + } else { + greetingsInfo.setVisibility(View.VISIBLE); + } + String string = LocaleController.formatString(userInfo != null && userInfo.business_intro != null && TextUtils.isEmpty(userInfo.business_intro.title) && TextUtils.isEmpty(userInfo.business_intro.title) ? R.string.GreetingHowSticker : R.string.GreetingHow, UserObject.getFirstName(currentUser)); + int fromIndex = string.indexOf("**"), toIndex; + SpannableStringBuilder ssb = new SpannableStringBuilder(string); + if (fromIndex > 0) { + string = string.substring(0, fromIndex) + string.substring(fromIndex + 2); + toIndex = string.indexOf("**"); + if (toIndex > 0) { + string = string.substring(0, toIndex) + string.substring(toIndex + 2); + ssb = new SpannableStringBuilder(string); + ProfileActivity.ShowDrawable drawable = new ProfileActivity.ShowDrawable(string.substring(fromIndex, toIndex)); + drawable.setTextColor(Color.WHITE); + drawable.setBackgroundColor(0x1e000000); + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + ssb.setSpan(new ImageSpan(drawable), fromIndex, toIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + greetingsInfo.setCustomText(ssb); + greetingsInfo.setOverrideTextMaxWidth(HintView2.cutInFancyHalf(string, (TextPaint) getThemedPaint(Theme.key_paint_chatActionText))); + if (greetingsInfo.getParent() != null && (!show || greetingsInfo.getParent() != emptyViewContent)) { + ((ViewGroup) greetingsInfo.getParent()).removeView(greetingsInfo); + } + if (show && greetingsInfo.getParent() != emptyViewContent) { + emptyViewContent.addView(greetingsInfo, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM, 0, 10, 0, 0)); + } + } + Runnable updateReactionRunnable; private void showMultipleReactionsPromo(ChatMessageCell cell, ReactionsLayoutInBubble.VisibleReaction visibleReaction, int currentChosenReactions) { @@ -28233,7 +28875,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (isInScheduleMode() || primaryMessage == null) { return; } - + if (getDialogId() == getUserConfig().getClientUserId() && !getUserConfig().isPremium() && primaryMessage.messageOwner != null && (primaryMessage.messageOwner.reactions == null || (primaryMessage.messageOwner.reactions.reactions_as_tags || primaryMessage.messageOwner.reactions.results.isEmpty()))) { new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_SAVED_TAGS, true).show(); return; @@ -29252,6 +29894,110 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ADS, true)); break; } + case OPTION_ABOUT_REVENUE_SHARING_ADS: { + RevenueSharingAdsInfoBottomSheet.showAlert(contentView.getContext(), ChatActivity.this, resourceProvider); + break; + } + case OPTION_REPORT_AD: { + MessageObject message = selectedObject; + TLRPC.TL_channels_reportSponsoredMessage req = new TLRPC.TL_channels_reportSponsoredMessage(); + req.channel = MessagesController.getInputChannel(currentChat); + req.random_id = selectedObject.sponsoredId; + req.option = new byte[]{}; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> { + if (response != null) { + if (response instanceof TLRPC.TL_channels_sponsoredMessageReportResultChooseOption) { + AndroidUtilities.runOnUIThread(() -> { + TLRPC.TL_channels_sponsoredMessageReportResultChooseOption result = (TLRPC.TL_channels_sponsoredMessageReportResultChooseOption) response; + new ReportAdBottomSheet(contentView.getContext(), resourceProvider, message, currentChat) + .setReportChooseOption(result) + .setListener(new ReportAdBottomSheet.Listener() { + @Override + public void onReported() { + AndroidUtilities.runOnUIThread(() -> { + BulletinFactory.of(ChatActivity.this) + .createAdReportedBulletin( + AndroidUtilities.replaceSingleTag( + LocaleController.getString("AdReported", R.string.AdReported), + -1, + AndroidUtilities.REPLACING_TAG_TYPE_LINKBOLD, + () -> Browser.openUrl(getContext(), "https://promote.telegram.org/guidelines"), + resourceProvider + ) + ) + .show(); + removeFromSponsored(message); + removeMessageWithThanos(message); + }, 200); + } + + @Override + public void onHidden() { + AndroidUtilities.runOnUIThread(() -> { + BulletinFactory.of(ChatActivity.this) + .createAdReportedBulletin(LocaleController.getString("AdHidden", R.string.AdHidden)) + .show(); + removeFromSponsored(message); + removeMessageWithThanos(message); + }, 200); + } + + @Override + public void onPremiumRequired() { + showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ADS, true)); + } + }) + .show(); + }); + } else if (response instanceof TLRPC.TL_channels_sponsoredMessageReportResultReported) { + AndroidUtilities.runOnUIThread(() -> { + BulletinFactory.of(ChatActivity.this) + .createAdReportedBulletin( + AndroidUtilities.replaceSingleTag( + LocaleController.getString("AdReported", R.string.AdReported), + -1, + AndroidUtilities.REPLACING_TAG_TYPE_LINKBOLD, + () -> Browser.openUrl(getContext(), "https://promote.telegram.org/guidelines"), + resourceProvider + ) + ) + .show(); + removeFromSponsored(message); + removeMessageWithThanos(message); + }, 200); + } else if (response instanceof TLRPC.TL_channels_sponsoredMessageReportResultAdsHidden) { + AndroidUtilities.runOnUIThread(() -> { + BulletinFactory.of(ChatActivity.this) + .createAdReportedBulletin(LocaleController.getString(R.string.AdHidden)) + .show(); + removeFromSponsored(message); + removeMessageWithThanos(message); + }, 200); + } + } else if (error != null && "AD_EXPIRED".equalsIgnoreCase(error.text)) { + AndroidUtilities.runOnUIThread(() -> { + BulletinFactory.of(ChatActivity.this) + .createAdReportedBulletin( + AndroidUtilities.replaceSingleTag( + LocaleController.getString("AdReported", R.string.AdReported), + -1, + AndroidUtilities.REPLACING_TAG_TYPE_LINKBOLD, + () -> Browser.openUrl(getContext(), "https://promote.telegram.org/guidelines"), + resourceProvider + ) + ) + .show(); + removeFromSponsored(message); + removeMessageWithThanos(message); + }, 200); + } + }); + break; + } + case OPTION_REMOVE_ADS: { + showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ADS, true)); + break; + } case OPTION_SPEED_PROMO: { showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_DOWNLOAD_SPEED, true)); break; @@ -29507,6 +30253,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return false; } else if (chatActivityEnterView != null && chatActivityEnterView.closeCreationLinkDialog()) { return false; + } else if (chatMode == MODE_EDIT_BUSINESS_LINK && BusinessLinksActivity.closeRenameAlert()) { + return false; } if (backToPreviousFragment != null) { parentLayout.addFragmentToStack(backToPreviousFragment, parentLayout.getFragmentStack().size() - 1); @@ -29515,13 +30263,19 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (instantCameraView != null) { instantCameraView.cancel(false); } - if (chatMode == MODE_QUICK_REPLIES && (messages.isEmpty() || threadMessageId == 0)) { + if (chatMode == MODE_QUICK_REPLIES && !(QuickRepliesController.GREETING.equalsIgnoreCase(quickReplyShortcut) || QuickRepliesController.AWAY.equalsIgnoreCase(quickReplyShortcut)) && (messages.isEmpty() || threadMessageId == 0)) { showQuickRepliesRemoveAlert(); return false; } + if (chatMode == MODE_EDIT_BUSINESS_LINK && chatActivityEnterView.businessLinkHasChanges()) { + showBusinessLinksDiscardAlert(() -> { + finishFragment(); + }); + return false; + } return true; } - + private void showQuickRepliesRemoveAlert() { showDialog( new AlertDialog.Builder(getContext(), getResourceProvider()) @@ -29535,6 +30289,22 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not ); } + private void showBusinessLinksDiscardAlert(Runnable onDiscard) { + AlertDialog dialog = new AlertDialog.Builder(getContext(), getResourceProvider()) + .setTitle(LocaleController.getString(R.string.BusinessLinkDiscardChangesTitle)) + .setMessage(LocaleController.getString(R.string.BusinessLinkDiscardChangesMessage)) + .setPositiveButton(LocaleController.getString(R.string.Discard), (di, w) -> { + onDiscard.run(); + }) + .setNegativeButton(LocaleController.getString(R.string.Cancel), null) + .create(); + showDialog(dialog); + TextView button = (TextView) dialog.getButton(DialogInterface.BUTTON_POSITIVE); + if (button != null) { + button.setTextColor(getThemedColor(Theme.key_text_RedBold)); + } + } + public void clearSelectionMode() { clearSelectionMode(false); } @@ -29557,7 +30327,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not fragmentView.invalidate(); } } - + public void setSavedDialog(long savedDialogId) { threadMessageId = savedDialogId; } @@ -30104,86 +30874,88 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not arrayList.add(new MessageObject(UserConfig.selectedAccount, message, true, true)); } } - if (!arrayList.isEmpty() && discussionMessage != null) { - Bundle args = new Bundle(); - long dialogId = arrayList.get(0).getDialogId(); - args.putLong("chat_id", -dialogId); - args.putInt("message_id", Math.max(1, discussionMessage.read_inbox_max_id)); - args.putInt("unread_count", discussionMessage.unread_count); - args.putBoolean("historyPreloaded", history != null); - ChatActivity chatActivity = new ChatActivity(args); - chatActivity.setThreadMessages(arrayList, originalChat, req.msg_id, discussionMessage.read_inbox_max_id, discussionMessage.read_outbox_max_id, null); - if (highlightMsgId != 0) { - chatActivity.highlightMessageId = highlightMsgId; - } - if (originalMessage != null && originalMessage.messageOwner.replies != null && chatActivity.threadMessageObject.messageOwner.replies != null) { - originalMessage.messageOwner.replies.replies = chatActivity.threadMessageObject.messageOwner.replies.replies; - } - if (originalMessage != null && originalMessage.messageOwner.reactions != null) { - chatActivity.threadMessageObject.messageOwner.reactions = originalMessage.messageOwner.reactions; - } - final boolean[] chatOpened = new boolean[] { false }; - Runnable openCommentsChat = () -> { - if (chatOpened[0] || thisCommentLoadingMessageId != commentLoadingMessageId || !isFullyVisible || isFinishing()) { - return; + TLRPC.messages_Messages historyFinal = history; + getMessagesStorage().loadMessageAttachPaths(arrayList, () -> { + if (!arrayList.isEmpty() && discussionMessage != null) { + Bundle args = new Bundle(); + long dialogId = arrayList.get(0).getDialogId(); + args.putLong("chat_id", -dialogId); + args.putInt("message_id", Math.max(1, discussionMessage.read_inbox_max_id)); + args.putInt("unread_count", discussionMessage.unread_count); + args.putBoolean("historyPreloaded", historyFinal != null); + ChatActivity chatActivity = new ChatActivity(args); + chatActivity.setThreadMessages(arrayList, originalChat, req.msg_id, discussionMessage.read_inbox_max_id, discussionMessage.read_outbox_max_id, null); + if (highlightMsgId != 0) { + chatActivity.highlightMessageId = highlightMsgId; } - chatOpened[0] = true; - AndroidUtilities.runOnUIThread(() -> { - commentLoadingMessageId = 0; - chatListView.invalidateViews(); - }, 200); - presentFragment(chatActivity); - if (isKeyboardVisible() && !chatActivity.hideKeyboardOnShow()) { - if (chatActivity.chatActivityEnterView != null && chatActivity.chatActivityEnterView.getEditField() != null) { - chatActivity.chatActivityEnterView.getEditField().requestFocus(); + if (originalMessage != null && originalMessage.messageOwner.replies != null && chatActivity.threadMessageObject.messageOwner.replies != null) { + originalMessage.messageOwner.replies.replies = chatActivity.threadMessageObject.messageOwner.replies.replies; + } + if (originalMessage != null && originalMessage.messageOwner.reactions != null) { + chatActivity.threadMessageObject.messageOwner.reactions = originalMessage.messageOwner.reactions; + } + final boolean[] chatOpened = new boolean[] { false }; + Runnable openCommentsChat = () -> { + if (chatOpened[0] || thisCommentLoadingMessageId != commentLoadingMessageId || !isFullyVisible || isFinishing()) { + return; } - } - }; - if (history != null) { - int fnid = 0; - if (!history.messages.isEmpty()) { - for (int a = history.messages.size() - 1; a >= 0; a--) { - TLRPC.Message message = history.messages.get(a); - if (message.id > maxReadId && !message.out) { - fnid = message.id; - break; - } - } - } - - TLRPC.messages_Messages historyFinal = history; - int fnidFinal = fnid; - final int commentsClassGuid = chatActivity.getClassGuid(); - final NotificationCenter.NotificationCenterDelegate observer = new NotificationCenter.NotificationCenterDelegate() { - @Override - public void didReceivedNotification(int id, int account, Object... args) { - if (id == NotificationCenter.messagesDidLoad && (Integer) args[10] == commentsClassGuid) { - openCommentsChat.run(); - AndroidUtilities.runOnUIThread(() -> { - chatActivity.didReceivedNotification(id, account, args); - }, 50); - NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.messagesDidLoad); + chatOpened[0] = true; + AndroidUtilities.runOnUIThread(() -> { + commentLoadingMessageId = 0; + chatListView.invalidateViews(); + }, 200); + presentFragment(chatActivity); + if (isKeyboardVisible() && !chatActivity.hideKeyboardOnShow()) { + if (chatActivity.chatActivityEnterView != null && chatActivity.chatActivityEnterView.getEditField() != null) { + chatActivity.chatActivityEnterView.getEditField().requestFocus(); } } }; - NotificationCenter.getInstance(currentAccount).addObserver(observer, NotificationCenter.messagesDidLoad); - Utilities.stageQueue.postRunnable(() -> { - getMessagesController().processLoadedMessages(historyFinal, historyFinal.messages.size(), dialogId, 0, 30, (highlightMsgId > 0 ? highlightMsgId : maxReadId), 0, false, commentsClassGuid, fnidFinal, 0, 0, 0, (highlightMsgId > 0 ? 3 : 2), true, 0, arrayList.get(arrayList.size() - 1).getId(), 1, false, 0, true, isTopic, null); - }); + if (historyFinal != null) { + int fnid = 0; + if (!historyFinal.messages.isEmpty()) { + for (int a = historyFinal.messages.size() - 1; a >= 0; a--) { + TLRPC.Message message = historyFinal.messages.get(a); + if (message.id > maxReadId && !message.out) { + fnid = message.id; + break; + } + } + } + + int fnidFinal = fnid; + final int commentsClassGuid = chatActivity.getClassGuid(); + final NotificationCenter.NotificationCenterDelegate observer = new NotificationCenter.NotificationCenterDelegate() { + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.messagesDidLoad && (Integer) args[10] == commentsClassGuid) { + openCommentsChat.run(); + AndroidUtilities.runOnUIThread(() -> { + chatActivity.didReceivedNotification(id, account, args); + }, 50); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.messagesDidLoad); + } + } + }; + NotificationCenter.getInstance(currentAccount).addObserver(observer, NotificationCenter.messagesDidLoad); + Utilities.stageQueue.postRunnable(() -> { + getMessagesController().processLoadedMessages(historyFinal, historyFinal.messages.size(), dialogId, 0, 30, (highlightMsgId > 0 ? highlightMsgId : maxReadId), 0, false, commentsClassGuid, fnidFinal, 0, 0, 0, (highlightMsgId > 0 ? 3 : 2), true, 0, arrayList.get(arrayList.size() - 1).getId(), 1, false, 0, true, isTopic, null); + }); + } else { + openCommentsChat.run(); + } } else { - openCommentsChat.run(); - } - } else { - commentLoadingMessageId = 0; - chatListView.invalidateViews(); - if (fallbackMessage != null) { - openOriginalReplyChat(fallbackMessage); - } else { - if (getParentActivity() != null) { - BulletinFactory.of(this).createErrorBulletin(LocaleController.getString("ChannelPostDeleted", R.string.ChannelPostDeleted), themeDelegate).show(); + commentLoadingMessageId = 0; + chatListView.invalidateViews(); + if (fallbackMessage != null) { + openOriginalReplyChat(fallbackMessage); + } else { + if (getParentActivity() != null) { + BulletinFactory.of(this).createErrorBulletin(LocaleController.getString("ChannelPostDeleted", R.string.ChannelPostDeleted), themeDelegate).show(); + } } } - } + }); } private void openDiscussionMessageChat(long chatId, MessageObject originalMessage, int messageId, long linkedChatId, int maxReadId, int highlightMsgId, MessageObject fallbackMessage) { @@ -30421,6 +31193,17 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } + private void removeMessageWithThanos(MessageObject messageObject) { + int index = messages.indexOf(messageObject); + if (index == -1) { + return; + } + messages.remove(index); + if (chatAdapter != null && !chatAdapter.isFiltered) { + chatAdapter.notifyItemRemoved(chatAdapter.messagesStartRow + index, true); + } + } + public void openVCard(TLRPC.User user, String phone, String vcard, String first_name, String last_name) { if (user != null) { Bundle args = new Bundle(); @@ -31124,8 +31907,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (chatMode == MODE_QUICK_REPLIES && !QuickRepliesController.isSpecial(quickReplyShortcut)) { hintRow = rowCount++; - } else { - hintRow = -5; } if (isFiltered ? !filteredEndReached : (!endReached[0] || mergeDialogId != 0 && !endReached[1]) && !(DISABLE_PROGRESS_VIEW && !AndroidUtilities.isTablet() && !isComments && currentUser == null)) { @@ -31943,6 +32724,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not messageCell.makeVisibleAfterChange = false; messageCell.setVisibility(View.VISIBLE); } + showBotMessageHint(messageCell, false); } else if (view instanceof ChatActionCell) { ChatActionCell actionCell = (ChatActionCell) view; actionCell.setMessageObject(message); @@ -32880,6 +33662,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not showDialog(new PremiumFeatureBottomSheet(ChatActivity.this, PremiumPreviewFragment.PREMIUM_FEATURE_ADS, true)); } + @Override + public void didPressSponsoredInfo(ChatMessageCell cell, float x, float y) { + createMenu(cell, true, false, x, y, false); + } + @Override public void didPressUserStatus(ChatMessageCell cell, TLRPC.User user, TLRPC.Document document) { if (cell == null) { @@ -34412,6 +35199,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public boolean doNotShowLoadingReply(MessageObject msg) { return msg != null && msg.getDialogId() == UserObject.REPLY_BOT || (chatAdapter != null && chatAdapter.isFiltered); } + + @Override + public void didPressAboutRevenueSharingAds() { + if (contentView == null || getParentActivity() == null) { + return; + } + RevenueSharingAdsInfoBottomSheet.showAlert(contentView.getContext(), ChatActivity.this, resourceProvider); + } }; private void openUserProfile(long uid) { @@ -36578,6 +37373,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } private void invalidatePremiumBlocked() { + if (getDialogId() == getUserConfig().getClientUserId()) + return; if (getUserConfig().isPremium()) return; if (currentUser == null || !currentUser.contact_require_premium) @@ -36595,4 +37392,33 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } return result; } + + public void showPremiumFloodWaitBulletin(final boolean isUpload) { + final long now = System.currentTimeMillis(); + if (now - ConnectionsManager.lastPremiumFloodWaitShown < 1000L * MessagesController.getInstance(currentAccount).uploadPremiumSpeedupNotifyPeriod) { + return; + } + ConnectionsManager.lastPremiumFloodWaitShown = now; + if (UserConfig.getInstance(currentAccount).isPremium() || MessagesController.getInstance(currentAccount).premiumFeaturesBlocked()) { + return; + } + + final float n; + if (isUpload) { + n = MessagesController.getInstance(currentAccount).uploadPremiumSpeedupUpload; + } else { + n = MessagesController.getInstance(currentAccount).uploadPremiumSpeedupDownload; + } + SpannableString boldN = new SpannableString(Double.toString(Math.round(n * 10) / 10.0).replaceAll("\\.0$", "")); + boldN.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), 0, boldN.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + if (hasStoryViewer()) return; + BulletinFactory.of(this).createSimpleBulletin( + R.raw.speed_limit, + LocaleController.getString(isUpload ? R.string.UploadSpeedLimited : R.string.DownloadSpeedLimited), + AndroidUtilities.replaceCharSequence("%d", AndroidUtilities.premiumText(LocaleController.getString(isUpload ? R.string.UploadSpeedLimitedMessage : R.string.DownloadSpeedLimitedMessage), () -> { + presentFragment(new PremiumPreviewFragment(isUpload ? "upload_speed" : "download_speed")); + }), boldN) + ).setDuration(8000).show(true); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatRightsEditActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatRightsEditActivity.java index 3004c1067..f7b2a5615 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatRightsEditActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatRightsEditActivity.java @@ -981,7 +981,7 @@ public class ChatRightsEditActivity extends BaseFragment { builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("EditAdminTransferReadyAlertText", R.string.EditAdminTransferReadyAlertText, currentChat.title, UserObject.getFirstName(currentUser)))); builder.setPositiveButton(LocaleController.getString("EditAdminTransferChangeOwner", R.string.EditAdminTransferChangeOwner), (dialogInterface, i) -> { TwoStepVerificationActivity fragment = new TwoStepVerificationActivity(); - fragment.setDelegate(password -> initTransfer(password, fragment)); + fragment.setDelegate(0, password -> initTransfer(password, fragment)); presentFragment(fragment); }); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); @@ -1181,11 +1181,13 @@ public class ChatRightsEditActivity extends BaseFragment { banUsersRow = rowCount++; addUsersRow = rowCount++; pinMessagesRow = rowCount++; - channelStoriesRow = rowCount++; - if (channelStoriesExpanded) { - channelPostStoriesRow = rowCount++; - channelEditStoriesRow = rowCount++; - channelDeleteStoriesRow = rowCount++; + if (ChatObject.isChannel(currentChat)) { + channelStoriesRow = rowCount++; + if (channelStoriesExpanded) { + channelPostStoriesRow = rowCount++; + channelEditStoriesRow = rowCount++; + channelDeleteStoriesRow = rowCount++; + } } startVoiceChatRow = rowCount++; addAdminsRow = rowCount++; @@ -1334,7 +1336,7 @@ public class ChatRightsEditActivity extends BaseFragment { LimitReachedBottomSheet restrictedUsersBottomSheet = new LimitReachedBottomSheet(ChatRightsEditActivity.this, getParentActivity(), LimitReachedBottomSheet.TYPE_ADD_MEMBERS_RESTRICTED, currentAccount, getResourceProvider()); ArrayList arrayList = new ArrayList<>(); arrayList.add(currentUser); - restrictedUsersBottomSheet.setRestrictedUsers(currentChat, arrayList); + restrictedUsersBottomSheet.setRestrictedUsers(currentChat, arrayList, null, null); restrictedUsersBottomSheet.show(); return false; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java index 7a9c3c781..a4450a507 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java @@ -892,7 +892,7 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente GroupCreateActivity fragment = new GroupCreateActivity(args); fragment.setInfo(info); fragment.setIgnoreUsers(contactsMap != null && contactsMap.size() != 0 ? contactsMap : participantsMap); - fragment.setDelegate(new GroupCreateActivity.ContactsAddActivityDelegate() { + fragment.setDelegate2(new GroupCreateActivity.ContactsAddActivityDelegate() { @Override public void didSelectUsers(ArrayList users, int fwdCount) { if (fragment.getParentActivity() == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java index b656c3a01..67dd85879 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java @@ -9,6 +9,8 @@ package org.telegram.ui.Components; import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.formatDateOnline; +import static org.telegram.messenger.LocaleController.getString; import android.Manifest; import android.annotation.SuppressLint; @@ -45,7 +47,7 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.text.style.URLSpan; import android.util.Base64; -import android.util.Pair; +import android.util.Log; import android.util.SparseArray; import android.util.TypedValue; import android.view.Gravity; @@ -117,30 +119,23 @@ import org.telegram.ui.LaunchActivity; import org.telegram.ui.LoginActivity; import org.telegram.ui.NotificationsCustomSettingsActivity; import org.telegram.ui.NotificationsSettingsActivity; +import org.telegram.ui.PrivacyControlActivity; import org.telegram.ui.ProfileNotificationsActivity; import org.telegram.ui.Stories.recorder.ButtonWithCounterView; import org.telegram.ui.ThemePreviewActivity; import org.telegram.ui.TooManyCommunitiesActivity; import java.net.IDN; -import java.time.Instant; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.temporal.ChronoField; -import java.time.temporal.TemporalField; +import java.time.YearMonth; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; -import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Set; -import java.util.TimeZone; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; @@ -2500,39 +2495,53 @@ public class AlertsCreator { return popupWindow; } - public static void checkRestrictedInviteUsers(int currentAccount, TLRPC.Chat currentChat, TLRPC.Updates updates) { - if (updates == null || updates.updates == null || currentChat == null) { + public static void checkRestrictedInviteUsers(int currentAccount, TLRPC.Chat currentChat, TLRPC.TL_messages_invitedUsers invitedUsers) { + if (invitedUsers == null || invitedUsers.missing_invitees.isEmpty() || currentChat == null) { return; } - ArrayList arrayList = null; - for (int i = 0; i < updates.updates.size(); i++) { - if (updates.updates.get(i) instanceof TLRPC.TL_updateGroupInvitePrivacyForbidden) { - TLRPC.TL_updateGroupInvitePrivacyForbidden restrictedUpdate = (TLRPC.TL_updateGroupInvitePrivacyForbidden) updates.updates.get(i); - TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(restrictedUpdate.user_id); - if (user != null) { - if (arrayList == null) { - arrayList = new ArrayList<>(); + ArrayList users = new ArrayList<>(); + ArrayList pmLockedUsers = new ArrayList<>(); + ArrayList inviteLockedUsers = new ArrayList<>(); + for (TLRPC.TL_missingInvitee missing_invitee : invitedUsers.missing_invitees) { + TLRPC.User user = null; + if (invitedUsers.updates != null) { + for (int i = 0; i < invitedUsers.updates.users.size(); ++i) { + TLRPC.User u = invitedUsers.updates.users.get(i); + if (u.id == missing_invitee.user_id) { + user = u; + break; } - arrayList.add(user); } } + if (user == null) { + user = MessagesController.getInstance(currentAccount).getUser(missing_invitee.user_id); + } + if (user == null) { + continue; + } + users.add(user); + if (missing_invitee.premium_required_for_pm) { + pmLockedUsers.add(user.id); + } + if (missing_invitee.premium_would_allow_invite) { + inviteLockedUsers.add(user.id); + } } - if (arrayList != null) { - ArrayList finalArrayList = arrayList; - AndroidUtilities.runOnUIThread(() -> { - BaseFragment lastFragment = LaunchActivity.getLastFragment(); - if (lastFragment != null && lastFragment.getParentActivity() != null) { - LimitReachedBottomSheet restrictedUsersBottomSheet = new LimitReachedBottomSheet(lastFragment, lastFragment.getParentActivity(), LimitReachedBottomSheet.TYPE_ADD_MEMBERS_RESTRICTED, currentAccount, null); - restrictedUsersBottomSheet.setRestrictedUsers(currentChat, finalArrayList); - restrictedUsersBottomSheet.show(); - } - }, 200); - } + if (users.isEmpty()) + return; + AndroidUtilities.runOnUIThread(() -> { + BaseFragment lastFragment = LaunchActivity.getLastFragment(); + if (lastFragment != null && lastFragment.getParentActivity() != null) { + LimitReachedBottomSheet restrictedUsersBottomSheet = new LimitReachedBottomSheet(lastFragment, lastFragment.getParentActivity(), LimitReachedBottomSheet.TYPE_ADD_MEMBERS_RESTRICTED, currentAccount, null); + restrictedUsersBottomSheet.setRestrictedUsers(currentChat, users, pmLockedUsers, inviteLockedUsers); + restrictedUsersBottomSheet.show(); + } + }, 200); } public interface BlockDialogCallback { void run(boolean report, boolean delete); - } + }; public static void createBlockDialogAlert(BaseFragment fragment, int count, boolean reportSpam, TLRPC.User user, BlockDialogCallback onProcessRunnable) { if (fragment == null || fragment.getParentActivity() == null || count == 1 && user == null) { @@ -2746,13 +2755,6 @@ public class AlertsCreator { minutePicker.setGravity(Gravity.LEFT); minutePicker.setTextOffset(dp(12)); final Utilities.Callback checkValue = (byChange) -> { - if (byChange) { - try { - linearLayout.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignore) { - } - } - int minTimeMinutes = minTime % 60; int minTimeHours = (minTime - minTimeMinutes) / 60; int maxTimeMinutes = maxTime % 60; @@ -3302,11 +3304,6 @@ public class AlertsCreator { } }); final NumberPicker.OnValueChangeListener onValueChangeListener = (picker, oldVal, newVal) -> { - try { - container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignore) { - - } checkScheduleDate(buttonTextView, null, selfUserId == dialogId ? 1 : 0, dayPicker, hourPicker, minutePicker); }; dayPicker.setOnValueChangedListener(onValueChangeListener); @@ -3488,11 +3485,6 @@ public class AlertsCreator { } }); final NumberPicker.OnValueChangeListener onValueChangeListener = (picker, oldVal, newVal) -> { - try { - container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignore) { - - } checkScheduleDate(null, null, 0, dayPicker, hourPicker, minutePicker); }; dayPicker.setOnValueChangedListener(onValueChangeListener); @@ -3555,6 +3547,254 @@ public class AlertsCreator { return builder; } + public static BottomSheet.Builder createBirthdayPickerDialog(Context context, String title, String button, TLRPC.TL_birthday currentBirthday, final Utilities.Callback whenSelectedBirthday, Runnable addPrivacyText, Theme.ResourcesProvider resourcesProvider) { + if (context == null) { + return null; + } + + BottomSheet.Builder builder = new BottomSheet.Builder(context, false, resourcesProvider); + builder.setApplyBottomPadding(false); + + final NumberPicker dayPicker = new NumberPicker(context, resourcesProvider); + dayPicker.setTextOffset(dp(10)); + dayPicker.setItemCount(5); + final NumberPicker monthPicker = new NumberPicker(context, resourcesProvider); + monthPicker.setItemCount(5); + monthPicker.setTextOffset(-dp(10)); + final NumberPicker yearPicker = new NumberPicker(context, resourcesProvider); + yearPicker.setItemCount(5); + yearPicker.setTextOffset(-dp(24)); + + LinearLayout container = new LinearLayout(context) { + + boolean ignoreLayout = false; + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + ignoreLayout = true; + int count; + if (AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y) { + count = 3; + } else { + count = 5; + } + dayPicker.setItemCount(count); + monthPicker.setItemCount(count); + yearPicker.setItemCount(count); + dayPicker.getLayoutParams().height = dp(NumberPicker.DEFAULT_SIZE_PER_COUNT) * count; + monthPicker.getLayoutParams().height = dp(NumberPicker.DEFAULT_SIZE_PER_COUNT) * count; + yearPicker.getLayoutParams().height = dp(NumberPicker.DEFAULT_SIZE_PER_COUNT) * count; + ignoreLayout = false; + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + public void requestLayout() { + if (ignoreLayout) { + return; + } + super.requestLayout(); + } + }; + container.setOrientation(LinearLayout.VERTICAL); + + FrameLayout titleLayout = new FrameLayout(context); + container.addView(titleLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 22, 0, 0, 4)); + + TextView titleView = new TextView(context); + titleView.setText(title); + titleView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack, resourcesProvider)); + titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + titleView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + titleLayout.addView(titleView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 12, 0, 0)); + titleView.setOnTouchListener((v, event) -> true); + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setGravity(Gravity.CENTER); + linearLayout.setOrientation(LinearLayout.HORIZONTAL); + linearLayout.setWeightSum(1.0f); + container.addView(linearLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 1f, 0, 0, 12, 0, 12)); + + Calendar calendar = Calendar.getInstance(); + int minYear = calendar.get(Calendar.YEAR) - 149; + calendar.setTimeInMillis(System.currentTimeMillis()); + int thisDay = calendar.get(Calendar.DAY_OF_MONTH); + int thisMonth = calendar.get(Calendar.MONTH); + int thisYear = calendar.get(Calendar.YEAR); + final int undefinedYear = thisYear + 1; + + Runnable check = () -> { + if (yearPicker.getValue() == undefinedYear) { + dayPicker.setMinValue(1); + try { + dayPicker.setMaxValue(YearMonth.of(2024, 1 + monthPicker.getValue()).lengthOfMonth()); + } catch (Exception e) { + FileLog.e(e); + dayPicker.setMaxValue(31); + } + monthPicker.setMinValue(0); + monthPicker.setMaxValue(11); + } else if (yearPicker.getValue() == thisYear) { + monthPicker.setMinValue(0); + monthPicker.setMaxValue(thisMonth); + if (monthPicker.getValue() == thisMonth) { + dayPicker.setMinValue(1); + dayPicker.setMaxValue(1 + thisDay - 1); + } else { + dayPicker.setMinValue(1); + try { + dayPicker.setMaxValue(YearMonth.of(yearPicker.getValue(), 1 + monthPicker.getValue()).lengthOfMonth()); + } catch (Exception e) { + FileLog.e(e); + dayPicker.setMaxValue(31); + } + } + } else { + dayPicker.setMinValue(1); + try { + dayPicker.setMaxValue(YearMonth.of(yearPicker.getValue(), 1 + monthPicker.getValue()).lengthOfMonth()); + } catch (Exception e) { + FileLog.e(e); + dayPicker.setMaxValue(31); + } + monthPicker.setMinValue(0); + monthPicker.setMaxValue(11); + } + }; + + long currentTime = System.currentTimeMillis(); + + TextView buttonTextView = new TextView(context) { + @Override + public CharSequence getAccessibilityClassName() { + return Button.class.getName(); + } + }; + + linearLayout.addView(dayPicker, LayoutHelper.createLinear(0, 54 * 5, 0.25f)); + dayPicker.setMinValue(1); + dayPicker.setMaxValue(31); + dayPicker.setWrapSelectorWheel(false); + dayPicker.setFormatter(value -> "" + value); + final NumberPicker.OnScrollListener onScrollListener = (view, state) -> { + if (state == NumberPicker.OnScrollListener.SCROLL_STATE_IDLE) check.run(); + }; + dayPicker.setOnScrollListener(onScrollListener); + + monthPicker.setMinValue(0); + monthPicker.setMaxValue(11); + monthPicker.setWrapSelectorWheel(false); + linearLayout.addView(monthPicker, LayoutHelper.createLinear(0, 54 * 5, 0.5f)); + monthPicker.setFormatter(value -> { + switch (value) { + case 0: return LocaleController.getString(R.string.January); + case 1: return LocaleController.getString(R.string.February); + case 2: return LocaleController.getString(R.string.March); + case 3: return LocaleController.getString(R.string.April); + case 4: return LocaleController.getString(R.string.May); + case 5: return LocaleController.getString(R.string.June); + case 6: return LocaleController.getString(R.string.July); + case 7: return LocaleController.getString(R.string.August); + case 8: return LocaleController.getString(R.string.September); + case 9: return LocaleController.getString(R.string.October); + case 10: return LocaleController.getString(R.string.November); + case 11: + default: { + return LocaleController.getString(R.string.December); + } + } + }); + monthPicker.setOnScrollListener(onScrollListener); + + yearPicker.setMinValue(minYear); + yearPicker.setMaxValue(undefinedYear); + yearPicker.setWrapSelectorWheel(false); + yearPicker.setFormatter(value -> value == undefinedYear ? "โ€”" : String.format("%02d", value)); + linearLayout.addView(yearPicker, LayoutHelper.createLinear(0, 54 * 5, 0.25f)); + yearPicker.setOnScrollListener(onScrollListener); + + if (currentBirthday != null) { + dayPicker.setValue(currentBirthday.day); + monthPicker.setValue(currentBirthday.month - 1); + if ((currentBirthday.flags & 1) != 0) { + yearPicker.setValue(currentBirthday.year); + } else { + yearPicker.setValue(undefinedYear); + } + } else { + dayPicker.setValue(calendar.get(Calendar.DAY_OF_MONTH)); + monthPicker.setValue(calendar.get(Calendar.MONTH)); + yearPicker.setValue(undefinedYear); + } + + check.run(); + + if (addPrivacyText != null) { + FrameLayout frameLayout = new FrameLayout(context); + LinkSpanDrawable.LinksTextView textView = new LinkSpanDrawable.LinksTextView(context); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + textView.setTextColor(Theme.getColor(Theme.key_dialogTextGray2, resourcesProvider)); + textView.setLinkTextColor(Theme.getColor(Theme.key_chat_messageLinkIn, resourcesProvider)); + textView.setGravity(Gravity.CENTER); + frameLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER));; + container.addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + + final int currentAccount = UserConfig.selectedAccount; + Runnable setText = () -> { + ArrayList rules = ContactsController.getInstance(currentAccount).getPrivacyRules(ContactsController.PRIVACY_RULES_TYPE_BIRTHDAY); + String string = getString(R.string.EditProfileBirthdayInfoContacts); + if (rules != null && !rules.isEmpty()) { + for (int i = 0; i < rules.size(); ++i) { + if (rules.get(i) instanceof TLRPC.TL_privacyValueAllowContacts) { + string = getString(R.string.EditProfileBirthdayInfoContacts); + break; + } + if (rules.get(i) instanceof TLRPC.TL_privacyValueAllowAll || rules.get(i) instanceof TLRPC.TL_privacyValueDisallowAll) { + string = getString(R.string.EditProfileBirthdayInfo); + } + } + } + textView.setText(AndroidUtilities.replaceArrows(AndroidUtilities.replaceSingleTag(string, () -> { + if (rules == null) return; + BaseFragment fragment = LaunchActivity.getLastFragment(); + if (fragment == null) return; + BaseFragment.BottomSheetParams bottomSheetParams = new BaseFragment.BottomSheetParams(); + bottomSheetParams.transitionFromLeft = true; + bottomSheetParams.allowNestedScroll = false; + fragment.showAsSheet(new PrivacyControlActivity(PrivacyControlActivity.PRIVACY_RULES_TYPE_BIRTHDAY), bottomSheetParams); + }), true)); + }; + setText.run(); + + NotificationCenter.getInstance(currentAccount).listen(frameLayout, NotificationCenter.privacyRulesUpdated, args -> setText.run()); + ContactsController.getInstance(currentAccount).loadPrivacySettings(); + } + + buttonTextView.setPadding(dp(34), 0, dp(34), 0); + buttonTextView.setGravity(Gravity.CENTER); + buttonTextView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText, resourcesProvider)); + buttonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + buttonTextView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + buttonTextView.setText(button); + buttonTextView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(dp(8), Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider), Theme.getColor(Theme.key_featuredStickers_addButtonPressed, resourcesProvider))); + container.addView(buttonTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.BOTTOM, 16, 15, 16, 16)); + buttonTextView.setOnClickListener(v -> { + TLRPC.TL_birthday b = new TLRPC.TL_birthday(); + b.day = dayPicker.getValue(); + b.month = 1 + monthPicker.getValue(); + if (yearPicker.getValue() != undefinedYear) { + b.flags |= 1; + b.year = yearPicker.getValue(); + } + builder.getDismissRunnable().run(); + whenSelectedBirthday.run(b); + }); + + builder.setCustomView(container); + return builder; + } + + public interface StatusUntilDatePickerDelegate { void didSelectDate(int date); } @@ -3632,7 +3872,7 @@ public class AlertsCreator { titleView.setTextColor(datePickerColors.textColor); titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - titleView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + titleView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); titleLayout.addView(titleView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 12, 0, 0)); titleView.setOnTouchListener((v, event) -> true); @@ -3676,11 +3916,6 @@ public class AlertsCreator { } }); final NumberPicker.OnValueChangeListener onValueChangeListener = (picker, oldVal, newVal) -> { - try { - container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignore) { - - } checkScheduleDate(null, null, 0, dayPicker, hourPicker, minutePicker); }; dayPicker.setOnValueChangedListener(onValueChangeListener); @@ -3877,7 +4112,6 @@ public class AlertsCreator { } else { buttonTextView.setText(LocaleController.getString("SetAutoDeleteTimer", R.string.SetAutoDeleteTimer)); } - container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); } catch (Exception ignore) { } @@ -4015,11 +4249,7 @@ public class AlertsCreator { container.addView(buttonTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.BOTTOM, 16, 15, 16, 16)); final NumberPicker.OnValueChangeListener onValueChangeListener = (picker, oldVal, newVal) -> { - try { - container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignore) { - } }; times.setOnValueChangedListener(onValueChangeListener); minutes.setOnValueChangedListener(onValueChangeListener); @@ -4167,11 +4397,7 @@ public class AlertsCreator { linearLayout.addView(numberPicker, LayoutHelper.createLinear(0, 54 * 5, 1f)); final NumberPicker.OnValueChangeListener onValueChangeListener = (picker, oldVal, newVal) -> { - try { - container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignore) { - } }; numberPicker.setOnValueChangedListener(onValueChangeListener); @@ -4342,11 +4568,6 @@ public class AlertsCreator { dayPicker.setWrapSelectorWheel(false); dayPicker.setFormatter(value -> "" + value); final NumberPicker.OnValueChangeListener onValueChangeListener = (picker, oldVal, newVal) -> { - try { - container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); - } catch (Exception ignore) { - - } checkCalendarDate(minDate, dayPicker, monthPicker, yearPicker); }; dayPicker.setOnValueChangedListener(onValueChangeListener); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiDrawable.java index 25845ccaa..8aff260ad 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiDrawable.java @@ -26,6 +26,7 @@ import org.telegram.SQLite.SQLitePreparedStatement; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.BuildVars; import org.telegram.messenger.DocumentObject; +import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLoader; @@ -42,7 +43,6 @@ import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.NativeByteBuffer; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; -import org.telegram.ui.Components.Reactions.HwEmojis; import org.telegram.ui.SelectAnimatedEmojiDialog; import java.io.File; @@ -73,6 +73,10 @@ public class AnimatedEmojiDrawable extends Drawable { public static final int CACHE_TYPE_ALERT_PREVIEW_STATIC_WITH_THUMB = 16; public static final int CACHE_TYPE_EMOJI_CALL = 17; public static final int CACHE_TYPE_SAVED_REACTION = 18; + public static final int CACHE_TYPE_COLORABLE = 19; + // taken from RestrictedEmoji, using thumb as regular emojis + public static final int CACHE_TYPE_STANDARD_EMOJI = 20; + public static final int CACHE_TYPE_ALERT_STANDARD_EMOJI = 21; public int rawDrawIndex; @@ -179,6 +183,7 @@ public class AnimatedEmojiDrawable extends Drawable { } public void fetchDocument(long id, ReceivedDocument onDone) { + if (id == 0) return; synchronized (this) { if (emojiDocumentsCache != null) { TLRPC.Document cacheDocument = emojiDocumentsCache.get(id); @@ -423,6 +428,7 @@ public class AnimatedEmojiDrawable extends Drawable { private int currentAccount; private String absolutePath; + private boolean imageReceiverEmojiThumb; private ImageReceiver imageReceiver; private float alpha = 1f; @@ -458,10 +464,26 @@ public class AnimatedEmojiDrawable extends Drawable { this.initDocument(false); } + public void setupEmojiThumb(String emoji) { + if (cacheType != CACHE_TYPE_STANDARD_EMOJI && cacheType != CACHE_TYPE_ALERT_STANDARD_EMOJI) { + return; + } + if (TextUtils.isEmpty(emoji)) { + return; + } + if (imageReceiver != null) { + return; + } + createImageReceiver(); + imageReceiverEmojiThumb = true; + imageReceiver.setImageBitmap(Emoji.getEmojiDrawable(emoji)); + imageReceiver.setCrossfadeWithOldImage(true); + } + private void updateSize() { if (this.cacheType == CACHE_TYPE_MESSAGES) { sizedp = (int) ((Math.abs(Theme.chat_msgTextPaint.ascent()) + Math.abs(Theme.chat_msgTextPaint.descent())) * 1.15f / AndroidUtilities.density); - } else if (this.cacheType == CACHE_TYPE_MESSAGES_LARGE || this.cacheType == CACHE_TYPE_ALERT_PREVIEW_LARGE) { + } else if (this.cacheType == CACHE_TYPE_MESSAGES_LARGE || this.cacheType == CACHE_TYPE_ALERT_PREVIEW_LARGE || this.cacheType == CACHE_TYPE_COLORABLE || this.cacheType == CACHE_TYPE_STANDARD_EMOJI || this.cacheType == CACHE_TYPE_ALERT_STANDARD_EMOJI) { 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) { sizedp = (int) ((Math.abs(Theme.chat_msgTextPaintEmoji[0].ascent()) + Math.abs(Theme.chat_msgTextPaintEmoji[0].descent())) * 1.15f / AndroidUtilities.density); @@ -487,10 +509,7 @@ public class AnimatedEmojiDrawable extends Drawable { return this.document; } - private void initDocument(boolean force) { - if (document == null || (imageReceiver != null && !force)) { - return; - } + private void createImageReceiver() { if (imageReceiver == null) { imageReceiver = new ImageReceiver() { @Override @@ -510,7 +529,14 @@ public class AnimatedEmojiDrawable extends Drawable { imageReceiver.ignoreNotifications = true; } }; + } + private void initDocument(boolean force) { + if (document == null || (imageReceiver != null && !imageReceiverEmojiThumb && !force) || (cacheType == CACHE_TYPE_STANDARD_EMOJI || cacheType == CACHE_TYPE_ALERT_STANDARD_EMOJI) && document instanceof TLRPC.TL_documentEmpty) { + return; + } + imageReceiverEmojiThumb = false; + createImageReceiver(); if (colorFilterToSet != null && canOverrideColor()) { imageReceiver.setColorFilter(colorFilterToSet); } @@ -533,7 +559,7 @@ public class AnimatedEmojiDrawable extends Drawable { 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"; } - 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) { + 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 && cacheType != CACHE_TYPE_COLORABLE && cacheType != CACHE_TYPE_STANDARD_EMOJI && cacheType != CACHE_TYPE_ALERT_STANDARD_EMOJI) { filter += "_compress"; } if (cacheType == STANDARD_LOTTIE_FRAME) { @@ -568,6 +594,12 @@ public class AnimatedEmojiDrawable extends Drawable { mediaLocation = null; mediaFilter = filter; } + if (cacheType == CACHE_TYPE_STANDARD_EMOJI || cacheType == CACHE_TYPE_ALERT_STANDARD_EMOJI) { + Drawable emojiDrawable = Emoji.getEmojiDrawable(MessageObject.findAnimatedEmojiEmoticon(document, null)); + if (emojiDrawable != null) { + thumbDrawable = emojiDrawable; + } + } if (absolutePath != null) { imageReceiver.setImageBitmap(new AnimatedFileDrawable(new File(absolutePath), true, 0, 0, null, null, null, 0, currentAccount, true, 512, 512, null)); @@ -600,7 +632,7 @@ public class AnimatedEmojiDrawable extends Drawable { if (cacheType == CACHE_TYPE_ALERT_PREVIEW_STATIC || cacheType == CACHE_TYPE_ALERT_PREVIEW_STATIC_WITH_THUMB || cacheType == CACHE_TYPE_ALERT_PREVIEW || cacheType == CACHE_TYPE_ALERT_PREVIEW_TAB_STRIP || cacheType == CACHE_TYPE_ALERT_PREVIEW_LARGE) { imageReceiver.setLayerNum(7); } - if (cacheType == CACHE_TYPE_ALERT_EMOJI_STATUS) { + if (cacheType == CACHE_TYPE_ALERT_EMOJI_STATUS || cacheType == CACHE_TYPE_ALERT_STANDARD_EMOJI) { imageReceiver.setLayerNum(6656); } imageReceiver.setAspectFit(true); @@ -770,6 +802,9 @@ public class AnimatedEmojiDrawable extends Drawable { private Boolean canOverrideColorCached = null; public boolean canOverrideColor() { + if (cacheType == CACHE_TYPE_COLORABLE) { + return true; + } if (canOverrideColorCached != null) { return canOverrideColorCached; } @@ -1072,6 +1107,13 @@ public class AnimatedEmojiDrawable extends Drawable { changeProgress.set(1, true); } + public float isNotEmpty() { + return ( + (drawables[1] != null ? 1f - changeProgress.get() : 0) + + (drawables[0] != null ? changeProgress.get() : 0) + ); + } + public boolean set(long documentId, int cacheType, boolean animated) { if (drawables[0] instanceof AnimatedEmojiDrawable && ((AnimatedEmojiDrawable) drawables[0]).getDocumentId() == documentId) { return false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java index af509b0f2..b8f95cc97 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedEmojiSpan.java @@ -8,17 +8,21 @@ import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.text.Layout; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; +import android.text.TextUtils; import android.text.style.CharacterStyle; import android.text.style.ReplacementSpan; import android.util.LongSparseArray; +import android.view.Gravity; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Emoji; @@ -39,14 +43,16 @@ public class AnimatedEmojiSpan extends ReplacementSpan { public long documentId; public TLRPC.Document document; + public String emoji; private float scale; private float extraScale = 1f; public boolean standard; public boolean full = false; public boolean top = false; + public boolean invert = false; private Paint.FontMetricsInt fontMetrics; - private float size = AndroidUtilities.dp(20); + public float size = AndroidUtilities.dp(20); public int cacheType = -1; public String documentAbsolutePath; protected int measuredSize; @@ -358,7 +364,9 @@ public class AnimatedEmojiSpan extends ReplacementSpan { public Layout layout; public AnimatedEmojiSpan span; public Rect drawableBounds; + @Nullable public AnimatedEmojiDrawable drawable; + public Drawable thumbDrawable; public boolean skipDraw; public float drawingYOffset; public float alpha; @@ -411,13 +419,29 @@ public class AnimatedEmojiSpan extends ReplacementSpan { skipDraw = false; } + if (drawable == null) { + if (thumbDrawable != null) { + float scale = span.getExtraScale(); + thumbDrawable.setAlpha((int) (0xFF * alpha * this.alpha)); + thumbDrawable.setBounds(drawableBounds); + if (scale != 1f || span.invert) { + canvas.save(); + canvas.scale(scale * (span.invert ? -1 : 1), scale, drawableBounds.centerX(), drawableBounds.centerY()); + thumbDrawable.draw(canvas); + canvas.restore(); + } else { + thumbDrawable.draw(canvas); + } + } + return; + } if (drawable.getImageReceiver() != null) { drawable.setColorFilter(colorFilter == null ? Theme.chat_animatedEmojiTextColorFilter : colorFilter); drawable.setTime(time); float scale = span.getExtraScale(); - if (scale != 1f) { + if (scale != 1f || span.invert) { canvas.save(); - canvas.scale(scale, scale, drawableBounds.centerX(), drawableBounds.centerY()); + canvas.scale(scale * (span.invert ? -1 : 1), scale, drawableBounds.centerX(), drawableBounds.centerY()); drawable.draw(canvas, drawableBounds, alpha * this.alpha); canvas.restore(); } else { @@ -516,8 +540,15 @@ public class AnimatedEmojiSpan extends ReplacementSpan { holder.drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, localCacheType, span.getDocumentId(), span.documentAbsolutePath); } else if (span.document != null) { holder.drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, localCacheType, span.document); - } else { - holder.drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, localCacheType, span.documentId); + } else if (span.documentId != 0) { + holder.drawable = AnimatedEmojiDrawable.make(UserConfig.selectedAccount, localCacheType, span.documentId, null); + } + if ((span.cacheType == AnimatedEmojiDrawable.CACHE_TYPE_STANDARD_EMOJI || span.cacheType == AnimatedEmojiDrawable.CACHE_TYPE_ALERT_STANDARD_EMOJI) && !TextUtils.isEmpty(span.emoji)) { + if (holder.drawable != null) { + holder.drawable.setupEmojiThumb(span.emoji); + } else { + holder.thumbDrawable = Emoji.getEmojiDrawable(span.emoji); + } } holder.insideSpoiler = isInsideSpoiler(textLayout, spanned.getSpanStart(span), spanned.getSpanEnd(span)); holder.drawableBounds = new Rect(); @@ -720,7 +751,9 @@ public class AnimatedEmojiSpan extends ReplacementSpan { backgroundDrawingArray.add(chunkByLayout); } chunkByLayout.add(holder); - holder.drawable.addView(holder); + if (holder.drawable != null) { + holder.drawable.addView(holder); + } } public boolean hasLayout(Layout layout) { @@ -754,7 +787,9 @@ public class AnimatedEmojiSpan extends ReplacementSpan { } else { throw new RuntimeException("!!!"); } - holder.drawable.removeView(holder); + if (holder.drawable != null) { + holder.drawable.removeView(holder); + } } public void release() { @@ -826,7 +861,7 @@ public class AnimatedEmojiSpan extends ReplacementSpan { public void drawInBackground(Canvas canvas) { for (int i = 0; i < backgroundHolders.size(); i++) { AnimatedEmojiHolder holder = backgroundHolders.get(i); - if (holder != null && holder.backgroundDrawHolder[threadIndex] != null) { + if (holder != null && holder.drawable != null && holder.backgroundDrawHolder[threadIndex] != null) { holder.drawable.draw(canvas, holder.backgroundDrawHolder[threadIndex], true); } } @@ -904,10 +939,9 @@ public class AnimatedEmojiSpan extends ReplacementSpan { continue; } AnimatedEmojiDrawable drawable = holder.drawable; - if (drawable == null) { - continue; + if (drawable != null) { + drawable.setColorFilter(colorFilter); } - drawable.setColorFilter(colorFilter); if (!holder.span.spanDrawn) { continue; } @@ -925,6 +959,7 @@ public class AnimatedEmojiSpan extends ReplacementSpan { holder.drawingYOffset = drawingYOffset; holder.alpha = spoilerAlpha; + if (backgroundThreadDrawable == null) { holder.draw(canvas, time, boundTop, boundBottom, alpha, colorFilter); } @@ -1023,7 +1058,15 @@ public class AnimatedEmojiSpan extends ReplacementSpan { @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); + float offset = (getGravity() & Gravity.CENTER_VERTICAL) != 0 && getLayout() != null ? getPaddingTop() + (getHeight() - getPaddingTop() - getPaddingBottom() - getLayout().getHeight()) / 2f : 0; + if (offset != 0) { + canvas.save(); + canvas.translate(0, offset); + } AnimatedEmojiSpan.drawAnimatedEmojis(canvas, getLayout(), stack, 0, null, 0, 0, 0, 1f); + if (offset != 0) { + canvas.restore(); + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java index 26ce42baf..ffb7c0c60 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AnimatedTextView.java @@ -15,6 +15,7 @@ import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.Shader; @@ -33,8 +34,10 @@ import android.view.accessibility.AccessibilityNodeInfo; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.graphics.ColorUtils; import org.checkerframework.checker.units.qual.A; +import org.checkerframework.checker.units.qual.C; import org.telegram.messenger.AndroidUtilities; import org.telegram.ui.ActionBar.Theme; @@ -65,7 +68,9 @@ public class AnimatedTextView extends View { splitByWords = b; } - private static class Part { + private class Part { + + AnimatedEmojiSpan.EmojiGroupedSpans emoji; StaticLayout layout; float offset; int toOppositeIndex; @@ -75,6 +80,18 @@ public class AnimatedTextView extends View { this.layout = layout; this.toOppositeIndex = toOppositeIndex; layout(offset); + + if (getCallback() instanceof View) { + View view = (View) getCallback(); + emoji = AnimatedEmojiSpan.update(emojiCacheType, view, emoji, layout); + } + } + + public void detach() { + if (getCallback() instanceof View) { + View view = (View) getCallback(); + AnimatedEmojiSpan.release(view, emoji); + } } public void layout(float offset) { @@ -82,6 +99,16 @@ public class AnimatedTextView extends View { this.left = layout == null || layout.getLineCount() <= 0 ? 0 : layout.getLineLeft(0); this.width = layout == null || layout.getLineCount() <= 0 ? 0 : layout.getLineWidth(0); } + + public void draw(Canvas canvas, float alpha) { + layout.draw(canvas); + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, layout, emoji, 0, null, 0, 0, 0, alpha, emojiColorFilter); + } + } + + private int emojiCacheType = AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES; + public void setEmojiCacheType(int cacheType) { + this.emojiCacheType = cacheType; } private float t = 0; @@ -206,7 +233,7 @@ public class AnimatedTextView extends View { final float s = lerp(1f - scaleAmplitude, 1f, t); canvas.scale(s, s, current.width / 2f, current.layout.getHeight() / 2f); } - current.layout.draw(canvas); + current.draw(canvas, j >= 0 ? 1f : t); canvas.restore(); } for (int i = 0; i < oldParts.length; ++i) { @@ -237,7 +264,7 @@ public class AnimatedTextView extends View { final float s = lerp(1f, 1f - scaleAmplitude, t); canvas.scale(s, s, old.width / 2f, old.layout.getHeight() / 2f); } - old.layout.draw(canvas); + old.draw(canvas, 1f - t); canvas.restore(); } } else { @@ -262,7 +289,7 @@ public class AnimatedTextView extends View { } } canvas.translate(x, 0); - current.layout.draw(canvas); + current.draw(canvas, 1f); canvas.restore(); } } @@ -378,10 +405,12 @@ public class AnimatedTextView extends View { diff(from, to, onEqualRegion, onNewPart, onOldPart); // betterDiff(from, to, onEqualRegion, onNewPart, onOldPart); + clearCurrentParts(); if (this.currentParts == null || this.currentParts.length != currentParts.size()) { this.currentParts = new Part[currentParts.size()]; } currentParts.toArray(this.currentParts); + clearOldParts(); if (this.oldParts == null || this.oldParts.length != oldParts.size()) { this.oldParts = new Part[oldParts.size()]; } @@ -392,19 +421,28 @@ public class AnimatedTextView extends View { this.moveDown = moveDown; animator = ValueAnimator.ofFloat(t = 0f, 1f); + if (widthUpdatedListener != null) { + widthUpdatedListener.run(); + } animator.addUpdateListener(anm -> { t = (float) anm.getAnimatedValue(); invalidateSelf(); + if (widthUpdatedListener != null) { + widthUpdatedListener.run(); + } }); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - AnimatedTextDrawable.this.oldParts = null; + clearOldParts(); oldText = null; oldWidth = 0; t = 0; invalidateSelf(); + if (widthUpdatedListener != null) { + widthUpdatedListener.run(); + } animator = null; if (toSetText != null) { @@ -430,6 +468,7 @@ public class AnimatedTextView extends View { t = 0; if (!text.equals(currentText)) { + clearCurrentParts(); currentParts = new Part[1]; currentParts[0] = new Part(makeLayout(currentText = text, width), 0, -1); currentWidth = currentParts[0].width; @@ -437,15 +476,36 @@ public class AnimatedTextView extends View { isRTL = AndroidUtilities.isRTL(currentText); } - oldParts = null; + clearOldParts(); oldText = null; oldWidth = 0; oldHeight = 0; invalidateSelf(); + if (widthUpdatedListener != null) { + widthUpdatedListener.run(); + } } } + private void clearOldParts() { + if (oldParts != null) { + for (int i = 0; i < oldParts.length; ++i) { + oldParts[i].detach(); + } + } + oldParts = null; + } + + private void clearCurrentParts() { + if (oldParts != null) { + for (int i = 0; i < oldParts.length; ++i) { + oldParts[i].detach(); + } + } + oldParts = null; + } + public CharSequence getText() { return currentText; } @@ -861,6 +921,75 @@ public class AnimatedTextView extends View { return textPaint.getColor(); } + private ValueAnimator colorAnimator; + public void setTextColor(int color, boolean animated) { + if (colorAnimator != null) { + colorAnimator.cancel(); + colorAnimator = null; + } + if (!animated) { + setTextColor(color); + } else { + final int from = getTextColor(); + final int to = color; + colorAnimator = ValueAnimator.ofFloat(0, 1); + colorAnimator.addUpdateListener(anm -> { + setTextColor(ColorUtils.blendARGB(from, to, (float) anm.getAnimatedValue())); + invalidateSelf(); + }); + colorAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + setTextColor(to); + } + }); + colorAnimator.setDuration(240); + colorAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + colorAnimator.start(); + } + } + + private int emojiColor; + private ColorFilter emojiColorFilter; + + public void setEmojiColorFilter(ColorFilter colorFilter) { + emojiColorFilter = colorFilter; + } + + public void setEmojiColor(int emojiColor) { + if (this.emojiColor != emojiColor) { + emojiColorFilter = new PorterDuffColorFilter(this.emojiColor = emojiColor, PorterDuff.Mode.MULTIPLY); + } + } + + private ValueAnimator emojiColorAnimator; + public void setEmojiColor(int color, boolean animated) { + if (emojiColorAnimator != null) { + emojiColorAnimator.cancel(); + emojiColorAnimator = null; + } + if (!animated) { + setEmojiColor(color); + } else if (emojiColor != color) { + final int from = getTextColor(); + final int to = color; + emojiColorAnimator = ValueAnimator.ofFloat(0, 1); + emojiColorAnimator.addUpdateListener(anm -> { + setEmojiColor(ColorUtils.blendARGB(from, to, (float) anm.getAnimatedValue())); + invalidateSelf(); + }); + emojiColorAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + setTextColor(to); + } + }); + emojiColorAnimator.setDuration(240); + emojiColorAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + emojiColorAnimator.start(); + } + } + public void setTypeface(Typeface typeface) { textPaint.setTypeface(typeface); } @@ -938,6 +1067,11 @@ public class AnimatedTextView extends View { oldText == null ? 1f : t ); } + + private Runnable widthUpdatedListener; + public void setOnWidthUpdatedListener(Runnable listener) { + widthUpdatedListener = listener; + } } private final AnimatedTextDrawable drawable; @@ -1058,6 +1192,28 @@ public class AnimatedTextView extends View { invalidate(); } + public void setTextColor(int color, boolean animated) { + drawable.setTextColor(color, animated); + invalidate(); + } + + public void setEmojiCacheType(int cacheType) { + drawable.setEmojiCacheType(cacheType); + } + + public void setEmojiColor(int color) { + drawable.setEmojiColor(color); + invalidate(); + } + + public void setEmojiColor(int color, boolean animated) { + drawable.setEmojiColor(color, animated); + invalidate(); + } + public void setEmojiColorFilter(ColorFilter emojiColorFilter) { + drawable.setEmojiColorFilter(emojiColorFilter); + invalidate(); + } public int getTextColor() { return drawable.getTextColor(); } @@ -1106,4 +1262,9 @@ public class AnimatedTextView extends View { public void setRightPadding(float rightPadding) { drawable.setRightPadding(rightPadding); } + + private Runnable widthUpdatedListener; + public void setOnWidthUpdatedListener(Runnable listener) { + drawable.setOnWidthUpdatedListener(listener); + } } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java index ef23bcd3f..2922162d5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java @@ -174,9 +174,6 @@ public class AvatarDrawable extends Drawable { } public static int getColorIndex(long id) { - if (id >= 0 && id < Theme.keys_avatar_background.length) { - return (int) id; - } return (int) Math.abs(id % Theme.keys_avatar_background.length); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsDrawable.java index 378a8d110..05d09a599 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsDrawable.java @@ -56,6 +56,7 @@ public class AvatarsDrawable { public int count; public int height; public int width; + public int strokeWidth = AndroidUtilities.dp(1.67f); View parent; private int overrideSize; @@ -264,12 +265,14 @@ public class AvatarsDrawable { for (int a = 0; a < 3; a++) { currentStates[a] = new DrawingState(); currentStates[a].imageReceiver = new ImageReceiver(parent); + currentStates[a].imageReceiver.setInvalidateAll(true); currentStates[a].imageReceiver.setRoundRadius(AndroidUtilities.dp(12)); currentStates[a].avatarDrawable = new AvatarDrawable(); currentStates[a].avatarDrawable.setTextSize(AndroidUtilities.dp(12)); animatingStates[a] = new DrawingState(); animatingStates[a].imageReceiver = new ImageReceiver(parent); + animatingStates[a].imageReceiver.setInvalidateAll(true); animatingStates[a].imageReceiver.setRoundRadius(AndroidUtilities.dp(12)); animatingStates[a].avatarDrawable = new AvatarDrawable(); animatingStates[a].avatarDrawable.setTextSize(AndroidUtilities.dp(12)); @@ -588,7 +591,7 @@ public class AvatarsDrawable { states[a].wavesDrawable.draw(canvas, imageReceiver.getCenterX(), imageReceiver.getCenterY(), parent); avatarScale = states[a].wavesDrawable.getAvatarScale(); } else { - float rad = getSize() / 2f + AndroidUtilities.dp(2); + float rad = getSize() / 2f + strokeWidth; if (useAlphaLayer) { canvas.drawCircle(imageReceiver.getCenterX(), imageReceiver.getCenterY(), rad, xRefP); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsImageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsImageView.java index 443b276b1..72973d7d8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsImageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsImageView.java @@ -1,12 +1,19 @@ package org.telegram.ui.Components; +import static org.telegram.messenger.AndroidUtilities.dp; + import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; import android.view.View; import androidx.annotation.NonNull; +import org.telegram.messenger.AndroidUtilities; import org.telegram.tgnet.TLObject; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.Premium.PremiumGradient; public class AvatarsImageView extends View { @@ -30,10 +37,28 @@ public class AvatarsImageView extends View { avatarsDrawable.onAttachedToWindow(); } + private PremiumGradient.PremiumGradientTools premiumGradient; + private Text plusText; + private Paint plusBgPaint; + + public void setPlus(int n, int bgColor) { + premiumGradient = new PremiumGradient.PremiumGradientTools(Theme.key_premiumGradient1, Theme.key_premiumGradient2, -1, -1, -1, null); + plusText = new Text("+" + n, 12, AndroidUtilities.getTypeface("fonts/num.otf")); + plusBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + plusBgPaint.setColor(bgColor); + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); avatarsDrawable.onDraw(canvas); + if (plusText != null) { + AndroidUtilities.rectTmp.set(getWidth() - dp(22), getHeight() - dp(22), getWidth() - dp(0), getHeight() - dp(0)); + premiumGradient.gradientMatrix(AndroidUtilities.rectTmp); + canvas.drawCircle(AndroidUtilities.rectTmp.centerX(), AndroidUtilities.rectTmp.centerY(), AndroidUtilities.rectTmp.width() / 2f + dp(1.33f), plusBgPaint); + canvas.drawCircle(AndroidUtilities.rectTmp.centerX(), AndroidUtilities.rectTmp.centerY(), AndroidUtilities.rectTmp.width() / 2f, premiumGradient.paint); + plusText.draw(canvas, AndroidUtilities.rectTmp.centerX() - plusText.getCurrentWidth() / 2f, AndroidUtilities.rectTmp.centerY(), Color.WHITE, 1f); + } } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BlurringShader.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BlurringShader.java index a086e0d95..dc0a6a17b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BlurringShader.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BlurringShader.java @@ -607,7 +607,7 @@ public class BlurringShader { } public Bitmap getBitmap(Bitmap bitmap, String key, int orientation, int invert, boolean recycleAfter) { - if (bitmap == null) { + if (bitmap == null || bitmap.isRecycled()) { return null; } if (TextUtils.equals(thumbKey, key)) { @@ -622,6 +622,9 @@ public class BlurringShader { } thumbKey = key; Utilities.globalQueue.postRunnable(generate = () -> { + if (bitmap == null || bitmap.isRecycled()) { + return; + } final float aspectRatio = bitmap.getWidth() / (float) bitmap.getHeight(); final float scale = 1.5f; final float density = 9 * scale * 16 * scale; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomPagerTabs.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomPagerTabs.java index bc8b718e0..eed4e2af5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomPagerTabs.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomPagerTabs.java @@ -48,9 +48,17 @@ public class BottomPagerTabs extends View { public int customEndFrameEnd; public boolean customFrameInvert; - public Tab(int i, int resId, CharSequence text) { + public Tab customFrameInvert() { + this.customFrameInvert = true; + return this; + } + + public Tab(int i, int resId, int endFrameMid, int endFrameEnd, CharSequence text) { this.i = i; + customEndFrameMid = endFrameMid; + customEndFrameEnd = endFrameEnd; + drawable = new RLottieDrawable(resId, "" + resId, dp(29), dp(29)); drawable.setMasterParent(BottomPagerTabs.this); drawable.setAllowDecodeSingleFrame(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomSheetWithRecyclerListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomSheetWithRecyclerListView.java index 108459710..67efd2813 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomSheetWithRecyclerListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BottomSheetWithRecyclerListView.java @@ -136,7 +136,7 @@ public abstract class BottomSheetWithRecyclerListView extends BottomSheet { if (hasFixedSize) { recyclerListView.setHasFixedSize(true); - recyclerListView.setAdapter(createAdapter()); + recyclerListView.setAdapter(createAdapter(recyclerListView)); setCustomView(containerView); containerView.addView(recyclerListView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); } else { @@ -190,7 +190,7 @@ public abstract class BottomSheetWithRecyclerListView extends BottomSheet { } protected void resetAdapter(Context context) { - RecyclerListView.SelectionAdapter adapter = createAdapter(); + RecyclerListView.SelectionAdapter adapter = createAdapter(recyclerListView); recyclerListView.setAdapter(new RecyclerListView.SelectionAdapter() { @Override @@ -308,7 +308,7 @@ public abstract class BottomSheetWithRecyclerListView extends BottomSheet { protected abstract CharSequence getTitle(); - protected abstract RecyclerListView.SelectionAdapter createAdapter(); + protected abstract RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView); public void notifyDataSetChanged() { recyclerListView.getAdapter().notifyDataSetChanged(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java index 0ea1575b1..a4b6c6b6a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java @@ -105,6 +105,13 @@ public class Bulletin { return new Bulletin(null, containerLayout, contentLayout, duration); } + public Bulletin setOnClickListener(View.OnClickListener onClickListener) { + if (layout != null) { + layout.setOnClickListener(onClickListener); + } + return this; + } + @SuppressLint("RtlHardcoded") public static Bulletin make(@NonNull BaseFragment fragment, @NonNull Layout contentLayout, int duration) { if (fragment instanceof ChatActivity) { @@ -662,7 +669,7 @@ public class Bulletin { protected Bulletin bulletin; Drawable background; - private boolean top; + public boolean top; public boolean isTransitionRunning() { return transitionRunningEnter || transitionRunningExit; @@ -682,6 +689,12 @@ public class Bulletin { updateSize(); setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8)); setWillNotDraw(false); + ScaleStateListAnimator.apply(this, .02f, 1.5f); + } + + @Override + protected boolean verifyDrawable(@NonNull Drawable who) { + return background == who || super.verifyDrawable(who); } protected void setBackground(int color) { @@ -723,7 +736,7 @@ public class Bulletin { updateSize(); } - private void setTop(boolean top) { + public void setTop(boolean top) { this.top = top; updateSize(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java index 12b0d0c76..808d1f9ba 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java @@ -165,10 +165,10 @@ public final class BulletinFactory { private final Theme.ResourcesProvider resourcesProvider; private BulletinFactory(BaseFragment fragment) { - if (fragment != null && fragment.storyViewer != null && fragment.storyViewer.attachedToParent()) { + if (fragment != null && fragment.getLastStoryViewer() != null && fragment.getLastStoryViewer().attachedToParent()) { this.fragment = null; - this.containerLayout = fragment.storyViewer.getContainerForBulletin(); - this.resourcesProvider = fragment.storyViewer.getResourceProvider(); + this.containerLayout = fragment.getLastStoryViewer().getContainerForBulletin(); + this.resourcesProvider = fragment.getLastStoryViewer().getResourceProvider(); } else { this.fragment = fragment; this.containerLayout = null; @@ -204,6 +204,7 @@ public final class BulletinFactory { layout.textView.setLines(2); layout.textView.setMaxLines(4); layout.textView.setMaxWidth(HintView2.cutInFancyHalf(layout.textView.getText(), layout.textView.getPaint())); + layout.textView.setLineSpacing(AndroidUtilities.dp(1.33f), 1f); ((ViewGroup.MarginLayoutParams) layout.textView.getLayoutParams()).rightMargin = AndroidUtilities.dp(12); layout.setWrapWidth(); return create(layout, Bulletin.DURATION_PROLONG); @@ -351,12 +352,16 @@ public final class BulletinFactory { } public Bulletin createUndoBulletin(CharSequence text, Runnable onUndo, Runnable onAction) { + return this.createUndoBulletin(text, false, onUndo, onAction); + } + + public Bulletin createUndoBulletin(CharSequence text, boolean textAndIcon, Runnable onUndo, Runnable onAction) { final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(getContext(), resourcesProvider); layout.textView.setText(text); layout.textView.setSingleLine(false); layout.textView.setMaxLines(2); layout.setTimer(); - layout.setButton(new Bulletin.UndoButton(getContext(), true, resourcesProvider).setText(LocaleController.getString("Undo", R.string.Undo)).setUndoAction(onUndo).setDelayedAction(onAction)); + layout.setButton(new Bulletin.UndoButton(getContext(), true, textAndIcon, resourcesProvider).setText(LocaleController.getString("Undo", R.string.Undo)).setUndoAction(onUndo).setDelayedAction(onAction)); return create(layout, Bulletin.DURATION_PROLONG); } @@ -1036,6 +1041,15 @@ public final class BulletinFactory { return Bulletin.make(containerLayout, layout, Bulletin.DURATION_SHORT); } + public Bulletin createAdReportedBulletin(CharSequence text) { + final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(fragment.getParentActivity(), fragment.getResourceProvider()); + layout.setAnimation(R.raw.ic_admin, "Shield"); + layout.textView.setSingleLine(false); + layout.textView.setMaxLines(3); + layout.textView.setText(text); + return Bulletin.make(fragment, layout, Bulletin.DURATION_LONG); + } + public boolean showForwardedBulletinWithTag(long did, int messagesCount) { if (!UserConfig.getInstance(UserConfig.selectedAccount).isPremium()) { return false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java index 8460200a9..4b8a593e6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -113,6 +113,7 @@ import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.AnimationNotificationsLocker; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.BirthdayController; import org.telegram.messenger.BotWebViewVibrationEffect; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; @@ -152,10 +153,13 @@ import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.BasePermissionsActivity; +import org.telegram.ui.Business.BusinessLinksController; import org.telegram.ui.Business.QuickRepliesController; import org.telegram.ui.ChatActivity; import org.telegram.ui.Components.Premium.GiftPremiumBottomSheet; import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; +import org.telegram.ui.Components.Premium.boosts.BoostRepository; +import org.telegram.ui.Components.Premium.boosts.PremiumPreviewGiftToUsersBottomSheet; import org.telegram.ui.ContentPreviewViewer; import org.telegram.ui.DialogsActivity; import org.telegram.ui.GroupStickersActivity; @@ -167,11 +171,18 @@ import org.telegram.ui.ProfileActivity; import org.telegram.ui.StickersActivity; import org.telegram.ui.Stories.recorder.CaptionContainerView; import org.telegram.ui.Stories.recorder.HintView2; +import org.telegram.ui.bots.BotCommandsMenuContainer; +import org.telegram.ui.bots.BotCommandsMenuView; +import org.telegram.ui.bots.BotKeyboardView; +import org.telegram.ui.bots.BotWebViewMenuContainer; +import org.telegram.ui.bots.BotWebViewSheet; +import org.telegram.ui.bots.ChatActivityBotWebViewButton; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; +import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -199,6 +210,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific private float horizontalPadding = 0; private boolean sendButtonEnabled = true; private TLRPC.UserFull userInfo; + public HintView2 birthdayHint; public boolean voiceOnce; public boolean onceVisible; @@ -650,6 +662,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific private MessageObject editingMessageObject; private boolean editingCaption; + private TLRPC.TL_businessChatLink editingBusinessLink; + + private BusinessLinkPresetMessage lastSavedBusinessLinkMessage; + private TLRPC.ChatFull info; private boolean hasRecordVideo; @@ -1650,6 +1666,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } delegate.toggleVideoRecordingPause(); } else { + if (sendButtonVisible) { + calledRecordRunnable = true; + } MediaController.getInstance().toggleRecordingPause(voiceOnce); delegate.needStartRecordAudio(0); if (slideText != null) { @@ -3347,7 +3366,13 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return; } - giftButton = new ImageView(getContext()); + giftButton = new ImageView(getContext()) { + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + post(ChatActivityEnterView.this::checkBirthdayHint); + } + }; giftButton.setImageResource(R.drawable.msg_input_gift); giftButton.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.MULTIPLY)); giftButton.setVisibility(GONE); @@ -3358,9 +3383,41 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } attachLayout.addView(giftButton, 0, LayoutHelper.createFrame(48, 48, Gravity.CENTER_VERTICAL | Gravity.RIGHT)); giftButton.setOnClickListener(v -> { - MessagesController.getInstance(currentAccount).getMainSettings().edit().putBoolean("show_gift_for_" + parentFragment.getDialogId(), false).apply(); + SharedPreferences.Editor edit = MessagesController.getInstance(currentAccount).getMainSettings().edit(); + if (BirthdayController.isToday(parentFragment.getCurrentUserInfo())) { + edit.putBoolean(Calendar.getInstance().get(Calendar.YEAR) + "show_gift_for_" + parentFragment.getDialogId(), false); + } else { + edit.putBoolean("show_gift_for_" + parentFragment.getDialogId(), false); + } + if (MessagesController.getInstance(currentAccount).giftAttachMenuIcon && + MessagesController.getInstance(currentAccount).giftTextFieldIcon && + !getParentFragment().getCurrentUserInfo().premium_gifts.isEmpty()) { + edit.putBoolean("show_gift_for_" + parentFragment.getDialogId(), false); + } + edit.apply(); + AndroidUtilities.updateViewVisibilityAnimated(giftButton, false); - new GiftPremiumBottomSheet(getParentFragment(), getParentFragment().getCurrentUser()).show(); + + TLRPC.User user = getParentFragment().getCurrentUser(); + if (user == null) return; + ArrayList options = new ArrayList<>(getParentFragment().getCurrentUserInfo().premium_gifts); + if (options.isEmpty()) { + final AlertDialog progressDialog = new AlertDialog(getContext(), AlertDialog.ALERT_TYPE_SPINNER); + final int reqId = BoostRepository.loadGiftOptions(null, loadedOptions -> { + progressDialog.dismiss(); + loadedOptions = BoostRepository.filterGiftOptions(loadedOptions, 1); + loadedOptions = BoostRepository.filterGiftOptionsByBilling(loadedOptions); + ArrayList users = new ArrayList<>(); + users.add(user); + PremiumPreviewGiftToUsersBottomSheet.show(users, loadedOptions); + }); + progressDialog.setOnCancelListener(di -> { + parentFragment.getConnectionsManager().cancelRequest(reqId, true); + }); + progressDialog.showDelayed(200); + } else { + new GiftPremiumBottomSheet(getParentFragment(), getParentFragment().getCurrentUser()).show(); + } }); } @@ -3410,7 +3467,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific }); } - private void createDoneButton() { + private void createDoneButton(boolean bounceable) { if (doneButtonContainer != null) { return; } @@ -3418,7 +3475,6 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific doneButtonContainer = new FrameLayout(getContext()); doneButtonContainer.setVisibility(GONE); textFieldContainer.addView(doneButtonContainer, LayoutHelper.createFrame(48, 48, Gravity.BOTTOM | Gravity.RIGHT)); - doneButtonContainer.setOnClickListener(view -> doneEditingMessage()); Drawable doneCircleDrawable = Theme.createCircleDrawable(dp(16), getThemedColor(Theme.key_chat_messagePanelSend)); doneCheckDrawable = getContext().getResources().getDrawable(R.drawable.input_done).mutate(); @@ -3426,7 +3482,11 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific CombinedDrawable combinedDrawable = new CombinedDrawable(doneCircleDrawable, doneCheckDrawable, 0, dp(1)); combinedDrawable.setCustomSize(dp(32), dp(32)); - doneButtonImage = new ImageView(getContext()); + if (bounceable) { + doneButtonImage = new CaptionContainerView.BounceableImageView(getContext()); + } else { + doneButtonImage = new ImageView(getContext()); + } doneButtonImage.setScaleType(ImageView.ScaleType.CENTER); doneButtonImage.setImageDrawable(combinedDrawable); doneButtonImage.setContentDescription(LocaleController.getString("Done", R.string.Done)); @@ -4542,7 +4602,11 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return null; } try { - EditorInfoCompat.setContentMimeTypes(editorInfo, new String[]{"image/gif", "image/*", "image/jpg", "image/png", "image/webp"}); + if (isEditingBusinessLink()) { + EditorInfoCompat.setContentMimeTypes(editorInfo, null); + } else { + EditorInfoCompat.setContentMimeTypes(editorInfo, new String[]{"image/gif", "image/*", "image/jpg", "image/png", "image/webp"}); + } final InputConnectionCompat.OnCommitContentListener callback = (inputContentInfo, flags, opts) -> { if (BuildCompat.isAtLeastNMR1() && (flags & InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) { try { @@ -4660,7 +4724,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); ClipData clipData = clipboard.getPrimaryClip(); if (clipData != null) { - if (clipData.getItemCount() == 1 && clipData.getDescription().hasMimeType("image/*")) { + if (clipData.getItemCount() == 1 && clipData.getDescription().hasMimeType("image/*") && !isEditingBusinessLink()) { editPhoto(clipData.getItemAt(0).getUri(), clipData.getDescription().getMimeType(0)); } } @@ -5021,7 +5085,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (innerTextChange == 1) { return; } - if (sendByEnter && !isPaste && editingMessageObject == null && count > before && charSequence.length() > 0 && charSequence.length() == start + count && charSequence.charAt(charSequence.length() - 1) == '\n') { + if (sendByEnter && !ignoreTextChange && !isPaste && editingMessageObject == null && count > before && charSequence.length() > 0 && charSequence.length() == start + count && charSequence.charAt(charSequence.length() - 1) == '\n') { nextChangeIsSend = true; } isPaste = false; @@ -5961,6 +6025,8 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } else { messageEditText.setHintText(LocaleController.getString(R.string.BusinessRepliesEnter)); } + } else if (isEditingBusinessLink()) { + messageEditText.setHintText(LocaleController.getString(R.string.BusinessLinksEnter)); } else if (replyingMessageObject != null && replyingMessageObject.messageOwner.reply_markup != null && !TextUtils.isEmpty(replyingMessageObject.messageOwner.reply_markup.placeholder)) { messageEditText.setHintText(replyingMessageObject.messageOwner.reply_markup.placeholder, animated); } else if (editingMessageObject != null) { @@ -6552,6 +6618,67 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific }).show(); } + private static class BusinessLinkPresetMessage { + public String text; + public ArrayList entities; + } + + private BusinessLinkPresetMessage calculateBusinessLinkPresetMessage() { + CharSequence text = messageEditText == null ? "" : messageEditText.getText(); + text = AndroidUtilities.getTrimmedString(text); + + CharSequence[] message = new CharSequence[]{text}; + ArrayList entities = MediaDataController.getInstance(currentAccount).getEntities(message, true); + text = message[0]; + for (int a = 0, N = entities.size(); a < N; a++) { + TLRPC.MessageEntity entity = entities.get(a); + if (entity.offset + entity.length > text.length()) { + entity.length = text.length() - entity.offset; + } + } + + BusinessLinkPresetMessage presetMessage = new BusinessLinkPresetMessage(); + presetMessage.text = text.toString(); + presetMessage.entities = entities; + return presetMessage; + } + + public boolean businessLinkHasChanges() { + BusinessLinkPresetMessage currentMessage = calculateBusinessLinkPresetMessage(); + if (!TextUtils.equals(currentMessage.text, lastSavedBusinessLinkMessage.text)) { + return true; + } + + if (!MediaDataController.entitiesEqual(lastSavedBusinessLinkMessage.entities, currentMessage.entities)) { + return true; + } + + return false; + } + + private void saveBusinessLink() { + if (!isEditingBusinessLink()) { + return; + } + + if (currentLimit - codePointCount < 0) { + if (captionLimitView != null) { + AndroidUtilities.shakeViewSpring(captionLimitView, 3.5f); + try { + captionLimitView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception ignored) { + } + } + return; + } + + BusinessLinkPresetMessage message = calculateBusinessLinkPresetMessage(); + lastSavedBusinessLinkMessage = message; + BusinessLinksController.getInstance(currentAccount).editLinkMessage(editingBusinessLink.link, message.text, message.entities, () -> { + BulletinFactory.of(parentFragment).createSuccessBulletin(LocaleController.getString(R.string.BusinessLinkSaved)).show(); + }); + } + public void doneEditingMessage() { if (editingMessageObject == null) { return; @@ -8434,6 +8561,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (recordingAudioVideo) { getParent().requestDisallowInterceptTouchEvent(true); } + if (ev.getAction() == MotionEvent.ACTION_DOWN && AndroidUtilities.findChildViewUnder(this, ev.getX(), ev.getY()) != birthdayHint) { + hideHints(); + } return super.onInterceptTouchEvent(ev); } @@ -8484,6 +8614,59 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } } + public void setEditingBusinessLink(TLRPC.TL_businessChatLink businessLink) { + editingBusinessLink = businessLink; + updateFieldHint(false); + if (editingBusinessLink != null) { + if (doneButtonAnimation != null) { + doneButtonAnimation.cancel(); + doneButtonAnimation = null; + } + createDoneButton(true); + doneButtonContainer.setOnClickListener(view -> saveBusinessLink()); + + doneButtonContainer.setVisibility(View.VISIBLE); + doneButtonImage.setScaleX(0.1f); + doneButtonImage.setScaleY(0.1f); + doneButtonImage.setAlpha(0.0f); + doneButtonImage.animate().alpha(1f).scaleX(1).scaleY(1).setDuration(150).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); + + currentLimit = accountInstance.getMessagesController().maxMessageLength; + final Paint.FontMetricsInt fontMetricsInt; + Paint paint = null; + if (messageEditText != null) { + paint = messageEditText.getPaint(); + } + if (paint == null) { + paint = new TextPaint(); + paint.setTextSize(dp(18)); + } + fontMetricsInt = paint.getFontMetricsInt(); + + ArrayList entities = editingBusinessLink.entities; + if (entities != null && businessLink.message != null) { + CharSequence spannableText = applyMessageEntities(entities, businessLink.message, fontMetricsInt); + setFieldText(spannableText); + } else if (businessLink.message != null) { + setFieldText(businessLink.message); + } + lastSavedBusinessLinkMessage = calculateBusinessLinkPresetMessage(); + + setAllowStickersAndGifs(true, false, false); + sendButton.setVisibility(GONE); + setSlowModeButtonVisible(false); + cancelBotButton.setVisibility(GONE); + audioVideoButtonContainer.setVisibility(GONE); + if (attachLayout != null) { + attachLayout.setVisibility(GONE); + } + sendButtonContainer.setVisibility(GONE); + if (scheduledButton != null) { + scheduledButton.setVisibility(GONE); + } + } + } + public void setEditingMessageObject(MessageObject messageObject, boolean caption) { if (audioToSend != null || videoToSendMessageObject != null || editingMessageObject == messageObject) { return; @@ -8498,7 +8681,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific doneButtonAnimation.cancel(); doneButtonAnimation = null; } - createDoneButton(); + createDoneButton(false); + doneButtonContainer.setOnClickListener(view -> doneEditingMessage()); + doneButtonContainer.setVisibility(View.VISIBLE); doneButtonImage.setScaleX(0.1f); doneButtonImage.setScaleY(0.1f); @@ -8526,92 +8711,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific fontMetricsInt = paint.getFontMetricsInt(); ArrayList entities = editingMessageObject.messageOwner.entities; - MediaDataController.sortEntities(entities); - SpannableStringBuilder stringBuilder = new SpannableStringBuilder(editingText); - Object[] spansToRemove = stringBuilder.getSpans(0, stringBuilder.length(), Object.class); - if (spansToRemove != null && spansToRemove.length > 0) { - for (int a = 0; a < spansToRemove.length; a++) { - stringBuilder.removeSpan(spansToRemove[a]); - } - } - if (entities != null) { - try { - for (int a = 0; a < entities.size(); a++) { - TLRPC.MessageEntity entity = entities.get(a); - if (entity.offset + entity.length > stringBuilder.length()) { - continue; - } - if (entity instanceof TLRPC.TL_inputMessageEntityMentionName) { - if (entity.offset + entity.length < stringBuilder.length() && stringBuilder.charAt(entity.offset + entity.length) == ' ') { - entity.length++; - } - stringBuilder.setSpan(new URLSpanUserMention("" + ((TLRPC.TL_inputMessageEntityMentionName) entity).user_id.user_id, 3), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } else if (entity instanceof TLRPC.TL_messageEntityMentionName) { - if (entity.offset + entity.length < stringBuilder.length() && stringBuilder.charAt(entity.offset + entity.length) == ' ') { - entity.length++; - } - stringBuilder.setSpan(new URLSpanUserMention("" + ((TLRPC.TL_messageEntityMentionName) entity).user_id, 3), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } else if (entity instanceof TLRPC.TL_messageEntityCode) { - TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); - run.flags |= TextStyleSpan.FLAG_STYLE_MONO; - MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); - } else if (entity instanceof TLRPC.TL_messageEntityPre) { - continue; - } else if (entity instanceof TLRPC.TL_messageEntityBold) { - TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); - run.flags |= TextStyleSpan.FLAG_STYLE_BOLD; - MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); - } else if (entity instanceof TLRPC.TL_messageEntityItalic) { - TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); - run.flags |= TextStyleSpan.FLAG_STYLE_ITALIC; - MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); - } else if (entity instanceof TLRPC.TL_messageEntityStrike) { - TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); - run.flags |= TextStyleSpan.FLAG_STYLE_STRIKE; - MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); - } else if (entity instanceof TLRPC.TL_messageEntityUnderline) { - TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); - run.flags |= TextStyleSpan.FLAG_STYLE_UNDERLINE; - MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); - } else if (entity instanceof TLRPC.TL_messageEntityTextUrl) { - stringBuilder.setSpan(new URLSpanReplacement(entity.url), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } else if (entity instanceof TLRPC.TL_messageEntitySpoiler) { - TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); - run.flags |= TextStyleSpan.FLAG_STYLE_SPOILER; - MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); - } else if (entity instanceof TLRPC.TL_messageEntityCustomEmoji) { - TLRPC.TL_messageEntityCustomEmoji emojiEntity = (TLRPC.TL_messageEntityCustomEmoji) entity; - AnimatedEmojiSpan span; - if (emojiEntity.document != null) { - span = new AnimatedEmojiSpan(emojiEntity.document, fontMetricsInt); - } else { - span = new AnimatedEmojiSpan(emojiEntity.document_id, fontMetricsInt); - } - stringBuilder.setSpan(span, entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - } - } catch (Exception e) { - FileLog.e(e); - } - } - QuoteSpan.mergeQuotes(stringBuilder, entities); - textToSetWithKeyboard = Emoji.replaceEmoji(new SpannableStringBuilder(stringBuilder), fontMetricsInt, false, null); - if (entities != null) { - try { - for (int a = entities.size() - 1; a >= 0; --a) { - TLRPC.MessageEntity entity = entities.get(a); - if (entity instanceof TLRPC.TL_messageEntityPre && entity.offset + entity.length <= textToSetWithKeyboard.length()) { - if (!(textToSetWithKeyboard instanceof Spannable)) { - textToSetWithKeyboard = new SpannableStringBuilder(textToSetWithKeyboard); - } - ((SpannableStringBuilder) textToSetWithKeyboard).insert(entity.offset + entity.length, "```\n"); - ((SpannableStringBuilder) textToSetWithKeyboard).insert(entity.offset, "```"+(entity.language == null ? "" : entity.language)+"\n"); - } - } - } catch (Exception e) { - FileLog.e(e); - } - } + textToSetWithKeyboard = applyMessageEntities(entities, editingText, fontMetricsInt); } else { textToSetWithKeyboard = ""; } @@ -8744,6 +8844,98 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific updateSendAsButton(true); } + @Nullable + public static CharSequence applyMessageEntities(ArrayList entities, CharSequence text, Paint.FontMetricsInt fontMetricsInt) { + CharSequence result; + MediaDataController.sortEntities(entities); + SpannableStringBuilder stringBuilder = new SpannableStringBuilder(text); + Object[] spansToRemove = stringBuilder.getSpans(0, stringBuilder.length(), Object.class); + if (spansToRemove != null && spansToRemove.length > 0) { + for (int a = 0; a < spansToRemove.length; a++) { + stringBuilder.removeSpan(spansToRemove[a]); + } + } + if (entities != null) { + try { + for (int a = 0; a < entities.size(); a++) { + TLRPC.MessageEntity entity = entities.get(a); + if (entity.offset + entity.length > stringBuilder.length()) { + continue; + } + if (entity instanceof TLRPC.TL_inputMessageEntityMentionName) { + if (entity.offset + entity.length < stringBuilder.length() && stringBuilder.charAt(entity.offset + entity.length) == ' ') { + entity.length++; + } + stringBuilder.setSpan(new URLSpanUserMention("" + ((TLRPC.TL_inputMessageEntityMentionName) entity).user_id.user_id, 3), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } else if (entity instanceof TLRPC.TL_messageEntityMentionName) { + if (entity.offset + entity.length < stringBuilder.length() && stringBuilder.charAt(entity.offset + entity.length) == ' ') { + entity.length++; + } + stringBuilder.setSpan(new URLSpanUserMention("" + ((TLRPC.TL_messageEntityMentionName) entity).user_id, 3), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } else if (entity instanceof TLRPC.TL_messageEntityCode) { + TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); + run.flags |= TextStyleSpan.FLAG_STYLE_MONO; + MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); + } else if (entity instanceof TLRPC.TL_messageEntityPre) { + continue; + } else if (entity instanceof TLRPC.TL_messageEntityBold) { + TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); + run.flags |= TextStyleSpan.FLAG_STYLE_BOLD; + MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); + } else if (entity instanceof TLRPC.TL_messageEntityItalic) { + TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); + run.flags |= TextStyleSpan.FLAG_STYLE_ITALIC; + MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); + } else if (entity instanceof TLRPC.TL_messageEntityStrike) { + TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); + run.flags |= TextStyleSpan.FLAG_STYLE_STRIKE; + MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); + } else if (entity instanceof TLRPC.TL_messageEntityUnderline) { + TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); + run.flags |= TextStyleSpan.FLAG_STYLE_UNDERLINE; + MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); + } else if (entity instanceof TLRPC.TL_messageEntityTextUrl) { + stringBuilder.setSpan(new URLSpanReplacement(entity.url), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } else if (entity instanceof TLRPC.TL_messageEntitySpoiler) { + TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); + run.flags |= TextStyleSpan.FLAG_STYLE_SPOILER; + MediaDataController.addStyleToText(new TextStyleSpan(run), entity.offset, entity.offset + entity.length, stringBuilder, true); + } else if (entity instanceof TLRPC.TL_messageEntityCustomEmoji) { + TLRPC.TL_messageEntityCustomEmoji emojiEntity = (TLRPC.TL_messageEntityCustomEmoji) entity; + AnimatedEmojiSpan span; + if (emojiEntity.document != null) { + span = new AnimatedEmojiSpan(emojiEntity.document, fontMetricsInt); + } else { + span = new AnimatedEmojiSpan(emojiEntity.document_id, fontMetricsInt); + } + stringBuilder.setSpan(span, entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + } catch (Exception e) { + FileLog.e(e); + } + } + QuoteSpan.mergeQuotes(stringBuilder, entities); + result = Emoji.replaceEmoji(new SpannableStringBuilder(stringBuilder), fontMetricsInt, false, null); + if (entities != null) { + try { + for (int a = entities.size() - 1; a >= 0; --a) { + TLRPC.MessageEntity entity = entities.get(a); + if (entity instanceof TLRPC.TL_messageEntityPre && entity.offset + entity.length <= result.length()) { + if (!(result instanceof Spannable)) { + result = new SpannableStringBuilder(result); + } + ((SpannableStringBuilder) result).insert(entity.offset + entity.length, "```\n"); + ((SpannableStringBuilder) result).insert(entity.offset, "```" + (entity.language == null ? "" : entity.language) + "\n"); + } + } + } catch (Exception e) { + FileLog.e(e); + } + } + return result; + } + public ImageView getAttachButton() { return attachButton; } @@ -9000,12 +9192,29 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } public void updateGiftButton(boolean animated) { - boolean visible = !MessagesController.getInstance(currentAccount).premiumFeaturesBlocked() && MessagesController.getInstance(currentAccount).giftAttachMenuIcon && - MessagesController.getInstance(currentAccount).giftTextFieldIcon && getParentFragment() != null && getParentFragment().getCurrentUser() != null && - !BuildVars.IS_BILLING_UNAVAILABLE && !getParentFragment().getCurrentUser().self && !getParentFragment().getCurrentUser().premium && - getParentFragment().getCurrentUserInfo() != null && !getParentFragment().getCurrentUserInfo().premium_gifts.isEmpty() && !isInScheduleMode() && - MessagesController.getInstance(currentAccount).getMainSettings().getBoolean("show_gift_for_" + parentFragment.getDialogId(), true); + boolean visible = + !MessagesController.getInstance(currentAccount).premiumPurchaseBlocked() && + getParentFragment() != null && getParentFragment().getCurrentUser() != null && + !BuildVars.IS_BILLING_UNAVAILABLE && !getParentFragment().getCurrentUser().self && + getParentFragment().getCurrentUserInfo() != null && + ( + ( + !getParentFragment().getCurrentUserInfo().premium_gifts.isEmpty() && + !getParentFragment().getCurrentUser().premium && + MessagesController.getInstance(currentAccount).giftAttachMenuIcon && + MessagesController.getInstance(currentAccount).giftTextFieldIcon && + MessagesController.getInstance(currentAccount).getMainSettings().getBoolean("show_gift_for_" + parentFragment.getDialogId(), true) + ) || ( + BirthdayController.isToday(getParentFragment().getCurrentUserInfo().birthday) && + MessagesController.getInstance(currentAccount).getMainSettings().getBoolean(Calendar.getInstance().get(Calendar.YEAR) + "show_gift_for_" + parentFragment.getDialogId(), true) + ) + ) && + parentFragment != null && parentFragment.getChatMode() == 0; + + if (!visible && birthdayHint != null) { + birthdayHint.hide(); + } if (!visible && giftButton == null) { return; } @@ -9020,6 +9229,42 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific scheduledButton.setTranslationX(tX); } } + if (visible) { + checkBirthdayHint(); + } + } + + private void checkBirthdayHint() { + if ( + birthdayHint == null && giftButton != null && giftButton.getRight() != 0 && + parentFragment != null && BirthdayController.isToday(parentFragment.getCurrentUserInfo()) && + MessagesController.getInstance(currentAccount).getMainSettings().getBoolean(Calendar.getInstance().get(Calendar.YEAR) + "bdayhint_" + parentFragment.getDialogId(), true) + ) { + MessagesController.getInstance(currentAccount).getMainSettings().edit().putBoolean(Calendar.getInstance().get(Calendar.YEAR) + "bdayhint_" + parentFragment.getDialogId(), false).apply(); + + birthdayHint = new HintView2(getContext(), HintView2.DIRECTION_BOTTOM); + birthdayHint.setRounding(13); + birthdayHint.setMultilineText(true); + setBirthdayHintText(); + birthdayHint.setPadding(dp(12), 0, dp(12), 0); + birthdayHint.setJointPx(1f, -(getWidth() - dp(12) - (messageEditTextContainer.getX() + attachLayout.getX() + giftButton.getX() + giftButton.getMeasuredWidth() / 2f))); + addView(birthdayHint, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 200, Gravity.TOP, 0, -200 + 8, 0, 0)); + birthdayHint.setOnHiddenListener(() -> removeView(birthdayHint)); + birthdayHint.setDuration(8000); + birthdayHint.show(); + } + } + + private void setBirthdayHintText() { + if (birthdayHint == null) return; + birthdayHint.setText(Emoji.replaceWithRestrictedEmoji(AndroidUtilities.replaceTags(LocaleController.formatString(R.string.UserBirthdayHint, UserObject.getFirstName(parentFragment.getCurrentUser()))), birthdayHint.getTextPaint().getFontMetricsInt(), this::setBirthdayHintText)); + birthdayHint.setMaxWidthPx(HintView2.cutInFancyHalf(birthdayHint.getText(), birthdayHint.getTextPaint())); + } + + public void hideHints() { + if (birthdayHint != null) { + birthdayHint.hide(); + } } public void updateScheduleButton(boolean animated) { @@ -10154,6 +10399,10 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return parentFragment != null && parentFragment.isInScheduleMode(); } + private boolean isEditingBusinessLink() { + return editingBusinessLink != null; + } + public void addStickerToRecent(TLRPC.Document sticker) { createEmojiView(); emojiView.addRecentSticker(sticker); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java index cf77553c9..b197fa08a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlert.java @@ -72,13 +72,14 @@ import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.AnimationNotificationsLocker; -import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; import org.telegram.messenger.DocumentObject; import org.telegram.messenger.Emoji; +import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLoader; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaController; @@ -116,6 +117,9 @@ import org.telegram.ui.PhotoPickerActivity; import org.telegram.ui.PhotoPickerSearchActivity; import org.telegram.ui.PremiumPreviewFragment; import org.telegram.ui.WebAppDisclaimerAlert; +import org.telegram.ui.bots.BotWebViewContainer; +import org.telegram.ui.bots.BotWebViewMenuContainer; +import org.telegram.ui.bots.ChatAttachAlertBotWebViewLayout; import java.io.File; import java.util.ArrayList; @@ -131,6 +135,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N private final NumberTextView captionLimitView; public boolean forUser; public boolean isPhotoPicker; + public boolean isStickerMode; private int currentLimit; private int codepointCount; @@ -304,7 +309,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } else { args1.putLong("chat_id", -did); } - args1.putString("inline_query_input", "@" + UserObject.getPublicUsername(botUser) + " " + query); + args1.putString("start_text", "@" + UserObject.getPublicUsername(botUser) + " " + query); BaseFragment lastFragment = baseFragment; if (MessagesController.getInstance(currentAccount).checkCanOpenChat(args1, lastFragment)) { @@ -811,7 +816,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N protected float cornerRadius = 1.0f; - protected ActionBar actionBar; + public ActionBar actionBar; private View actionBarShadow; private AnimatorSet actionBarAnimation; private AnimatorSet menuAnimator; @@ -3009,6 +3014,7 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } applyCaption(); buttonPressed = true; + delegate.didPressedButton(7, true, notify, scheduleDate, false); } @@ -4364,6 +4370,25 @@ public class ChatAttachAlert extends BottomSheet implements NotificationCenter.N } } + public void enableStickerMode() { + selectedTextView.setText(LocaleController.getString("ChoosePhoto", R.string.ChoosePhoto)); + typeButtonsAvailable = false; + buttonsRecyclerView.setVisibility(View.GONE); + shadow.setVisibility(View.GONE); + avatarPicker = 1; + isPhotoPicker = true; + isStickerMode = true; + } + + public void enableDefaultMode() { + typeButtonsAvailable = true; + buttonsRecyclerView.setVisibility(View.VISIBLE); + shadow.setVisibility(View.VISIBLE); + avatarPicker = 0; + isPhotoPicker = false; + isStickerMode = false; + } + public TextView getSelectedTextView() { return selectedTextView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java index c3117fc84..fe5313eaf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java @@ -67,6 +67,7 @@ import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLoader; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LiteMode; import org.telegram.messenger.LocaleController; @@ -492,7 +493,7 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou if (o instanceof MediaController.PhotoEntry) { MediaController.PhotoEntry photoEntry1 = (MediaController.PhotoEntry) o; if (a == 0) { - CharSequence[] caption = new CharSequence[] { PhotoViewer.getInstance().captionForAllMedia }; + CharSequence[] caption = new CharSequence[]{PhotoViewer.getInstance().captionForAllMedia}; photoEntry1.entities = MediaDataController.getInstance(UserConfig.selectedAccount).getEntities(caption, false); photoEntry1.caption = caption[0]; if (parentAlert.checkCaption(photoEntry1.caption)) { @@ -805,7 +806,10 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou PhotoViewer.getInstance().setMaxSelectedPhotos(parentAlert.maxSelectedPhotos, parentAlert.allowOrder); ChatActivity chatActivity; int type; - if (parentAlert.avatarPicker != 0) { + if (parentAlert.isPhotoPicker && parentAlert.isStickerMode) { + type = PhotoViewer.SELECT_TYPE_STICKER; + chatActivity = (ChatActivity) parentAlert.baseFragment; + } else if (parentAlert.avatarPicker != 0) { chatActivity = null; type = PhotoViewer.SELECT_TYPE_AVATAR; } else if (parentAlert.baseFragment instanceof ChatActivity) { @@ -856,16 +860,19 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou BaseFragment finalFragment = fragment; AndroidUtilities.runOnUIThread(() -> { int avatarType = type; - if (parentAlert.isPhotoPicker) { + if (parentAlert.isPhotoPicker && !parentAlert.isStickerMode) { PhotoViewer.getInstance().setParentActivity(finalFragment); PhotoViewer.getInstance().setMaxSelectedPhotos(0, false); - avatarType = PhotoViewer.SELECT_TYPE_WALLPAPER;; + avatarType = PhotoViewer.SELECT_TYPE_WALLPAPER; } PhotoViewer.getInstance().openPhotoForSelect(arrayList, finalPosition, avatarType, false, photoViewerProvider, chatActivity); PhotoViewer.getInstance().setAvatarFor(parentAlert.getAvatarFor()); - if (parentAlert.isPhotoPicker) { + if (parentAlert.isPhotoPicker && !parentAlert.isStickerMode) { PhotoViewer.getInstance().closePhotoAfterSelect = false; } + if (parentAlert.isStickerMode) { + PhotoViewer.getInstance().enableStickerMode(null); + } if (captionForAllMedia()) { PhotoViewer.getInstance().setCaption(parentAlert.getCommentTextView().getText()); } @@ -1783,7 +1790,10 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou ChatActivity chatActivity; int type; - if (parentAlert.avatarPicker != 0) { + if (parentAlert.isPhotoPicker && parentAlert.isStickerMode) { + type = PhotoViewer.SELECT_TYPE_STICKER; + chatActivity = (ChatActivity) parentAlert.baseFragment; + } else if (parentAlert.avatarPicker != 0) { type = PhotoViewer.SELECT_TYPE_AVATAR; chatActivity = null; } else if (parentAlert.baseFragment instanceof ChatActivity) { @@ -1946,6 +1956,10 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou } }, chatActivity); PhotoViewer.getInstance().setAvatarFor(parentAlert.getAvatarFor()); + if (parentAlert.isStickerMode) { + PhotoViewer.getInstance().enableStickerMode(null); + PhotoViewer.getInstance().prepareSegmentImage(); + } } private void showZoomControls(boolean show, boolean animated) { @@ -4029,6 +4043,8 @@ public class ChatAttachAlertPhotoLayout extends ChatAttachAlert.AttachAlertLayou } if (parentAlert.avatarPicker != 0) { cell.getCheckBox().setVisibility(GONE); + } else { + cell.getCheckBox().setVisibility(VISIBLE); } MediaController.PhotoEntry photoEntry = getPhotoEntryAtPosition(position); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java index 8b4f30c96..8882ab823 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java @@ -41,7 +41,6 @@ import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLoader; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; -import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; @@ -54,6 +53,7 @@ import org.telegram.ui.ActionBar.ActionBarPopupWindow; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Business.BusinessLinksController; import org.telegram.ui.ChatActivity; import org.telegram.ui.ProfileActivity; import org.telegram.ui.Stories.StoriesUtilities; @@ -230,10 +230,10 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent } }; if (baseFragment instanceof ChatActivity || baseFragment instanceof TopicsFragment) { - if (parentFragment == null || parentFragment.getChatMode() != ChatActivity.MODE_QUICK_REPLIES) { + if (parentFragment == null || (parentFragment.getChatMode() != ChatActivity.MODE_QUICK_REPLIES && parentFragment.getChatMode() != ChatActivity.MODE_EDIT_BUSINESS_LINK)) { sharedMediaPreloader = new SharedMediaLayout.SharedMediaPreloader(baseFragment); } - if (parentFragment != null && (parentFragment.isThreadChat() || parentFragment.getChatMode() == ChatActivity.MODE_PINNED || parentFragment.getChatMode() == ChatActivity.MODE_QUICK_REPLIES)) { + if (parentFragment != null && (parentFragment.isThreadChat() || parentFragment.getChatMode() == ChatActivity.MODE_PINNED || parentFragment.getChatMode() == ChatActivity.MODE_QUICK_REPLIES || parentFragment.getChatMode() == ChatActivity.MODE_EDIT_BUSINESS_LINK)) { avatarImageView.setVisibility(GONE); } } @@ -515,7 +515,7 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent args.putBoolean("reportSpam", parentFragment.hasReportSpam()); args.putInt("actionBarColor", getThemedColor(Theme.key_actionBarDefault)); ProfileActivity fragment = new ProfileActivity(args, sharedMediaPreloader); - fragment.setUserInfo(parentFragment.getCurrentUserInfo()); + fragment.setUserInfo(parentFragment.getCurrentUserInfo(), parentFragment.profileChannelMessageFetcher, parentFragment.birthdayAssetsFetcher); if (fromChatAnimation) { fragment.setPlayProfileAnimation(byAvatar ? 2 : 1); } @@ -881,6 +881,10 @@ public class ChatAvatarContainer extends FrameLayout implements NotificationCent if (parentFragment == null) { return; } + if (parentFragment.getChatMode() == ChatActivity.MODE_EDIT_BUSINESS_LINK) { + setSubtitle(BusinessLinksController.stripHttps(parentFragment.businessLink.link)); + return; + } TLRPC.User user = parentFragment.getCurrentUser(); if ((UserObject.isUserSelf(user) || UserObject.isReplyUser(user) || parentFragment.getChatMode() != 0) && parentFragment.getChatMode() != ChatActivity.MODE_SAVED) { if (getSubtitleTextView().getVisibility() != GONE) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatGreetingsView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatGreetingsView.java index 72bf507e2..9e133f223 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatGreetingsView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatGreetingsView.java @@ -1,7 +1,13 @@ package org.telegram.ui.Components; import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.formatString; +import static org.telegram.messenger.LocaleController.getString; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -9,11 +15,18 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; +import android.os.Build; import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.TextUtils; +import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -23,6 +36,7 @@ import org.telegram.messenger.ContactsController; import org.telegram.messenger.DocumentObject; import org.telegram.messenger.FileLoader; import org.telegram.messenger.ImageLocation; +import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessageObject; @@ -54,7 +68,9 @@ public class ChatGreetingsView extends LinearLayout { private final int currentAccount; + public FrameLayout stickerContainer; public BackupImageView stickerToSendView; + public BackupImageView nextStickerToSendView; private final Theme.ResourcesProvider resourcesProvider; boolean wasDraw; @@ -64,9 +80,11 @@ public class ChatGreetingsView extends LinearLayout { this.currentAccount = currentAccount; this.resourcesProvider = resourcesProvider; + setPadding(0, dp(8), 0, 0); + titleView = new TextView(context); titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - titleView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + titleView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); titleView.setTextAlignment(TEXT_ALIGNMENT_CENTER); titleView.setGravity(Gravity.CENTER); @@ -75,18 +93,29 @@ public class ChatGreetingsView extends LinearLayout { descriptionView.setGravity(Gravity.CENTER); descriptionView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); descriptionView.setGravity(Gravity.CENTER_HORIZONTAL); + + stickerContainer = new FrameLayout(context); stickerToSendView = new BackupImageView(context); + stickerToSendView.getImageReceiver().setAspectFit(true); + stickerContainer.addView(stickerToSendView, LayoutHelper.createFrame(112, 112)); ScaleStateListAnimator.apply(stickerToSendView); + + nextStickerToSendView = new BackupImageView(context); + nextStickerToSendView.getImageReceiver().setAspectFit(true); + stickerContainer.addView(nextStickerToSendView, LayoutHelper.createFrame(112, 112)); + nextStickerToSendView.setVisibility(View.GONE); + nextStickerToSendView.setAlpha(0f); + ScaleStateListAnimator.apply(nextStickerToSendView); updateLayout(); updateColors(); if (distance <= 0) { - titleView.setText(LocaleController.getString("NoMessages", R.string.NoMessages)); - descriptionView.setText(LocaleController.getString("NoMessagesGreetingsDescription", R.string.NoMessagesGreetingsDescription)); + titleView.setText(getString(R.string.NoMessages)); + descriptionView.setText(getString(R.string.NoMessagesGreetingsDescription)); } else { - titleView.setText(LocaleController.formatString("NearbyPeopleGreetingsMessage", R.string.NearbyPeopleGreetingsMessage, user.first_name, LocaleController.formatDistance(distance, 1))); - descriptionView.setText(LocaleController.getString("NearbyPeopleGreetingsDescription", R.string.NearbyPeopleGreetingsDescription)); + titleView.setText(formatString("NearbyPeopleGreetingsMessage", R.string.NearbyPeopleGreetingsMessage, user.first_name, LocaleController.formatDistance(distance, 1))); + descriptionView.setText(getString(R.string.NearbyPeopleGreetingsDescription)); } descriptionView.setMaxWidth(HintView2.cutInFancyHalf(descriptionView.getText(), descriptionView.getPaint())); stickerToSendView.setContentDescription(descriptionView.getText()); @@ -133,9 +162,9 @@ public class ChatGreetingsView extends LinearLayout { } String text; if (MessagesController.getInstance(currentAccount).premiumFeaturesBlocked()) { - text = LocaleController.formatString(R.string.MessageLockedPremiumLocked, username); + text = formatString(R.string.MessageLockedPremiumLocked, username); } else { - text = LocaleController.formatString(R.string.MessageLockedPremium, username); + text = formatString(R.string.MessageLockedPremium, username); } premiumTextView.setText(AndroidUtilities.replaceTags(text)); premiumTextView.setMaxWidth(HintView2.cutInFancyHalf(premiumTextView.getText(), premiumTextView.getPaint())); @@ -209,23 +238,25 @@ public class ChatGreetingsView extends LinearLayout { private void updateLayout() { removeAllViews(); if (premiumLock) { - addView(premiumIconView, LayoutHelper.createLinear(78, 78, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 20, 17, 20, 9)); + addView(premiumIconView, LayoutHelper.createLinear(78, 78, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 20, 9, 20, 9)); final boolean premiumLocked = MessagesController.getInstance(currentAccount).premiumFeaturesBlocked(); addView(premiumTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 20, 0, 20, premiumLocked ? 13 : 9)); if (!premiumLocked) { addView(premiumButtonView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 30, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 20, 2, 20, 13)); } } else { - addView(titleView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 20, 14, 20, 6)); - addView(descriptionView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 20, 6, 20, 0)); - addView(stickerToSendView, LayoutHelper.createLinear(112, 112, Gravity.CENTER_HORIZONTAL, 0, 16, 0, 16)); + addView(titleView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 20, 6, 20, 6)); + addView(descriptionView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 20, 6, 20, 6)); + addView(stickerContainer, LayoutHelper.createLinear(112, 112, Gravity.CENTER_HORIZONTAL, 16, 10, 16, 16)); } } - private void setSticker(TLRPC.Document sticker) { + public void setSticker(TLRPC.Document sticker) { if (sticker == null) { return; } + wasDraw = true; + nextStickerToSendView.clearImage(); SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(sticker, Theme.key_chat_serviceBackground, 1.0f); if (svgThumb != null) { stickerToSendView.setImage(ImageLocation.getForDocument(sticker), createFilter(sticker), svgThumb, 0, sticker); @@ -240,6 +271,102 @@ public class ChatGreetingsView extends LinearLayout { }); } + public void setNextSticker(TLRPC.Document sticker, Runnable whenDone) { + if (sticker == null) { + return; + } + if (togglingStickersAnimator != null) { + togglingStickersAnimator.cancel(); + } + nextStickerToSendView.getImageReceiver().setDelegate(new ImageReceiver.ImageReceiverDelegate() { + private boolean waited; + @Override + public void didSetImageBitmap(int type, String key, Drawable drawable) { + if (waited) { + return; + } + if ((type == ImageReceiver.TYPE_IMAGE || type == ImageReceiver.TYPE_MEDIA) && drawable != null) { + waited = true; + if (drawable instanceof RLottieDrawable && ((RLottieDrawable) drawable).bitmapsCache != null && ((RLottieDrawable) drawable).bitmapsCache.needGenCache()) { + ((RLottieDrawable) drawable).whenCacheDone = () -> { + toggleToNextSticker(); + if (whenDone != null) { + whenDone.run(); + } + }; + } else { + toggleToNextSticker(); + if (whenDone != null) { + whenDone.run(); + } + } + } + } + + @Override + public void didSetImage(ImageReceiver imageReceiver, boolean set, boolean thumb, boolean memCache) {} + }); + SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(sticker, Theme.key_chat_serviceBackground, 1.0f); + if (svgThumb != null) { + nextStickerToSendView.setImage(ImageLocation.getForDocument(sticker), createFilter(sticker), svgThumb, 0, sticker); + } else { + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(sticker.thumbs, 90); + nextStickerToSendView.setImage(ImageLocation.getForDocument(sticker), createFilter(sticker), ImageLocation.getForDocument(thumb, sticker), null, 0, sticker); + } + nextStickerToSendView.setOnClickListener(v -> { + if (listener != null) { + listener.onGreetings(sticker); + } + }); + } + + private AnimatorSet togglingStickersAnimator; + private void toggleToNextSticker() { + if (togglingStickersAnimator != null) { + togglingStickersAnimator.cancel(); + } + + nextStickerToSendView.setVisibility(View.VISIBLE); + stickerToSendView.setVisibility(View.VISIBLE); + + togglingStickersAnimator = new AnimatorSet(); + togglingStickersAnimator.setDuration(420); + togglingStickersAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + togglingStickersAnimator.addListener(new AnimatorListenerAdapter() { + private boolean cancelled; + @Override + public void onAnimationEnd(Animator animation) { + if (cancelled) return; + + BackupImageView temp = stickerToSendView; + stickerToSendView = nextStickerToSendView; + nextStickerToSendView = temp; + + nextStickerToSendView.setVisibility(View.GONE); + nextStickerToSendView.setAlpha(0f); + stickerToSendView.setVisibility(View.VISIBLE); + stickerToSendView.setAlpha(1f); + } + + @Override + public void onAnimationCancel(Animator animation) { + cancelled = true; + } + }); + togglingStickersAnimator.playTogether( + ObjectAnimator.ofFloat(nextStickerToSendView, View.ALPHA, 0f, 1f), + ObjectAnimator.ofFloat(nextStickerToSendView, View.SCALE_X, .7f, 1f), + ObjectAnimator.ofFloat(nextStickerToSendView, View.SCALE_Y, .7f, 1f), + ObjectAnimator.ofFloat(nextStickerToSendView, View.TRANSLATION_Y, -dp(24), 0), + + ObjectAnimator.ofFloat(stickerToSendView, View.ALPHA, 1f, 0f), + ObjectAnimator.ofFloat(stickerToSendView, View.SCALE_X, 1f, .7f), + ObjectAnimator.ofFloat(stickerToSendView, View.SCALE_Y, 1f, .7f), + ObjectAnimator.ofFloat(stickerToSendView, View.TRANSLATION_Y, 0, dp(24)) + ); + togglingStickersAnimator.start(); + } + public static String createFilter(TLRPC.Document document) { float maxHeight; float maxWidth; @@ -296,22 +423,62 @@ public class ChatGreetingsView extends LinearLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ignoreLayot = true; - descriptionView.setVisibility(View.VISIBLE); + if (!preview) { + descriptionView.setVisibility(View.VISIBLE); + } stickerToSendView.setVisibility(View.VISIBLE); super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (getMeasuredHeight() > MeasureSpec.getSize(heightMeasureSpec)) { + if (getMeasuredHeight() > MeasureSpec.getSize(heightMeasureSpec) && !preview) { descriptionView.setVisibility(View.GONE); stickerToSendView.setVisibility(View.GONE); } else { - descriptionView.setVisibility(View.VISIBLE); + if (!preview) { + descriptionView.setVisibility(View.VISIBLE); + } stickerToSendView.setVisibility(View.VISIBLE); } ignoreLayot = false; super.onMeasure(widthMeasureSpec, heightMeasureSpec); } + public boolean preview; + public void setPreview(CharSequence title, CharSequence message) { + preview = true; + titleView.setText(TextUtils.isEmpty(title == null ? null : title.toString().trim()) ? getString(R.string.NoMessages) : title); + descriptionView.setText(TextUtils.isEmpty(message == null ? null : message.toString().trim()) ? getString(R.string.NoMessagesGreetingsDescription) : message); + descriptionView.setMaxWidth( + descriptionView.getText().length() > 60 ? + Math.min((int) (AndroidUtilities.displaySize.x * .5f), HintView2.cutInFancyHalf(descriptionView.getText(), descriptionView.getPaint())) : + (int) (AndroidUtilities.displaySize.x * .5f) + ); + } + + private float viewTop; + private float viewTranslationX; + private int backgroundHeight; + private boolean visiblePartSet; + + public void setVisiblePart(float visibleTop, int parentH) { + visiblePartSet = true; + backgroundHeight = parentH; + viewTop = visibleTop; + viewTranslationX = 0; + } + + private boolean disableBackground; + @Override protected void dispatchDraw(Canvas canvas) { + if (!disableBackground) { + if (resourcesProvider != null) { + resourcesProvider.applyServiceShaderMatrix(getMeasuredWidth(), backgroundHeight, viewTranslationX, viewTop + dp(4)); + } else { + Theme.applyServiceShaderMatrix(getMeasuredWidth(), backgroundHeight, viewTranslationX, viewTop + dp(4)); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + canvas.drawRoundRect(0, 0, getWidth(), getHeight(), dp(16), dp(16), Theme.getThemePaint(Theme.key_paint_chatActionBackground, resourcesProvider)); + } + } if (!wasDraw) { wasDraw = true; setSticker(preloadedGreetingsSticker); @@ -347,6 +514,12 @@ public class ChatGreetingsView extends LinearLayout { } } + @Override + public void setBackground(Drawable background) { + super.setBackground(background); + disableBackground = true; + } + private int getThemedColor(int key) { return Theme.getColor(key, resourcesProvider); } @@ -386,7 +559,7 @@ public class ChatGreetingsView extends LinearLayout { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(dialogId); username = UserObject.getFirstName(user); } - descriptionView.setText(AndroidUtilities.replaceTags(LocaleController.formatString(premiumLocked ? R.string.PremiumMessageTextLocked : R.string.PremiumMessageText, username, username))); + descriptionView.setText(AndroidUtilities.replaceTags(formatString(premiumLocked ? R.string.PremiumMessageTextLocked : R.string.PremiumMessageText, username, username))); layout.addView(descriptionView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 12, 9, 12, 19)); if (!premiumLocked) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatThemeBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatThemeBottomSheet.java index f1b1ddbaa..86ca5d72e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatThemeBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatThemeBottomSheet.java @@ -1330,45 +1330,6 @@ public class ChatThemeBottomSheet extends BottomSheet implements NotificationCen 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)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ClickableAnimatedTextView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ClickableAnimatedTextView.java index b8b99270d..faa6bbc9f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ClickableAnimatedTextView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ClickableAnimatedTextView.java @@ -21,23 +21,25 @@ public class ClickableAnimatedTextView extends AnimatedTextView { @Override protected void onDraw(Canvas canvas) { - bounds.set(getDrawable().getBounds()); - int w = (int) Math.ceil(getDrawable().getCurrentWidth()); - if (getDrawable().getGravity() == Gravity.LEFT) { - bounds.right = bounds.left + w; - } else if (getDrawable().getGravity() == Gravity.RIGHT) { - bounds.left = bounds.right - w; - } else if (getDrawable().getGravity() == Gravity.CENTER) { - int cx = (bounds.left + bounds.right) / 2; - bounds.left = cx - w / 2; - bounds.right = cx + w / 2; + if (backgroundDrawable != null) { + bounds.set(getDrawable().getBounds()); + int w = (int) Math.ceil(getDrawable().getCurrentWidth()); + if (getDrawable().getGravity() == Gravity.LEFT) { + bounds.right = bounds.left + w; + } else if (getDrawable().getGravity() == Gravity.RIGHT) { + bounds.left = bounds.right - w; + } else if (getDrawable().getGravity() == Gravity.CENTER) { + int cx = (bounds.left + bounds.right) / 2; + bounds.left = cx - w / 2; + bounds.right = cx + w / 2; + } + bounds.left -= getPaddingLeft(); + bounds.top -= getPaddingTop(); + bounds.right += getPaddingRight(); + bounds.bottom += getPaddingBottom(); + backgroundDrawable.setBounds(bounds); + backgroundDrawable.draw(canvas); } - bounds.left -= getPaddingLeft(); - bounds.top -= getPaddingTop(); - bounds.right += getPaddingRight(); - bounds.bottom += getPaddingBottom(); - backgroundDrawable.setBounds(bounds); - backgroundDrawable.draw(canvas); super.onDraw(canvas); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ColoredImageSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ColoredImageSpan.java index e8fd46939..76de2543f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ColoredImageSpan.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ColoredImageSpan.java @@ -5,6 +5,7 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; +import android.text.TextPaint; import android.text.style.ReplacementSpan; import androidx.annotation.NonNull; @@ -21,6 +22,7 @@ public class ColoredImageSpan extends ReplacementSpan { Drawable drawable; boolean usePaintColor = true; + public boolean useLinkPaintColor = false; int colorKey; private int topOffset = 0; private float translateX, translateY; @@ -95,6 +97,8 @@ public class ColoredImageSpan extends ReplacementSpan { } else { if (overrideColor != 0) { color = overrideColor; + } else if (useLinkPaintColor && paint instanceof TextPaint) { + color = ((TextPaint) paint).linkColor; } else if (usePaintColor) { color = paint.getColor(); } else { @@ -123,8 +127,8 @@ public class ColoredImageSpan extends ReplacementSpan { if (scaleX != 1f || scaleY != 1f) { canvas.scale(scaleX, scaleY, 0, drawable.getBounds().centerY()); } - if (alpha != 1f) { - drawable.setAlpha((int) (alpha * 255)); + if (alpha != 1f || paint.getAlpha() != 0xFF) { + drawable.setAlpha((int) (alpha * paint.getAlpha())); } drawable.draw(canvas); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/CreateGroupCallBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/CreateGroupCallBottomSheet.java index b1b4f6167..f429ee315 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/CreateGroupCallBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/CreateGroupCallBottomSheet.java @@ -166,7 +166,7 @@ public class CreateGroupCallBottomSheet extends BottomSheetWithRecyclerListView } @Override - public RecyclerListView.SelectionAdapter createAdapter() { + public RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return new RecyclerListView.SelectionAdapter() { @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Crop/CropRotationWheel.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Crop/CropRotationWheel.java index 972a51b30..04543a02e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Crop/CropRotationWheel.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Crop/CropRotationWheel.java @@ -194,7 +194,7 @@ public class CropRotationWheel extends FrameLayout { Math.abs(newAngle - -MAX_ANGLE) < 0.001f && Math.abs(this.rotation - -MAX_ANGLE) >= 0.001f) { performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); } else if (Math.floor(this.rotation / 2.5f) != Math.floor(newAngle / 2.5f)) { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + AndroidUtilities.vibrateCursor(this); } } catch (Exception ignore) {} } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Crop/CropView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Crop/CropView.java index 355e547b7..55e57800e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Crop/CropView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Crop/CropView.java @@ -714,6 +714,7 @@ public class CropView extends FrameLayout implements CropAreaView.AreaViewListen if (videoEditTextureView != null) { return videoEditTextureView.getVideoWidth(); } + if (bitmap == null) return 1; return bitmapRotation == 90 || bitmapRotation == 270 ? bitmap.getHeight() : bitmap.getWidth(); } @@ -721,6 +722,7 @@ public class CropView extends FrameLayout implements CropAreaView.AreaViewListen if (videoEditTextureView != null) { return videoEditTextureView.getVideoHeight(); } + if (bitmap == null) return 1; return bitmapRotation == 90 || bitmapRotation == 270 ? bitmap.getWidth() : bitmap.getHeight(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiColorPickerWindow.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiColorPickerWindow.java index 2a66609fe..c6fa44ebd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiColorPickerWindow.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiColorPickerWindow.java @@ -97,9 +97,7 @@ public class EmojiColorPickerWindow extends PopupWindow { } int newSelection = Math.max(0, Math.min(5, x / (emojiSize + dp(4)))); if (getSelection() != newSelection) { - try { - pickerView.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(pickerView); setSelection(newSelection); } } @@ -286,11 +284,7 @@ public class EmojiColorPickerWindow extends PopupWindow { } } if (lastSelection[0] != selection[0] || lastSelection[1] != selection[1]) { - try { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(this); if (onSelectionUpdate != null) { onSelectionUpdate.run(selection[0], selection[1]); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java index 396605f12..d6859ac47 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java @@ -98,6 +98,7 @@ import org.telegram.messenger.ImageLocation; import org.telegram.messenger.ImageReceiver; import org.telegram.messenger.LiteMode; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaController; import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; @@ -129,9 +130,11 @@ import org.telegram.ui.ChatActivity; import org.telegram.ui.Components.ListView.RecyclerListViewWithOverlayDraw; import org.telegram.ui.Components.Premium.PremiumButtonView; import org.telegram.ui.ContentPreviewViewer; +import org.telegram.ui.PhotoViewer; import org.telegram.ui.SelectAnimatedEmojiDialog; import org.telegram.ui.StickersActivity; +import java.io.File; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -1575,8 +1578,8 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific color = Emoji.emojiColor.get(code); } String toCheck = code; - boolean isCompound = false; - if (CompoundEmoji.isCompound(toCheck) && (isCompound = true) || EmojiData.emojiColoredMap.contains(code)) { + final boolean isCompound = CompoundEmoji.isCompound(toCheck); + if (isCompound || EmojiData.emojiColoredMap.contains(code)) { emojiTouchedView = viewEmoji; emojiTouchedX = emojiLastX; emojiTouchedY = emojiLastY; @@ -4049,6 +4052,11 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific return CompoundEmoji.applyColor(code, color); } else { String end = null; + boolean invert = false; + if (Emoji.endsWithRightArrow(code)) { + code = code.substring(0, code.length() - 2); + invert = true; + } int length = code.length(); if (length > 2 && code.charAt(code.length() - 2) == '\u200D') { end = code.substring(code.length() - 2); @@ -4061,6 +4069,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if (end != null) { code += end; } + if (invert) { + code += "\u200Dโžก"; + } return code; } } @@ -5396,7 +5407,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } MediaDataController.getInstance(currentAccount).addRecentSticker(MediaDataController.TYPE_IMAGE, null, document, (int) (System.currentTimeMillis() / 1000), false); boolean wasEmpty = recentStickers.isEmpty(); - recentStickers = MediaDataController.getInstance(currentAccount).getRecentStickers(MediaDataController.TYPE_IMAGE); + recentStickers = MediaDataController.getInstance(currentAccount).getRecentStickers(MediaDataController.TYPE_IMAGE, true); if (stickersGridAdapter != null) { stickersGridAdapter.notifyDataSetChanged(); } @@ -5785,7 +5796,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific } else { int previousCount = recentStickers.size(); int previousCount2 = favouriteStickers.size(); - recentStickers = MediaDataController.getInstance(currentAccount).getRecentStickers(MediaDataController.TYPE_IMAGE); + recentStickers = MediaDataController.getInstance(currentAccount).getRecentStickers(MediaDataController.TYPE_IMAGE, true); favouriteStickers = MediaDataController.getInstance(currentAccount).getRecentStickers(MediaDataController.TYPE_FAVE); if (UserConfig.getInstance(currentAccount).isPremium()) { premiumStickers = MediaDataController.getInstance(currentAccount).getRecentStickers(MediaDataController.TYPE_PREMIUM_STICKERS); @@ -6304,6 +6315,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific Object object = cache.get(position); if (object != null) { if (object instanceof TLRPC.Document) { + if (object instanceof TLRPC.TL_documentEmpty) { + return 7; + } return 0; } else if (object instanceof String) { if ("trend1".equals(object)) { @@ -6458,8 +6472,26 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific view = listView; view.setLayoutParams(new RecyclerView.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.dp(52))); break; + case 7: + FrameLayout containerLayout = new FrameLayout(context); + View btnView = new View(context); + Drawable circle = Theme.createRoundRectDrawable(dp(28), Theme.multAlpha(getThemedColor(Theme.key_chat_emojiPanelIcon), .12f)); + Drawable drawable = getResources().getDrawable(R.drawable.filled_add_sticker).mutate(); + drawable.setColorFilter(new PorterDuffColorFilter(getThemedColor(Theme.key_chat_emojiPanelIcon), PorterDuff.Mode.MULTIPLY)); + CombinedDrawable combinedDrawable = new CombinedDrawable(circle, drawable); + combinedDrawable.setCustomSize(dp(56), dp(56)); + combinedDrawable.setIconSize(dp(24), dp(24)); + btnView.setBackground(combinedDrawable); + btnView.setOnClickListener(v -> { + if (fragment instanceof ChatActivity) { + ((ChatActivity) fragment).openAttachMenuForCreatingSticker(); + } + }); + ScaleStateListAnimator.apply(btnView); + containerLayout.addView(btnView, LayoutHelper.createFrame(56, 56, Gravity.CENTER)); + view = containerLayout; + break; } - return new RecyclerListView.Holder(view); } @@ -6526,6 +6558,11 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific TLRPC.TL_messages_stickerSet set = (TLRPC.TL_messages_stickerSet) object; if (set.set != null) { cell.setText(set.set.title, 0); + if (set.set.creator && !StickersAlert.DISABLE_STICKER_EDITOR) { + cell.setEdit(v -> { + delegate.onShowStickerSet(set.set, null); + }); + } } } else if (object == recentStickers) { cell.setText(LocaleController.getString("RecentStickers", R.string.RecentStickers), R.drawable.msg_close, LocaleController.getString(R.string.ClearRecentStickersAlertTitle)); @@ -6569,6 +6606,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific totalItems = 0; ArrayList packs = stickerSets; int startRow = 0; + boolean isAddedStickerBtnSet = false; for (int a = -5; a < packs.size(); a++) { ArrayList documents; TLRPC.TL_messages_stickerSet pack = null; @@ -6592,6 +6630,9 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific packStartPosition.put(key = "fav", totalItems); } else if (a == -2) { documents = recentStickers; + if (!documents.isEmpty() && !StickersAlert.DISABLE_STICKER_EDITOR) { + isAddedStickerBtnSet = true; + } packStartPosition.put(key = "recent", totalItems); } else if (a == -1) { continue; @@ -6601,6 +6642,11 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific key = null; pack = packs.get(a); documents = pack.documents; + if (!isAddedStickerBtnSet && !StickersAlert.DISABLE_STICKER_EDITOR) { + isAddedStickerBtnSet = true; + documents = new ArrayList<>(documents); + documents.add(0, new TLRPC.TL_documentEmpty()); + } packStartPosition.put(pack, totalItems); } if (a == groupStickerPackNum) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterGLThread.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterGLThread.java index f6350368a..36eed4561 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterGLThread.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterGLThread.java @@ -13,12 +13,14 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.BuildVars; import org.telegram.messenger.DispatchQueue; import org.telegram.messenger.FileLog; +import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.ui.Stories.recorder.StoryEntry; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; +import java.util.Locale; import java.util.concurrent.CountDownLatch; import javax.microedition.khronos.egl.EGL10; @@ -148,6 +150,7 @@ public class FilterGLThread extends DispatchQueue { public void updateHDRInfo(StoryEntry.HDRInfo hdrInfo) { postRunnable(() -> { makeCurrentContext(); + setupVideoShader(hdrInfo); filterShaders.updateHDRInfo(hdrInfo); }); } @@ -156,6 +159,54 @@ public class FilterGLThread extends DispatchQueue { postRunnable(() -> filterShaders.setDelegate(filterShadersDelegate)); } + private boolean setupVideoShader(StoryEntry.HDRInfo hdrInfo) { + String hdrProcessor = ""; + int hdrType = hdrInfo != null ? hdrInfo.getHDRType() : 0; + if (hdrType == 1) { + hdrProcessor = RLottieDrawable.readRes(null, R.raw.hdr2sdr_hlg); + } else if (hdrType == 2) { + hdrProcessor = RLottieDrawable.readRes(null, R.raw.hdr2sdr_pq); + } + + int vertexShader; + int fragmentShader; + if (hdrType != 0) { + vertexShader = FilterShaders.loadShader(GLES20.GL_VERTEX_SHADER, FilterShaders.simpleVertexVideoShaderCode); + fragmentShader = FilterShaders.loadShader(GLES20.GL_FRAGMENT_SHADER, String.format(Locale.US, FilterShaders.simpleHdrToSdrFragmentShaderCode, hdrProcessor)); + } else { + vertexShader = FilterShaders.loadShader(GLES20.GL_VERTEX_SHADER, FilterShaders.simpleVertexVideoShaderCode); + fragmentShader = FilterShaders.loadShader(GLES20.GL_FRAGMENT_SHADER, "#extension GL_OES_EGL_image_external : require\n" + FilterShaders.simpleFragmentShaderCode.replace("sampler2D", "samplerExternalOES")); + } + + if (vertexShader != 0 && fragmentShader != 0) { + if (simpleOESShaderProgram != 0) { + GLES20.glDeleteProgram(simpleOESShaderProgram); + } + simpleOESShaderProgram = GLES20.glCreateProgram(); + GLES20.glAttachShader(simpleOESShaderProgram, vertexShader); + GLES20.glAttachShader(simpleOESShaderProgram, fragmentShader); + GLES20.glBindAttribLocation(simpleOESShaderProgram, 0, "position"); + GLES20.glBindAttribLocation(simpleOESShaderProgram, 1, "inputTexCoord"); + + GLES20.glLinkProgram(simpleOESShaderProgram); + int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(simpleOESShaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] == 0) { + GLES20.glDeleteProgram(simpleOESShaderProgram); + simpleOESShaderProgram = 0; + } else { + simpleOESPositionHandle = GLES20.glGetAttribLocation(simpleOESShaderProgram, "position"); + simpleOESInputTexCoordHandle = GLES20.glGetAttribLocation(simpleOESShaderProgram, "inputTexCoord"); + simpleOESSourceImageHandle = GLES20.glGetUniformLocation(simpleOESShaderProgram, "sourceImage"); + simpleOESMatrixHandle = GLES20.glGetUniformLocation(simpleOESShaderProgram, "videoMatrix"); + } + } else { + return false; + } + + return true; + } + private boolean initGL() { egl10 = (EGL10) EGLContext.getEGL(); @@ -266,28 +317,7 @@ public class FilterGLThread extends DispatchQueue { return false; } - vertexShader = FilterShaders.loadShader(GLES20.GL_VERTEX_SHADER, FilterShaders.simpleVertexVideoShaderCode); - fragmentShader = FilterShaders.loadShader(GLES20.GL_FRAGMENT_SHADER, "#extension GL_OES_EGL_image_external : require\n" + FilterShaders.simpleFragmentShaderCode.replace("sampler2D", "samplerExternalOES")); - if (vertexShader != 0 && fragmentShader != 0) { - simpleOESShaderProgram = GLES20.glCreateProgram(); - GLES20.glAttachShader(simpleOESShaderProgram, vertexShader); - GLES20.glAttachShader(simpleOESShaderProgram, fragmentShader); - GLES20.glBindAttribLocation(simpleOESShaderProgram, 0, "position"); - GLES20.glBindAttribLocation(simpleOESShaderProgram, 1, "inputTexCoord"); - - GLES20.glLinkProgram(simpleOESShaderProgram); - int[] linkStatus = new int[1]; - GLES20.glGetProgramiv(simpleOESShaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0); - if (linkStatus[0] == 0) { - GLES20.glDeleteProgram(simpleOESShaderProgram); - simpleOESShaderProgram = 0; - } else { - simpleOESPositionHandle = GLES20.glGetAttribLocation(simpleOESShaderProgram, "position"); - simpleOESInputTexCoordHandle = GLES20.glGetAttribLocation(simpleOESShaderProgram, "inputTexCoord"); - simpleOESSourceImageHandle = GLES20.glGetUniformLocation(simpleOESShaderProgram, "sourceImage"); - simpleOESMatrixHandle = GLES20.glGetUniformLocation(simpleOESShaderProgram, "videoMatrix"); - } - } else { + if (!setupVideoShader(null)) { return false; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterShaders.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterShaders.java index 637523188..7b31fe6c2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterShaders.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterShaders.java @@ -3,11 +3,9 @@ package org.telegram.ui.Components; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.PointF; -import android.media.MediaFormat; import android.opengl.GLES11Ext; import android.opengl.GLES20; import android.opengl.GLUtils; -import android.util.Log; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.BuildVars; @@ -67,24 +65,24 @@ public class FilterShaders { "gl_FragColor = vec4(mix(image.rgb, tone.rgb, 1.0 - mask.b), 1.0);" + "}"; - private static final String yuv_highpassSkinSmoothingCompositingFilterFragmentShaderString_300 = - "%1$s\n" + - "in highp vec2 vTextureCoord;" + - "in highp vec2 texCoord2;" + - "uniform sampler2D toneCurveTexture;" + - "uniform sampler2D inputImageTexture3;" + - "uniform lowp float mixturePercent;" + - "out vec4 fragColor;" + - "void main() {" + - "vec4 image = TEX(vTextureCoord);" + - "vec4 mask = texture(inputImageTexture3, texCoord2);" + - "float redCurveValue = texture(toneCurveTexture, vec2(image.r, 0.0)).r;" + - "float greenCurveValue = texture(toneCurveTexture, vec2(image.g, 0.0)).g;" + - "float blueCurveValue = texture(toneCurveTexture, vec2(image.b, 0.0)).b;" + - "vec4 result = vec4(redCurveValue, greenCurveValue, blueCurveValue, image.a);" + - "vec4 tone = mix(image, result, mixturePercent);" + - "fragColor = vec4(mix(image.rgb, tone.rgb, 1.0 - mask.b), 1.0);" + - "}"; + private static final String HDRHighpassSkinSmoothingCompositingFilterFragmentShaderString = + "%1$s\n" + + "precision lowp float;" + + "varying highp vec2 vTextureCoord;" + + "varying highp vec2 texCoord2;" + + "uniform sampler2D toneCurveTexture;" + + "uniform sampler2D inputImageTexture3;" + + "uniform lowp float mixturePercent;" + + "void main() {" + + "vec4 image = TEX(vTextureCoord);" + + "vec4 mask = texture2D(inputImageTexture3, texCoord2);" + + "float redCurveValue = texture2D(toneCurveTexture, vec2(image.r, 0.0)).r;" + + "float greenCurveValue = texture2D(toneCurveTexture, vec2(image.g, 0.0)).g;" + + "float blueCurveValue = texture2D(toneCurveTexture, vec2(image.b, 0.0)).b;" + + "vec4 result = vec4(redCurveValue, greenCurveValue, blueCurveValue, image.a);" + + "vec4 tone = mix(image, result, mixturePercent);" + + "gl_FragColor = vec4(mix(image.rgb, tone.rgb, 1.0 - mask.b), 1.0);" + + "}"; private static final String greenAndBlueChannelOverlayFragmentShaderCode = "%1$s\n" + @@ -100,18 +98,18 @@ public class FilterShaders { "gl_FragColor = vec4(ba,ba,ba,image.a);" + "}"; - private static final String greenAndBlueChannelOverlayFragmentShaderCode_300 = - "%1$s\n" + - "in highp vec2 vTextureCoord;" + - "out vec4 fragColor;" + - "void main() {" + - "vec4 inp = TEX(vTextureCoord);" + - "vec4 image = vec4(inp.rgb * pow(2.0, -1.0), inp.w);" + - "vec4 base = vec4(image.g, image.g, image.g, 1.0);" + - "vec4 overlay = vec4(image.b, image.b, image.b, 1.0);" + - "float ba = 2.0 * overlay.b * base.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a);" + - "fragColor = vec4(ba,ba,ba,image.a);" + - "}"; + private static final String HDRGreenAndBlueChannelOverlayFragmentShaderCode = + "%1$s\n" + + "precision lowp float;" + + "varying highp vec2 vTextureCoord;" + + "void main() {" + + "vec4 inp = TEX(vTextureCoord);" + + "vec4 image = vec4(inp.rgb * pow(2.0, -1.0), inp.w);" + + "vec4 base = vec4(image.g, image.g, image.g, 1.0);" + + "vec4 overlay = vec4(image.b, image.b, image.b, 1.0);" + + "float ba = 2.0 * overlay.b * base.b + overlay.b * (1.0 - base.a) + base.b * (1.0 - overlay.a);" + + "gl_FragColor = vec4(ba,ba,ba,image.a);" + + "}"; private static final String stillImageHighPassFilterFragmentShaderCode = "precision lowp float;" + @@ -335,17 +333,6 @@ public class FilterShaders { "vTextureCoord = vec2(videoMatrix * inputTexCoord).xy;" + "}"; - private static final String simpleVertexVideoShaderCode_300 = - "#version 320 es\n" + - "in vec4 position;" + - "uniform mat4 videoMatrix;" + - "in vec4 inputTexCoord;" + - "out vec2 vTextureCoord;" + - "void main() {" + - "gl_Position = position;" + - "vTextureCoord = vec2(videoMatrix * inputTexCoord).xy;" + - "}"; - private static final String simpleTwoTextureVertexVideoShaderCode = "attribute vec4 position;" + "uniform mat4 videoMatrix;" + @@ -358,19 +345,6 @@ public class FilterShaders { "texCoord2 = inputTexCoord.xy;" + "}"; - private static final String simpleTwoTextureVertexVideoShaderCode_300 = - "#version 320 es\n" + - "in vec4 position;" + - "uniform mat4 videoMatrix;" + - "in vec4 inputTexCoord;" + - "out vec2 vTextureCoord;" + - "out vec2 texCoord2;" + - "void main() {" + - "gl_Position = position;" + - "vTextureCoord = vec2(videoMatrix * inputTexCoord).xy;" + - "texCoord2 = inputTexCoord.xy;" + - "}"; - private static final String rgbToHsvFragmentShaderCode = "%1$s\n" + "precision highp float;" + @@ -389,22 +363,22 @@ public class FilterShaders { "gl_FragColor = vec4(rgb_to_hsv(texel.rgb), texel.a);" + "}"; - private static final String yuvToHsvFragmentShaderCode_300 = - "%1$s\n" + - "in vec2 vTextureCoord;" + - "out vec4 fragColor;" + - "highp vec3 rgb_to_hsv(vec3 c) {" + - "highp vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);" + - "highp vec4 p = c.g < c.b ? vec4(c.bg, K.wz) : vec4(c.gb, K.xy);" + - "highp vec4 q = c.r < p.x ? vec4(p.xyw, c.r) : vec4(c.r, p.yzx);" + - "highp float d = q.x - min(q.w, q.y);" + - "highp float e = 1.0e-10;" + - "return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);" + - "}" + - "void main() {" + - "vec4 texel = TEX(vTextureCoord);" + - "fragColor = vec4(rgb_to_hsv(texel.rgb), texel.a);" + - "}"; + private static final String HDRRgbToHsvFragmentShaderCode = + "%1$s\n" + + "precision highp float;" + + "varying vec2 vTextureCoord;" + + "vec3 rgb_to_hsv(vec3 c) {" + + "vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);" + + "vec4 p = c.g < c.b ? vec4(c.bg, K.wz) : vec4(c.gb, K.xy);" + + "vec4 q = c.r < p.x ? vec4(p.xyw, c.r) : vec4(c.r, p.yzx);" + + "float d = q.x - min(q.w, q.y);" + + "float e = 1.0e-10;" + + "return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);" + + "}" + + "void main() {" + + "vec4 texel = TEX(vTextureCoord);" + + "gl_FragColor = vec4(rgb_to_hsv(texel.rgb), texel.a);" + + "}"; private static final String enhanceFragmentShaderCode = "precision highp float;" + @@ -474,6 +448,13 @@ public class FilterShaders { "gl_FragColor = texture2D(sTexture, vTextureCoord);" + "}"; + public static final String simpleHdrToSdrFragmentShaderCode = + "%1$s\n" + + "varying highp vec2 vTextureCoord;" + + "void main() {" + + "gl_FragColor = TEX(vTextureCoord);" + + "}"; + private static final String sharpenVertexShaderCode = "attribute vec4 position;" + "attribute vec2 inputTexCoord;" + @@ -1396,12 +1377,12 @@ public class FilterShaders { } private boolean setupExternalShaders() { - String yuvProcessor = ""; + String hdrProcessor = ""; int hdrType = hdrInfo != null ? hdrInfo.getHDRType() : 0; if (hdrType == 1) { - yuvProcessor = RLottieDrawable.readRes(null, R.raw.yuv_hlg2rgb); + hdrProcessor = RLottieDrawable.readRes(null, R.raw.hdr2sdr_hlg); } else if (hdrType == 2) { - yuvProcessor = RLottieDrawable.readRes(null, R.raw.yuv_pq2rgb); + hdrProcessor = RLottieDrawable.readRes(null, R.raw.hdr2sdr_pq); } String extension = isVideo ? "#extension GL_OES_EGL_image_external : require" : ""; String sampler2D = isVideo ? "samplerExternalOES" : "sampler2D"; @@ -1411,8 +1392,8 @@ public class FilterShaders { for (int a = 0; a < (isVideo ? 2 : 1); a++) { if (a == 1 && isVideo) { if (hdrType != 0) { - vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleVertexVideoShaderCode_300); - fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, String.format(Locale.US, yuvToHsvFragmentShaderCode_300, yuvProcessor)); + vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleVertexVideoShaderCode); + fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, String.format(Locale.US, HDRRgbToHsvFragmentShaderCode, hdrProcessor)); } else { vertexShader = fragmentShader = 0; } @@ -1453,8 +1434,8 @@ public class FilterShaders { if (isVideo) { if (hdrType != 0) { - vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleVertexVideoShaderCode_300); - fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, String.format(Locale.US, greenAndBlueChannelOverlayFragmentShaderCode_300, yuvProcessor)); + vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleVertexVideoShaderCode); + fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, String.format(Locale.US, HDRGreenAndBlueChannelOverlayFragmentShaderCode, hdrProcessor)); } else { vertexShader = fragmentShader = 0; } @@ -1494,8 +1475,8 @@ public class FilterShaders { if (isVideo) { if (hdrType != 0) { - vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleTwoTextureVertexVideoShaderCode_300); - fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, String.format(Locale.US, yuv_highpassSkinSmoothingCompositingFilterFragmentShaderString_300, yuvProcessor)); + vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleTwoTextureVertexVideoShaderCode); + fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, String.format(Locale.US, HDRHighpassSkinSmoothingCompositingFilterFragmentShaderString, hdrProcessor)); } else { vertexShader = fragmentShader = 0; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FolderBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FolderBottomSheet.java index a4a4bce6f..2e638821d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FolderBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FolderBottomSheet.java @@ -916,7 +916,7 @@ public class FolderBottomSheet extends BottomSheetWithRecyclerListView { } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return new RecyclerListView.SelectionAdapter() { private static final int diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupCreateSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupCreateSpan.java index fb915c970..1807aaa95 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupCreateSpan.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupCreateSpan.java @@ -37,11 +37,13 @@ import org.telegram.messenger.R; import org.telegram.messenger.UserObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.GroupCreateUserCell; public class GroupCreateSpan extends View { private long uid; private String key; + public boolean isFlag; private static TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); private static Paint backPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Drawable deleteDrawable; @@ -80,6 +82,7 @@ public class GroupCreateSpan extends View { super(context); this.resourcesProvider = resourcesProvider; this.small = small; + isFlag = false; currentContact = contact; deleteDrawable = getResources().getDrawable(R.drawable.delete); @@ -143,6 +146,11 @@ public class GroupCreateSpan extends View { uid = Long.MIN_VALUE + 9; firstName = LocaleController.getString(R.string.FilterNewChats); break; + case "premium": + isFlag = true; + avatarDrawable.setColor(Theme.getColor(Theme.key_premiumGradientBackground2, resourcesProvider)); + firstName = "Premium Users"; + break; case "archived": default: avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_FILTER_ARCHIVED); @@ -228,7 +236,11 @@ public class GroupCreateSpan extends View { textWidth = (int) Math.ceil(nameLayout.getLineWidth(0)); textX = -nameLayout.getLineLeft(0); } - imageReceiver.setImage(imageLocation, "50_50", avatarDrawable, 0, null, imageParent, 1); + if (object instanceof String && "premium".equals((String) object)) { + imageReceiver.setImageBitmap(GroupCreateUserCell.makePremiumUsersDrawable(getContext(), true)); + } else { + imageReceiver.setImage(imageLocation, "50_50", avatarDrawable, 0, null, imageParent, 1); + } updateColors(); NotificationCenter.listenEmojiLoading(this); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java index 4836c0d18..149b3be0c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java @@ -177,7 +177,6 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter private TextureView textureView; private BackupImageView textureOverlayView; private final boolean useCamera2 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && SharedConfig.useCamera2; - private final boolean supportHotSwap = useCamera2 && DualCameraView.dualAvailableStatic(ApplicationLoader.applicationContext); private CameraSession cameraSession; private boolean bothCameras; private Camera2Session[] camera2Sessions = new Camera2Session[2]; @@ -701,7 +700,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter } if (useCamera2) { - bothCameras = DualCameraView.dualAvailableStatic(getContext()); + bothCameras = DualCameraView.roundDualAvailableStatic(getContext()); if (bothCameras) { for (int a = 0; a < 2; ++a) { if (camera2Sessions[a] == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LayoutHelper.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LayoutHelper.java index 98b95b95d..864a9e517 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LayoutHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LayoutHelper.java @@ -175,6 +175,13 @@ public class LayoutHelper { return layoutParams; } + public static LinearLayout.LayoutParams createLinear(int width, float height, int gravity, int leftMargin, int topMargin, int rightMargin, int bottomMargin) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height)); + layoutParams.setMargins(AndroidUtilities.dp(leftMargin), AndroidUtilities.dp(topMargin), AndroidUtilities.dp(rightMargin), AndroidUtilities.dp(bottomMargin)); + layoutParams.gravity = gravity; + return layoutParams; + } + public static LinearLayout.LayoutParams createLinear(int width, int height, float leftMargin, float topMargin, float rightMargin, float bottomMargin) { LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(getSize(width), getSize(height)); layoutParams.setMargins(AndroidUtilities.dp(leftMargin), AndroidUtilities.dp(topMargin), AndroidUtilities.dp(rightMargin), AndroidUtilities.dp(bottomMargin)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkSpanDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkSpanDrawable.java index 8028a10b9..b56b3951a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkSpanDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkSpanDrawable.java @@ -1,5 +1,7 @@ package org.telegram.ui.Components; +import static org.telegram.messenger.AndroidUtilities.dp; + import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -15,6 +17,7 @@ import android.text.Spanned; import android.text.style.CharacterStyle; import android.text.style.ClickableSpan; import android.util.Pair; +import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; @@ -125,7 +128,7 @@ public class LinkSpanDrawable { } public boolean draw(Canvas canvas) { - final int radius = isLite ? 0 : AndroidUtilities.dp(CORNER_RADIUS_DP); + final int radius = isLite ? 0 : dp(CORNER_RADIUS_DP); boolean cornerRadiusUpdate = cornerRadius != radius; if (mSelectionPaint == null) { mSelectionPaint = new Paint(Paint.ANTI_ALIAS_FLAG); @@ -205,14 +208,14 @@ public class LinkSpanDrawable { } mSelectionPaint.setAlpha((int) (mSelectionAlpha * selectionAlpha * Math.min(1, pressT * 5f) * (1f - releaseT))); - mSelectionPaint.setStrokeWidth(Math.min(1, 1f - longPress) * AndroidUtilities.dp(5)); + mSelectionPaint.setStrokeWidth(Math.min(1, 1f - longPress) * dp(5)); for (int i = 0; i < mPathesCount; ++i) { mPathes.get(i).closeRects(); canvas.drawPath(mPathes.get(i), mSelectionPaint); } mRipplePaint.setAlpha((int) (mRippleAlpha * rippleAlpha * (1f - releaseT))); - mRipplePaint.setStrokeWidth(Math.min(1, 1f - longPress) * AndroidUtilities.dp(5)); + mRipplePaint.setStrokeWidth(Math.min(1, 1f - longPress) * dp(5)); if (pressT < 1f) { float r = pressT * mMaxRadius; canvas.save(); @@ -498,6 +501,8 @@ public class LinkSpanDrawable { private LinkCollector links; private Theme.ResourcesProvider resourcesProvider; + AnimatedEmojiSpan.EmojiGroupedSpans stack; + private LinkSpanDrawable pressedLink; private OnLinkPress onPressListener; @@ -507,6 +512,30 @@ public class LinkSpanDrawable { private boolean disablePaddingsOffsetX; private boolean disablePaddingsOffsetY; + private CharacterStyle currentLinkLoading; + public void setLoading(CharacterStyle span) { + if (currentLinkLoading != span) { + links.clearLoading(true); + currentLinkLoading = span; + LoadingDrawable drawable = LinkSpanDrawable.LinkCollector.makeLoading(getLayout(), span, getPaddingTop()); + if (drawable != null) { + final int color = processColor(Theme.getColor(Theme.key_chat_linkSelectBackground, resourcesProvider)); + drawable.setColors( + Theme.multAlpha(color, .8f), + Theme.multAlpha(color, 1.3f), + Theme.multAlpha(color, 1f), + Theme.multAlpha(color, 4f) + ); + drawable.strokePaint.setStrokeWidth(AndroidUtilities.dpf2(1.25f)); + links.addLoading(drawable); + } + } + } + + protected int processColor(int color) { + return color; + } + public LinksTextView(Context context) { this(context, null); } @@ -630,6 +659,39 @@ public class LinkSpanDrawable { canvas.restore(); } super.onDraw(canvas); + float offset = (getGravity() & Gravity.CENTER_VERTICAL) != 0 && getLayout() != null ? getPaddingTop() + (getHeight() - getPaddingTop() - getPaddingBottom() - getLayout().getHeight()) / 2f : 0; + if (offset != 0 || getPaddingLeft() != 0) { + canvas.save(); + canvas.translate(getPaddingLeft(), offset); + } + AnimatedEmojiSpan.drawAnimatedEmojis(canvas, getLayout(), stack, 0, null, 0, 0, 0, 1f); + if (offset != 0 || getPaddingLeft() != 0) { + canvas.restore(); + } + } + + @Override + public void setText(CharSequence text, TextView.BufferType type) { + super.setText(text, type); + stack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, stack, getLayout()); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + stack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, stack, getLayout()); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + stack = AnimatedEmojiSpan.update(AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES, this, stack, getLayout()); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + AnimatedEmojiSpan.release(this, stack); } } @@ -656,7 +718,7 @@ public class LinkSpanDrawable { if (isClickable()) { AndroidUtilities.rectTmp.set(0, 0, getPaddingLeft() + getTextWidth() + getPaddingRight(), getHeight()); linkBackgroundPaint.setColor(getLinkColor()); - canvas.drawRoundRect(AndroidUtilities.rectTmp, AndroidUtilities.dp(CORNER_RADIUS_DP), AndroidUtilities.dp(CORNER_RADIUS_DP), linkBackgroundPaint); + canvas.drawRoundRect(AndroidUtilities.rectTmp, dp(CORNER_RADIUS_DP), dp(CORNER_RADIUS_DP), linkBackgroundPaint); } super.onDraw(canvas); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ListView/AdapterWithDiffUtils.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ListView/AdapterWithDiffUtils.java index 7aef60ab8..9545d9e9a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ListView/AdapterWithDiffUtils.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ListView/AdapterWithDiffUtils.java @@ -21,7 +21,7 @@ public abstract class AdapterWithDiffUtils extends RecyclerListView.SelectionAda } public static abstract class Item { - public final int viewType; + public int viewType; public boolean selectable; public Item(int viewType, boolean selectable) { @@ -33,9 +33,17 @@ public abstract class AdapterWithDiffUtils extends RecyclerListView.SelectionAda if (viewType != item.viewType) { return false; } - if (this.equals(item)) { - return true; + return this.equals(item); + } + + boolean compareContents(Item item) { + if (viewType != item.viewType) { + return false; } + return this.contentsEquals(item); + } + + protected boolean contentsEquals(Item item) { return false; } } @@ -67,7 +75,7 @@ public abstract class AdapterWithDiffUtils extends RecyclerListView.SelectionAda @Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { - return false; + return oldItems.get(oldItemPosition).compareContents(newItems.get(newItemPosition)); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java index 0bfe9a11c..9f0d5095c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java @@ -1058,7 +1058,7 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha @Override public boolean isLightStatusBar() { - if (storyViewer != null && storyViewer.isShown()) { + if (getLastStoryViewer() != null && getLastStoryViewer().isShown()) { return false; } int color = Theme.getColor(Theme.key_windowBackgroundWhite); @@ -1087,11 +1087,9 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha @Override public Tab[] createTabs() { Tab[] tabs = new Tab[] { - new Tab(0, R.raw.msg_stories_saved, LocaleController.getString("ProfileMyStoriesTab", R.string.ProfileMyStoriesTab)), - new Tab(1, R.raw.msg_stories_archive, LocaleController.getString("ProfileStoriesArchiveTab", R.string.ProfileStoriesArchiveTab)) + new Tab(0, R.raw.msg_stories_saved, 20, 40, LocaleController.getString("ProfileMyStoriesTab", R.string.ProfileMyStoriesTab)), + new Tab(1, R.raw.msg_stories_archive, 0, 0, LocaleController.getString("ProfileStoriesArchiveTab", R.string.ProfileStoriesArchiveTab)) }; - tabs[0].customEndFrameMid = 20; - tabs[0].customEndFrameEnd = 40; return tabs; } } @@ -1099,8 +1097,8 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha @Override public int getNavigationBarColor() { int color = getThemedColor(Theme.key_windowBackgroundWhite); - if (storyViewer != null && storyViewer.attachedToParent()) { - return storyViewer.getNavigationBarColor(color); + if (getLastStoryViewer() != null && getLastStoryViewer().attachedToParent()) { + return getLastStoryViewer().getNavigationBarColor(color); } return color; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/MessageContainsEmojiButton.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/MessageContainsEmojiButton.java index 810bc0b26..818941900 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/MessageContainsEmojiButton.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/MessageContainsEmojiButton.java @@ -58,6 +58,7 @@ public class MessageContainsEmojiButton extends FrameLayout implements Notificat public final static int REACTIONS_TYPE = 1; public final static int EMOJI_STICKER_TYPE = 2; public final static int SINGLE_REACTION_TYPE = 3; + public final static int STICKERS_BOT_TYPE = 4; int type; private class BoldAndAccent extends CharacterStyle { @@ -162,6 +163,13 @@ public class MessageContainsEmojiButton extends FrameLayout implements Notificat loadingDrawable.setRadiiDp(4); } } + } else { + if (type == STICKERS_BOT_TYPE) { + mainText = AndroidUtilities.replaceSingleTag(LocaleController.getString(R.string.StickersCheckStickersBotForMoreOptions), + Theme.key_chat_messageLinkIn, AndroidUtilities.REPLACING_TAG_TYPE_LINKBOLD, + null, + resourcesProvider); + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java index b12e5a70d..e592d6f0c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java @@ -675,6 +675,9 @@ public class NumberPicker extends LinearLayout { updateInputTextView(); tryComputeMaxWidth(); invalidate(); + if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE && mOnScrollListener != null) { + mOnScrollListener.onScrollStateChange(this, OnScrollListener.SCROLL_STATE_IDLE); + } } public int getMaxValue() { @@ -702,6 +705,9 @@ public class NumberPicker extends LinearLayout { updateInputTextView(); tryComputeMaxWidth(); invalidate(); + if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE && mOnScrollListener != null) { + mOnScrollListener.onScrollStateChange(this, OnScrollListener.SCROLL_STATE_IDLE); + } } public String[] getDisplayedValues() { @@ -894,16 +900,17 @@ public class NumberPicker extends LinearLayout { int previous = mValue; mValue = mFantomValue = current; updateInputTextView(); - if (Math.abs(previous - current) > 0.9f && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + if (Math.abs(previous - current) > 0.9f) { + AndroidUtilities.vibrateCursor(this); } if (notifyChange) { notifyChange(previous, current); } initializeSelectorWheelIndices(); invalidate(); + if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE && mOnScrollListener != null) { + mOnScrollListener.onScrollStateChange(this, OnScrollListener.SCROLL_STATE_IDLE); + } } protected void changeValueByOne(boolean increment) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/OutlineTextContainerView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/OutlineTextContainerView.java index 2a17821e7..56b83596a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/OutlineTextContainerView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/OutlineTextContainerView.java @@ -55,8 +55,16 @@ public class OutlineTextContainerView extends FrameLayout { private EditText attachedEditText; private boolean forceUseCenter; + private final Theme.ResourcesProvider resourcesProvider; + public OutlineTextContainerView(Context context) { + this(context, null); + } + + public OutlineTextContainerView(Context context, Theme.ResourcesProvider resourcesProvider) { super(context); + this.resourcesProvider = resourcesProvider; + setWillNotDraw(false); textPaint.setTextSize(AndroidUtilities.dp(16)); outlinePaint.setStyle(Paint.Style.STROKE); @@ -92,10 +100,10 @@ public class OutlineTextContainerView extends FrameLayout { } public void updateColor() { - int textSelectionColor = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhiteHintText), Theme.getColor(Theme.key_windowBackgroundWhiteValueText), forceUseCenter ? 0f : selectionProgress); - textPaint.setColor(ColorUtils.blendARGB(textSelectionColor, Theme.getColor(Theme.key_text_RedBold), errorProgress)); - int selectionColor = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhiteInputField), Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated), forceUseCenter ? 0f : selectionProgress); - setColor(ColorUtils.blendARGB(selectionColor, Theme.getColor(Theme.key_text_RedBold), errorProgress)); + int textSelectionColor = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhiteHintText, resourcesProvider), Theme.getColor(Theme.key_windowBackgroundWhiteValueText, resourcesProvider), forceUseCenter ? 0f : selectionProgress); + textPaint.setColor(ColorUtils.blendARGB(textSelectionColor, Theme.getColor(Theme.key_text_RedBold, resourcesProvider), errorProgress)); + int selectionColor = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhiteInputField, resourcesProvider), Theme.getColor(Theme.key_windowBackgroundWhiteInputFieldActivated, resourcesProvider), forceUseCenter ? 0f : selectionProgress); + setColor(ColorUtils.blendARGB(selectionColor, Theme.getColor(Theme.key_text_RedBold, resourcesProvider), errorProgress)); } public void animateSelection(float newValue) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/LPhotoPaintView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/LPhotoPaintView.java index f3a056e5e..ca9b96be0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/LPhotoPaintView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/LPhotoPaintView.java @@ -145,7 +145,7 @@ public class LPhotoPaintView extends SizeNotifierFrameLayoutPhoto implements IPh private RenderView renderView; private View renderInputView; private FrameLayout selectionContainerView; - private EntitiesContainerView entitiesView; + public EntitiesContainerView entitiesView; private ThanosEffect thanosEffect; private FrameLayout topLayout; public FrameLayout bottomLayout; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/StickerCutOutBtn.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/StickerCutOutBtn.java new file mode 100644 index 000000000..9963dec73 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/StickerCutOutBtn.java @@ -0,0 +1,109 @@ +package org.telegram.ui.Components.Paint.Views; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.RectF; +import android.os.Build; +import android.text.SpannableStringBuilder; +import android.view.View; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.BlurringShader; +import org.telegram.ui.Components.ColoredImageSpan; +import org.telegram.ui.Stories.recorder.ButtonWithCounterView; + +@SuppressLint("ViewConstructor") +public class StickerCutOutBtn extends ButtonWithCounterView { + private static final int STATE_CUT_OUT = 0; + private static final int STATE_UNDO_CAT = 1; + private static final int STATE_CANCEL = 2; + + protected final BlurringShader.StoryBlurDrawer blurDrawer; + protected final RectF bounds = new RectF(); + private int state; + private final StickerMakerView stickerMakerView; + + public StickerCutOutBtn(StickerMakerView stickerMakerView, Context context, Theme.ResourcesProvider resourcesProvider, BlurringShader.BlurManager blurManager) { + super(context, false, resourcesProvider); + this.stickerMakerView = stickerMakerView; + blurDrawer = new BlurringShader.StoryBlurDrawer(blurManager, this, BlurringShader.StoryBlurDrawer.BLUR_TYPE_BACKGROUND, true); + setWillNotDraw(false); + setTextColor(Color.WHITE); + setFlickeringLoading(true); + text.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + setForeground(Theme.createRadSelectorDrawable(Theme.getColor(Theme.key_listSelector, resourcesProvider), 8, 8)); + } + + @Override + public void setAlpha(float alpha) { + if (!stickerMakerView.hasSegmentedBitmap()) { + alpha = 0f; + } + super.setAlpha(alpha); + } + + @Override + protected void onDraw(Canvas canvas) { + bounds.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); + super.onDraw(canvas); + } + + @Override + public void setVisibility(int visibility) { + if (Build.VERSION.SDK_INT < 24) { + super.setVisibility(View.GONE); + } else { + super.setVisibility(visibility); + } + } + + public void setCutOutState(boolean animated) { + state = STATE_CUT_OUT; + SpannableStringBuilder cutOutBtnText = new SpannableStringBuilder("d"); + ColoredImageSpan coloredImageSpan = new ColoredImageSpan(R.drawable.media_magic_cut); + coloredImageSpan.setSize(dp(22)); + coloredImageSpan.setTranslateX(dp(-2)); + cutOutBtnText.setSpan(coloredImageSpan, 0, 1, 0); + cutOutBtnText.append(" ").append(LocaleController.getString(R.string.SegmentationCutObject)); + setText(cutOutBtnText, animated); + } + + public void setUndoCutState(boolean animated) { + state = STATE_UNDO_CAT; + SpannableStringBuilder cutOutBtnText = new SpannableStringBuilder("d"); + ColoredImageSpan coloredImageSpan = new ColoredImageSpan(R.drawable.photo_undo2); + coloredImageSpan.setSize(dp(20)); + coloredImageSpan.setTranslateX(dp(-3)); + cutOutBtnText.setSpan(coloredImageSpan, 0, 1, 0); + cutOutBtnText.append(" ").append(LocaleController.getString(R.string.SegmentationUndoCutOut)); + setText(cutOutBtnText, animated); + } + + public void setCancelState(boolean animated) { + state = STATE_CANCEL; + setText(LocaleController.getString(R.string.Cancel), animated); + } + + public boolean isCutOutState() { + return state == STATE_CUT_OUT; + } + + public boolean isCancelState() { + return state == STATE_CANCEL; + } + + public void clean() { + setCutOutState(false); + } + + public void invalidateBlur() { + invalidate(); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/StickerMakerBackgroundView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/StickerMakerBackgroundView.java new file mode 100644 index 000000000..a2727d6c6 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/StickerMakerBackgroundView.java @@ -0,0 +1,60 @@ +package org.telegram.ui.Components.Paint.Views; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.view.View; + +import org.telegram.messenger.AndroidUtilities; + +public class StickerMakerBackgroundView extends View { + private final Paint backgroundPaint = new Paint(); + private final Path path = new Path(); + + public StickerMakerBackgroundView(Context context) { + super(context); + backgroundPaint.setColor(Color.WHITE); + backgroundPaint.setAlpha(40); + setLayerType(LAYER_TYPE_HARDWARE, null); + } + + @Override + protected void onDraw(Canvas canvas) { + float inset = dp(10); + float width = getMeasuredWidth() - inset * 2; + float height = getMeasuredHeight() - inset * 2; + + canvas.save(); + AndroidUtilities.rectTmp.set(inset, inset, inset + width, inset + width); + AndroidUtilities.rectTmp.offset(0, (height - AndroidUtilities.rectTmp.height()) / 2); + float rx = width / 7f; + path.rewind(); + path.addRoundRect(AndroidUtilities.rectTmp, rx, rx, Path.Direction.CW); + canvas.clipPath(path); + + int singleRectSize = dp(10); + canvas.save(); + canvas.translate(AndroidUtilities.rectTmp.left, AndroidUtilities.rectTmp.top); + + int rowCount = (int) (AndroidUtilities.rectTmp.width() / singleRectSize) + 1; + int columCount = (int) (AndroidUtilities.rectTmp.height() / singleRectSize) + 1; + + for (int c = 0; c < columCount; c++) { + canvas.save(); + for (int r = 0; r < rowCount; r++) { + if ((r % 2 == 0 && c % 2 == 0) || (r % 2 != 0 && c % 2 != 0)) { + canvas.drawRect(0, 0, singleRectSize, singleRectSize, backgroundPaint); + } + canvas.translate(singleRectSize, 0); + } + canvas.restore(); + canvas.translate(0, singleRectSize); + } + canvas.restore(); + canvas.restore(); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/StickerMakerView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/StickerMakerView.java new file mode 100644 index 000000000..0427b0d7b --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Paint/Views/StickerMakerView.java @@ -0,0 +1,1062 @@ +package org.telegram.ui.Components.Paint.Views; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.animation.ValueAnimator; +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.BlurMaskFilter; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.CornerPathEffect; +import android.graphics.DashPathEffect; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PathMeasure; +import android.graphics.PointF; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.RectF; +import android.os.Build; +import android.util.Log; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.LinearInterpolator; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.graphics.ColorUtils; + +import com.google.mlkit.common.MlKitException; +import com.google.mlkit.vision.common.InputImage; +import com.google.mlkit.vision.segmentation.subject.Subject; +import com.google.mlkit.vision.segmentation.subject.SubjectSegmentation; +import com.google.mlkit.vision.segmentation.subject.SubjectSegmenter; +import com.google.mlkit.vision.segmentation.subject.SubjectSegmenterOptions; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.FileLoader; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageReceiver; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaController; +import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; +import org.telegram.messenger.VideoEditedInfo; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AnimatedFloat; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.ThanosEffect; +import org.telegram.ui.Stories.DarkThemeResourceProvider; +import org.telegram.ui.Stories.recorder.StoryEntry; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; + +@SuppressLint("ViewConstructor") +public class StickerMakerView extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { + + public int currentAccount = -1; + private final AnimatedFloat segmentBorderAlpha = new AnimatedFloat(0, (View) null, 0, 420, CubicBezierInterpolator.EASE_OUT_QUINT); + private final Paint dashPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint borderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint segmentBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final PathMeasure bordersPathMeasure = new PathMeasure(); + private final Path bgPath = new Path(); + private final Path areaPath = new Path(); + private final Path screenPath = new Path(); + private final Path dashPath = new Path(); + private volatile boolean segmentingLoading; + private volatile boolean segmentingLoaded; + private SegmentedObject selectedObject; + public SegmentedObject[] objects; + private volatile Bitmap sourceBitmap; + private Bitmap filteredBitmap; + private boolean isSegmentedState; + private final TextView actionTextView; + private ValueAnimator bordersAnimator; + private ValueAnimator bordersEnterAnimator; + private float segmentBorderImageWidth, segmentBorderImageHeight; + private float bordersAnimatorValueStart, bordersAnimatorValue; + private float bordersEnterAnimatorValue; + private ThanosEffect thanosEffect; + private int containerWidth; + private int containerHeight; + public boolean isThanosInProgress; + private StickerUploader stickerUploader; + private AlertDialog loadingDialog; + private final Theme.ResourcesProvider resourcesProvider; + private StickerCutOutBtn stickerCutOutBtn; + + private final Matrix imageReceiverMatrix = new Matrix(); + private float imageReceiverWidth, imageReceiverHeight; + + public StickerMakerView(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + this.resourcesProvider = resourcesProvider; + dashPaint.setColor(0xffffffff); + dashPaint.setStyle(Paint.Style.STROKE); + dashPaint.setStrokeWidth(dp(2)); + dashPaint.setStrokeCap(Paint.Cap.ROUND); + dashPaint.setPathEffect(new DashPathEffect(new float[]{dp(5), dp(10)}, .5f)); + dashPaint.setShadowLayer(AndroidUtilities.dpf2(0.75f), 0, 0, 0x50000000); + dashPaint.setAlpha(140); + + actionTextView = new TextView(context); + actionTextView.setText(LocaleController.getString(R.string.SegmentationTabToCrop)); + actionTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + actionTextView.setTextColor(Color.WHITE); + actionTextView.setAlpha(0f); + actionTextView.setScaleX(0.3f); + actionTextView.setScaleY(0.3f); + addView(actionTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + + borderPaint.setColor(Color.WHITE); + borderPaint.setStrokeWidth(dp(3)); + borderPaint.setStyle(Paint.Style.STROKE); + borderPaint.setStrokeCap(Paint.Cap.ROUND); + borderPaint.setPathEffect(new CornerPathEffect(dp(6))); + borderPaint.setMaskFilter(new BlurMaskFilter(dp(4), BlurMaskFilter.Blur.NORMAL)); + + segmentBorderPaint.setColor(Color.WHITE); + segmentBorderPaint.setStrokeWidth(dp(3)); + segmentBorderPaint.setStyle(Paint.Style.STROKE); + segmentBorderPaint.setStrokeCap(Paint.Cap.ROUND); + segmentBorderPaint.setPathEffect(new CornerPathEffect(dp(6))); + segmentBorderPaint.setMaskFilter(new BlurMaskFilter(dp(4), BlurMaskFilter.Blur.NORMAL)); + + bgPaint.setColor(0x66000000); + setLayerType(LAYER_TYPE_HARDWARE, null); + } + + public void setStickerCutOutBtn(StickerCutOutBtn stickerCutOutBtn) { + this.stickerCutOutBtn = stickerCutOutBtn; + } + + public float getSegmentBorderImageHeight() { + return segmentBorderImageHeight; + } + + public float getSegmentBorderImageWidth() { + return segmentBorderImageWidth; + } + + public ThanosEffect getThanosEffect() { + if (!ThanosEffect.supports()) { + return null; + } + if (thanosEffect == null) { + addView(thanosEffect = new ThanosEffect(getContext(), () -> { + ThanosEffect thisThanosEffect = thanosEffect; + if (thisThanosEffect != null) { + thanosEffect = null; + removeView(thisThanosEffect); + } + }), LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + } + return thanosEffect; + } + + public class SegmentedObject { + + public AnimatedFloat select = new AnimatedFloat(0, (View) null, 0, 320, CubicBezierInterpolator.EASE_OUT_QUINT); + public boolean hover; + + public int orientation; + public Bitmap image; + public Bitmap darkMaskImage; + + public RectF bounds = new RectF(); + public RectF rotatedBounds = new RectF(); + + private float borderImageWidth; + private float borderImageHeight; + + private final Path segmentBorderPath = new Path(); + private final Path partSegmentBorderPath = new Path(); + + public void drawBorders(Canvas canvas, float progress, float alpha, View parent) { + select.setParent(parent); + if (sourceBitmap == null) return; + + final float s = AndroidUtilities.lerp(1f, 1.065f, alpha) * AndroidUtilities.lerp(1f, 1.05f, select.set(hover)); + + int w, h; + if (orientation / 90 % 2 != 0) { + w = sourceBitmap.getHeight(); + h = sourceBitmap.getWidth(); + } else { + w = sourceBitmap.getWidth(); + h = sourceBitmap.getHeight(); + } + + canvas.save(); + canvas.scale(s, s, rotatedBounds.centerX() / w * borderImageWidth - borderImageWidth / 2f, rotatedBounds.centerY() / h * borderImageHeight - borderImageHeight / 2f); + + bordersPathMeasure.setPath(segmentBorderPath, false); + partSegmentBorderPath.reset(); + + float length = bordersPathMeasure.getLength(); + if (length == 0) { + return; + } + + segmentBorderPaint.setAlpha((int) (0xFF * alpha)); + borderPaint.setAlpha((int) (0x40 * alpha)); + canvas.drawPath(partSegmentBorderPath, borderPaint); + + float toPercent = progress + 0.2f; + float from = length * progress; + float to = length * toPercent; + bordersPathMeasure.getSegment(from, to, partSegmentBorderPath, true); + canvas.drawPath(partSegmentBorderPath, segmentBorderPaint); + canvas.drawPath(partSegmentBorderPath, segmentBorderPaint); + if (toPercent > 1) { + from = 0; + to = (toPercent - 1) * length; + partSegmentBorderPath.reset(); + bordersPathMeasure.setPath(segmentBorderPath, false); + bordersPathMeasure.getSegment(from, to, partSegmentBorderPath, true); + canvas.drawPath(partSegmentBorderPath, segmentBorderPaint); + canvas.drawPath(partSegmentBorderPath, segmentBorderPaint); + } + + if (image != null) { + canvas.save(); + canvas.rotate(orientation); + canvas.scale(1f / w * borderImageWidth, 1f / h * borderImageHeight); + canvas.drawBitmap(image, -sourceBitmap.getWidth() / 2f, -sourceBitmap.getHeight() / 2f, null); + canvas.restore(); + } + canvas.restore(); + } + + public void recycle() { + segmentBorderPath.reset(); + if (image != null) { + image.recycle(); + image = null; + } + if (darkMaskImage != null) { + darkMaskImage.recycle(); + darkMaskImage = null; + } + } + } + + + public void drawSegmentBorderPath(Canvas canvas, ImageReceiver imageReceiver, Matrix matrix, ViewGroup parent) { + segmentBorderAlpha.setParent(parent); + if ((bordersAnimator == null && segmentBorderAlpha.get() <= 0) || parent == null) { + return; + } + + imageReceiverWidth = imageReceiver.getImageWidth(); + imageReceiverHeight = imageReceiver.getImageHeight(); + matrix.invert(imageReceiverMatrix); + + float progress = (bordersAnimatorValueStart + bordersAnimatorValue) % 1.0f; + float alpha = segmentBorderAlpha.set(bordersAnimator == null ? 0f : 1f); + + canvas.drawColor(Theme.multAlpha(0x50000000, alpha)); + if (objects != null) { + for (SegmentedObject object : objects) { + object.drawBorders(canvas, progress, alpha, parent); + } + } + + parent.invalidate(); + } + + public void enableClippingMode(Utilities.Callback onClickListener) { + setOnClickListener(v -> { + if (objects == null || objects.length == 0 || sourceBitmap == null) { + return; + } + + SegmentedObject object = objectBehind(tx, ty); + if (object != null) { + onClickListener.run(object); + } + }); + + actionTextView.animate().cancel(); + actionTextView.animate().alpha(1f).scaleX(1f).scaleY(1f).setDuration(240).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + if (bordersAnimator != null) { + bordersAnimator.cancel(); + } + bordersAnimatorValueStart = bordersAnimatorValue; + bordersAnimator = ValueAnimator.ofFloat(0, 1); + bordersAnimator.addUpdateListener(animation -> { + bordersAnimatorValue = (float) animation.getAnimatedValue(); + }); + bordersAnimator.setRepeatCount(ValueAnimator.INFINITE); + bordersAnimator.setRepeatMode(ValueAnimator.RESTART); + bordersAnimator.setDuration(2400); + bordersAnimator.setInterpolator(new LinearInterpolator()); + bordersAnimator.start(); + } + + float tx, ty; + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + tx = ev.getX(); + ty = ev.getY(); + if (objects != null && bordersAnimator != null) { + SegmentedObject object = objectBehind(tx, ty); + for (int i = 0; i < objects.length; ++i) { + final boolean hover = objects[i] == object && (ev.getAction() != MotionEvent.ACTION_CANCEL && ev.getAction() != MotionEvent.ACTION_UP); + if (hover && !objects[i].hover) { + AndroidUtilities.vibrateCursor(this); + } + objects[i].hover = hover; + } + if (getParent() instanceof View) { + ((View) getParent()).invalidate(); + } + } + return super.dispatchTouchEvent(ev); + } + + public SegmentedObject objectBehind(float tx, float ty) { + float[] p = new float[] { tx, ty }; + imageReceiverMatrix.mapPoints(p); + int w, h; + if (objects[0].orientation / 90 % 2 != 0) { + w = sourceBitmap.getHeight(); + h = sourceBitmap.getWidth(); + } else { + w = sourceBitmap.getWidth(); + h = sourceBitmap.getHeight(); + } + for (int i = 0; i < objects.length; ++i) { + AndroidUtilities.rectTmp.set( + objects[i].rotatedBounds.left / w * imageReceiverWidth, + objects[i].rotatedBounds.top / h * imageReceiverHeight, + objects[i].rotatedBounds.right / w * imageReceiverWidth, + objects[i].rotatedBounds.bottom / h * imageReceiverHeight + ); + AndroidUtilities.rectTmp.offset(-imageReceiverWidth / 2f, -imageReceiverHeight / 2f); + if (AndroidUtilities.rectTmp.contains(p[0], p[1])) { + return objects[i]; + } + } + return null; + } + + public void disableClippingMode() { + segmentBorderAlpha.set(0f); + if (bordersAnimator != null) { + bordersAnimator.cancel(); + bordersAnimator = null; + } + setOnClickListener(null); + setClickable(false); + actionTextView.animate().cancel(); + actionTextView.animate().alpha(0f).scaleX(0.7f).scaleY(0.7f).setDuration(240).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + actionTextView.setTranslationY(getMeasuredWidth() / 2f + dp(10)); + } + + public boolean isSegmentedState() { + return isSegmentedState; + } + + public void setSegmentedState(boolean segmentedState, SegmentedObject selectedObject) { + isSegmentedState = segmentedState; + this.selectedObject = selectedObject; + } + + public Bitmap getSegmentedDarkMaskImage() { + return isSegmentedState && selectedObject != null ? selectedObject.darkMaskImage : null; + } + + public boolean hasSegmentedBitmap() { + return segmentingLoaded && objects != null && objects.length > 0; + } + + public Bitmap getSourceBitmap() { + return sourceBitmap; + } + + public Bitmap getSourceBitmap(boolean hasFilters) { + if (hasFilters && filteredBitmap != null) { + return filteredBitmap; + } + return sourceBitmap; + } + + public Bitmap getSegmentedImage(Bitmap filteredBitmap, boolean hasFilters, int orientation) { + if (selectedObject == null) { + return sourceBitmap; + } + if (hasFilters && filteredBitmap != null) { + return cutSegmentInFilteredBitmap(filteredBitmap, orientation); + } + return selectedObject.image; + } + + @Nullable + public Bitmap getThanosImage(MediaController.PhotoEntry photoEntry, int orientation) { + Bitmap filteredBitmap = photoEntry.filterPath != null ? BitmapFactory.decodeFile(photoEntry.filterPath) : getSourceBitmap(); + Bitmap paintedBitmap = BitmapFactory.decodeFile(photoEntry.paintPath); + + Bitmap result = Bitmap.createBitmap(filteredBitmap.getWidth(), filteredBitmap.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(result); + Paint maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); + canvas.drawBitmap(filteredBitmap, 0, 0, bitmapPaint); + + Rect dstRect = new Rect(); + dstRect.set(0, 0, filteredBitmap.getWidth(), filteredBitmap.getHeight()); + + SegmentedObject object = selectedObject; + if (object == null && objects.length > 0) { + object = objects[0]; + } + if (object == null) + return null; + + if (object.orientation != 0 && photoEntry.isFiltered) { + Matrix matrix = new Matrix(); + matrix.postRotate(object.orientation, object.darkMaskImage.getWidth() / 2f, object.darkMaskImage.getHeight() / 2f); + if (object.orientation / 90 % 2 != 0) { + float dxy = (object.darkMaskImage.getHeight() - object.darkMaskImage.getWidth()) / 2f; + matrix.postTranslate(dxy, -dxy); + } + matrix.postScale(filteredBitmap.getWidth() / (float) object.darkMaskImage.getHeight(), filteredBitmap.getHeight() / (float) object.darkMaskImage.getWidth()); + canvas.drawBitmap(object.darkMaskImage, matrix, maskPaint); + } else { + canvas.drawBitmap(object.darkMaskImage, null, dstRect, maskPaint); + } + + if (paintedBitmap != null) { + maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + if (object.orientation != 0 && !photoEntry.isFiltered) { + Matrix matrix = new Matrix(); + matrix.postRotate(-object.orientation, paintedBitmap.getWidth() / 2f, paintedBitmap.getHeight() / 2f); + if (object.orientation / 90 % 2 != 0) { + float dxy = (paintedBitmap.getHeight() - paintedBitmap.getWidth()) / 2f; + matrix.postTranslate(dxy, -dxy); + } + matrix.postScale(filteredBitmap.getWidth() / (float) paintedBitmap.getHeight(), filteredBitmap.getHeight() / (float) paintedBitmap.getWidth()); + canvas.drawBitmap(paintedBitmap, matrix, maskPaint); + } else { + canvas.drawBitmap(paintedBitmap, null, dstRect, maskPaint); + } + } + return result; + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + float inset = dp(10); + float width = getMeasuredWidth() - inset * 2; + float height = getMeasuredHeight() - inset * 2; + + float rx = width / 8f; + AndroidUtilities.rectTmp.set(inset, inset, inset + width, inset + width); + AndroidUtilities.rectTmp.offset(0, (height - AndroidUtilities.rectTmp.height()) / 2); + areaPath.rewind(); + areaPath.addRoundRect(AndroidUtilities.rectTmp, rx, rx, Path.Direction.CW); + + bgPath.rewind(); + bgPath.addRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), Path.Direction.CW); + + screenPath.reset(); + screenPath.op(bgPath, areaPath, Path.Op.DIFFERENCE); + dashPath.rewind(); + AndroidUtilities.rectTmp.inset(dp(-1f), dp(-1f)); + dashPath.addRoundRect(AndroidUtilities.rectTmp, rx, rx, Path.Direction.CW); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + canvas.drawPath(screenPath, bgPaint); + canvas.drawPath(dashPath, dashPaint); + } + + private Bitmap createSmoothEdgesSegmentedImage(int x, int y, Bitmap inputBitmap) { + Bitmap srcBitmap = getSourceBitmap(); + if (inputBitmap == null || srcBitmap == null) { + return null; + } + Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + Bitmap bluredBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bluredBitmap); + canvas.drawBitmap(inputBitmap, x, y, bitmapPaint); + Utilities.stackBlurBitmap(bluredBitmap, 5); + + Bitmap resultBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.ARGB_8888); + canvas = new Canvas(resultBitmap); + canvas.drawBitmap(srcBitmap, 0, 0, bitmapPaint); + Paint maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); + canvas.drawBitmap(bluredBitmap, 0, 0, maskPaint); + Bitmap segmentedImage = resultBitmap; + bluredBitmap.recycle(); + return segmentedImage; + } + + public void segmentImage(Bitmap source, int orientation, int containerWidth, int containerHeight) { + this.containerWidth = containerWidth; + this.containerHeight = containerHeight; + if (segmentingLoaded) { + return; + } + if (segmentingLoading || source == null) return; + if (Build.VERSION.SDK_INT < 24) return; + SubjectSegmenter segmenter = SubjectSegmentation.getClient( + new SubjectSegmenterOptions.Builder() + .enableMultipleSubjects( + new SubjectSegmenterOptions.SubjectResultOptions.Builder() + .enableSubjectBitmap() + .build() + ) + .build() + ); + segmentingLoading = true; + sourceBitmap = source; + InputImage inputImage = InputImage.fromBitmap(source, orientation); + segmenter.process(inputImage) + .addOnSuccessListener(result -> { + if (sourceBitmap == null) return; + final ArrayList finalObjects = new ArrayList<>(); + Utilities.themeQueue.postRunnable(() -> { + if (sourceBitmap == null) return; + List subjects = result.getSubjects(); + Matrix matrix = new Matrix(); + matrix.postScale(1f / sourceBitmap.getWidth(), 1f / sourceBitmap.getHeight()); + matrix.postTranslate(-.5f, -.5f); + matrix.postRotate(orientation); + matrix.postTranslate(.5f, .5f); + if (orientation / 90 % 2 != 0) { + matrix.postScale(sourceBitmap.getHeight(), sourceBitmap.getWidth()); + } else { + matrix.postScale(sourceBitmap.getWidth(), sourceBitmap.getHeight()); + } + for (int i = 0; i < subjects.size(); ++i) { + Subject subject = subjects.get(i); + SegmentedObject o = new SegmentedObject(); + o.bounds.set(subject.getStartX(), subject.getStartY(), subject.getStartX() + subject.getWidth(), subject.getStartY() + subject.getHeight()); + o.rotatedBounds.set(o.bounds); + matrix.mapRect(o.rotatedBounds); + o.orientation = orientation; + o.image = createSmoothEdgesSegmentedImage(subject.getStartX(), subject.getStartY(), subject.getBitmap()); + if (o.image == null) continue; + + o.darkMaskImage = Bitmap.createBitmap(o.image.getWidth(), o.image.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(o.darkMaskImage); + canvas.drawColor(Color.BLACK); + Paint maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + canvas.drawBitmap(o.image, 0, 0, maskPaint); + + createSegmentImagePath(o, containerWidth, containerHeight); + segmentBorderImageWidth = o.borderImageWidth; + segmentBorderImageHeight = o.borderImageHeight; + + finalObjects.add(o); + } + selectedObject = null; + + segmentingLoaded = true; + segmentingLoading = false; + AndroidUtilities.runOnUIThread(() -> { + objects = finalObjects.toArray(new SegmentedObject[1]); + if (objects.length > 0) { + stickerCutOutBtn.setScaleX(0.3f); + stickerCutOutBtn.setScaleY(0.3f); + stickerCutOutBtn.setAlpha(0f); + stickerCutOutBtn.animate().alpha(1f).scaleX(1f).scaleY(1f).setDuration(250).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); + } + }); + + }); + }) + .addOnFailureListener(error -> { + segmentingLoading = false; + FileLog.e(error); + if (isWaitingMlKitError(error) && isAttachedToWindow()) { + AndroidUtilities.runOnUIThread(() -> segmentImage(source, orientation, containerWidth, containerHeight), 2000); + } else { + segmentingLoaded = true; + } + }); + } + + private void createSegmentImagePath(SegmentedObject object, int containerWidth, int containerHeight) { + int imageWidth = object.image.getWidth(); + int imageHeight = object.image.getHeight(); + int maxImageSize = Math.max(imageWidth, imageHeight); + float scaleFactor = maxImageSize / 256f; + + if (object.orientation / 90 % 2 != 0) { + imageWidth = object.image.getHeight(); + imageHeight = object.image.getWidth(); + } + + Bitmap bitmap = Bitmap.createBitmap((int) (imageWidth / scaleFactor), (int) (imageHeight / scaleFactor), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + RectF rectF = new RectF(); + rectF.set(0, 0, bitmap.getWidth(), bitmap.getHeight()); + if (object.orientation != 0) { + Matrix matrix = new Matrix(); + matrix.postRotate(object.orientation, object.image.getWidth() / 2f, object.image.getHeight() / 2f); + if (object.orientation / 90 % 2 != 0) { + float dxy = (object.image.getHeight() - object.image.getWidth()) / 2f; + matrix.postTranslate(dxy, -dxy); + } + matrix.postScale(rectF.width() / imageWidth, rectF.height() / imageHeight); + canvas.drawBitmap(object.image, matrix, new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG)); + } else { + canvas.drawBitmap(object.image, null, rectF, new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG)); + } + + int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()]; + bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); + + ArrayList leftPoints = new ArrayList<>(); + ArrayList rightPoints = new ArrayList<>(); + Point leftPoint = null; + Point rightPoint = null; + + scaleFactor = containerWidth / (float) bitmap.getWidth(); + for (int i = 0; i < pixels.length; i++) { + int y = i / bitmap.getWidth(); + int x = i - y * bitmap.getWidth(); + + boolean hasColor = pixels[i] != 0; + if (pixels[i] == 0) { + boolean hasLeft = i - 1 >= 0; + boolean hasRight = i + 1 < pixels.length; + if (hasLeft && pixels[i - 1] != 0) { + rightPoint = new Point(x, y, scaleFactor); + } + if (leftPoint == null && hasRight && pixels[i + 1] != 0) { + leftPoint = new Point(x, y, scaleFactor); + } + } + boolean isLastPixelInX = x == bitmap.getWidth() - 1; + boolean isFirstPixelInX = x == 0; + if (isLastPixelInX) { + if (hasColor) { + rightPoint = new Point(x, y, scaleFactor); + } + if (leftPoint != null) leftPoints.add(leftPoint); + if (rightPoint != null) rightPoints.add(rightPoint); + leftPoint = null; + rightPoint = null; + } + if (isFirstPixelInX) { + if (hasColor) { + leftPoint = new Point(x, y, scaleFactor); + } + } + } + + ArrayList topPoints = new ArrayList<>(); + ArrayList bottomPoints = new ArrayList<>(); + Point topPoint = null; + Point bottomPoint = null; + for (int i = 0; i < pixels.length; i++) { + int x = i / bitmap.getHeight(); + int y = i - x * bitmap.getHeight(); + boolean hasColor = pixels[x + y * bitmap.getWidth()] != 0; + if (!hasColor) { + int topPos = x + (y - 1) * bitmap.getWidth(); + int bottomPos = x + (y + 1) * bitmap.getWidth(); + boolean hasTop = topPos >= 0; + boolean hasBottom = bottomPos < pixels.length; + if (hasTop && pixels[topPos] != 0) { + bottomPoint = new Point(x, y, scaleFactor); + } + if (topPoint == null && hasBottom && pixels[bottomPos] != 0) { + topPoint = new Point(x, y, scaleFactor); + } + } + boolean isLastPixelInY = y == bitmap.getHeight() - 1; + boolean isFirstPixelInY = y == 0; + if (isLastPixelInY) { + if (hasColor) { + bottomPoint = new Point(x, y, scaleFactor); + } + if (topPoint != null) topPoints.add(topPoint); + if (bottomPoint != null) bottomPoints.add(bottomPoint); + topPoint = null; + bottomPoint = null; + } + if (isFirstPixelInY) { + if (hasColor) { + topPoint = new Point(x, y, scaleFactor); + } + } + } + + HashSet topBottomPointsSet = new LinkedHashSet<>(); + HashSet leftRightPointsSet = new LinkedHashSet<>(); + Collections.reverse(rightPoints); + Collections.reverse(topPoints); + + leftRightPointsSet.addAll(leftPoints); + leftRightPointsSet.addAll(rightPoints); + + topBottomPointsSet.addAll(bottomPoints); + topBottomPointsSet.addAll(topPoints); + + List topBottomPointsList = new ArrayList<>(topBottomPointsSet); + List leftRightPointsList = new ArrayList<>(leftRightPointsSet); + + Path path1 = new Path(); + for (int i = 0; i < leftRightPointsList.size(); i += 2) { + Point point = leftRightPointsList.get(i); + if (path1.isEmpty()) { + path1.moveTo(point.x, point.y); + } else { + path1.lineTo(point.x, point.y); + } + } + + Path path2 = new Path(); + for (int i = 0; i < topBottomPointsList.size(); i += 2) { + Point point = topBottomPointsList.get(i); + if (path2.isEmpty()) { + path2.moveTo(point.x, point.y); + } else { + path2.lineTo(point.x, point.y); + } + } + + object.segmentBorderPath.reset(); + object.segmentBorderPath.op(path1, path2, Path.Op.INTERSECT); + scaleFactor = Math.min( + containerWidth / (float) imageWidth, + containerHeight / (float) imageHeight + ); + object.borderImageWidth = imageWidth * scaleFactor; + object.borderImageHeight = imageHeight * scaleFactor; + object.segmentBorderPath.offset(-object.borderImageWidth / 2f, -object.borderImageHeight / 2f); + } + + public Bitmap cutSegmentInFilteredBitmap(Bitmap filteredBitmap, int orientation) { + if (selectedObject == null) { + return filteredBitmap; + } + this.filteredBitmap = filteredBitmap; + if (selectedObject.darkMaskImage == null || !isSegmentedState) { + return filteredBitmap; + } + Bitmap result = Bitmap.createBitmap(filteredBitmap.getWidth(), filteredBitmap.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(result); + Paint maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); + maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + canvas.drawBitmap(filteredBitmap, 0, 0, bitmapPaint); + Rect dstRect = new Rect(); + dstRect.set(0, 0, filteredBitmap.getWidth(), filteredBitmap.getHeight()); + if (selectedObject.orientation != 0) { + Matrix matrix = new Matrix(); + matrix.postRotate(selectedObject.orientation, selectedObject.darkMaskImage.getWidth() / 2f, selectedObject.darkMaskImage.getHeight() / 2f); + if (selectedObject.orientation / 90 % 2 != 0) { + float dxy = (selectedObject.image.getHeight() - selectedObject.image.getWidth()) / 2f; + matrix.postTranslate(dxy, -dxy); + } + matrix.postScale(filteredBitmap.getWidth() / (float) selectedObject.darkMaskImage.getHeight(), filteredBitmap.getHeight() / (float) selectedObject.darkMaskImage.getWidth()); + canvas.drawBitmap(selectedObject.darkMaskImage, matrix, maskPaint); + } else { + canvas.drawBitmap(selectedObject.darkMaskImage, null, dstRect, maskPaint); + } + return result; + } + + public void clean() { + if (bordersAnimator != null) { + bordersAnimator.cancel(); + bordersAnimator = null; + } + sourceBitmap = null; + if (objects != null) { + for (int i = 0; i < objects.length; ++i) { + objects[i].recycle(); + } + objects = null; + } + segmentingLoaded = false; + segmentingLoading = false; + isSegmentedState = false; + actionTextView.setAlpha(0f); + actionTextView.setScaleX(0.3f); + actionTextView.setScaleY(0.3f); + } + + public static boolean isWaitingMlKitError(Exception e) { + return e instanceof MlKitException && e.getMessage() != null && e.getMessage().contains("segmentation optional module to be downloaded"); + } + + public void setCurrentAccount(int account) { + if (currentAccount != account) { + if (currentAccount >= 0) { + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileUploaded); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileUploadFailed); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.filePreparingFailed); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.filePreparingStarted); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileNewChunkAvailable); + } + + currentAccount = account; + + if (currentAccount >= 0) { + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileUploaded); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileUploadFailed); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.filePreparingFailed); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.filePreparingStarted); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileNewChunkAvailable); + } + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (currentAccount >= 0) { + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileUploaded); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileUploadFailed); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.filePreparingFailed); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.filePreparingStarted); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileNewChunkAvailable); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileUploaded); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileUploadFailed); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.filePreparingFailed); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.filePreparingStarted); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileNewChunkAvailable); + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.fileUploaded) { + final String location = (String) args[0]; + final TLRPC.InputFile file = (TLRPC.InputFile) args[1]; + if (stickerUploader != null && location.equalsIgnoreCase(stickerUploader.finalPath)) { + stickerUploader.file = file; + uploadMedia(); + } + } else if (id == NotificationCenter.fileUploadFailed) { + String location = (String) args[0]; + if (stickerUploader != null && location.equalsIgnoreCase(stickerUploader.finalPath)) { + hideLoadingDialog(); + } + } else if (id == NotificationCenter.filePreparingStarted) { + if (stickerUploader == null) return; + if (args[0] == stickerUploader.messageObject) { + FileLoader.getInstance(UserConfig.selectedAccount).uploadFile(stickerUploader.finalPath, false, true, ConnectionsManager.FileTypeFile); + } + } else if (id == NotificationCenter.fileNewChunkAvailable) { + if (stickerUploader == null) return; + if (args[0] == stickerUploader.messageObject) { + String finalPath = (String) args[1]; + long availableSize = (Long) args[2]; + long finalSize = (Long) args[3]; + float convertingProgress = (float) args[4]; +// progress = convertingProgress * .3f + uploadProgress * .7f; +// NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.uploadStoryProgress, path, progress); + +// if (firstSecondSize < 0 && convertingProgress * duration >= 1000) { +// firstSecondSize = availableSize; +// } + + FileLoader.getInstance(currentAccount).checkUploadNewDataAvailable(finalPath, false, Math.max(1, availableSize), finalSize, convertingProgress); + +// if (finalSize > 0) { +// if (firstSecondSize < 0) { +// firstSecondSize = finalSize; +// } +// ready = true; +// } + } + } else if (id == NotificationCenter.filePreparingFailed) { + if (stickerUploader == null) return; + if (args[0] == stickerUploader.messageObject) { + hideLoadingDialog(); + } + } + } + + public void uploadStickerFile(String path, VideoEditedInfo videoEditedInfo, String emoji, CharSequence stickerPackName, boolean addToFavorite, TLRPC.StickerSet stickerSet, TLRPC.Document replacedSticker) { + AndroidUtilities.runOnUIThread(() -> { + stickerUploader = new StickerUploader(); + stickerUploader.emoji = emoji; + stickerUploader.path = stickerUploader.finalPath = path; + stickerUploader.stickerPackName = stickerPackName; + stickerUploader.addToFavorite = addToFavorite; + stickerUploader.stickerSet = stickerSet; + stickerUploader.replacedSticker = replacedSticker; + stickerUploader.videoEditedInfo = videoEditedInfo; + if (videoEditedInfo != null) { + TLRPC.TL_message message = new TLRPC.TL_message(); + message.id = 1; + stickerUploader.finalPath = message.attachPath = StoryEntry.makeCacheFile(UserConfig.selectedAccount, "webm").getAbsolutePath(); + stickerUploader.messageObject = new MessageObject(UserConfig.selectedAccount, message, (MessageObject) null, false, false); + stickerUploader.messageObject.videoEditedInfo = videoEditedInfo; + MediaController.getInstance().scheduleVideoConvert(stickerUploader.messageObject, false, false); + } else { + FileLoader.getInstance(UserConfig.selectedAccount).uploadFile(path, false, true, ConnectionsManager.FileTypeFile); + } + showLoadingDialog(); + }, 300); + } + + private void showLoadingDialog() { + loadingDialog = new AlertDialog(getContext(), AlertDialog.ALERT_TYPE_SPINNER, new DarkThemeResourceProvider()); + loadingDialog.show(); + } + + private void hideLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + loadingDialog = null; + } + } + + private void uploadMedia() { + TLRPC.TL_messages_uploadMedia req = new TLRPC.TL_messages_uploadMedia(); + req.peer = new TLRPC.TL_inputPeerSelf(); + req.media = new TLRPC.TL_inputMediaUploadedDocument(); + req.media.file = stickerUploader.file; + if (stickerUploader.videoEditedInfo != null) { + req.media.mime_type = "video/webm"; + } else { + req.media.mime_type = "image/webp"; + } + TLRPC.TL_documentAttributeSticker attr = new TLRPC.TL_documentAttributeSticker(); + attr.alt = stickerUploader.emoji; + attr.stickerset = new TLRPC.TL_inputStickerSetEmpty(); + req.media.attributes.add(attr); + ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messageMediaDocument) { + TLRPC.TL_messageMediaDocument mediaDocument = (TLRPC.TL_messageMediaDocument) response; + stickerUploader.tlInputStickerSetItem = MediaDataController.getInputStickerSetItem(mediaDocument.document, stickerUploader.emoji); + stickerUploader.mediaDocument = mediaDocument; + afterUploadingMedia(); + } else { + hideLoadingDialog(); + showError(error); + } + }), ConnectionsManager.RequestFlagFailOnServerErrors); + } + + private void showError(TLRPC.TL_error error) { + if (error != null) { + BulletinFactory.of((FrameLayout) getParent(), resourcesProvider).createErrorBulletin(error.text).show(); + } + } + + private void afterUploadingMedia() { + final int currentAccount = UserConfig.selectedAccount; + if (stickerUploader.replacedSticker != null) { + TLRPC.TL_stickers_replaceSticker req = new TLRPC.TL_stickers_replaceSticker(); + req.sticker = MediaDataController.getInputStickerSetItem(stickerUploader.replacedSticker, "").document; + req.new_sticker = stickerUploader.tlInputStickerSetItem; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messages_stickerSet) { + MediaDataController.getInstance(currentAccount).toggleStickerSet(null, response, 2, null, false, false); + AndroidUtilities.runOnUIThread(() -> NotificationCenter.getInstance(UserConfig.selectedAccount).postNotificationNameOnUIThread(NotificationCenter.customStickerCreated, false, response, stickerUploader.mediaDocument.document), 250); + } + showError(error); + hideLoadingDialog(); + })); + } else if (stickerUploader.stickerPackName != null) { + TLRPC.TL_stickers_createStickerSet req = new TLRPC.TL_stickers_createStickerSet(); + req.user_id = new TLRPC.TL_inputUserSelf(); + req.title = stickerUploader.stickerPackName.toString(); + req.short_name = ""; + req.stickers.add(stickerUploader.tlInputStickerSetItem); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messages_stickerSet) { + MediaDataController.getInstance(currentAccount).toggleStickerSet(null, response, 2, null, false, false); + AndroidUtilities.runOnUIThread(() -> NotificationCenter.getInstance(UserConfig.selectedAccount).postNotificationNameOnUIThread(NotificationCenter.customStickerCreated, false, response, stickerUploader.mediaDocument.document), 250); + } + showError(error); + hideLoadingDialog(); + })); + } else if (stickerUploader.addToFavorite) { + hideLoadingDialog(); + NotificationCenter.getInstance(currentAccount).postNotificationNameOnUIThread(NotificationCenter.customStickerCreated, false); + AndroidUtilities.runOnUIThread(() -> MediaDataController.getInstance(UserConfig.selectedAccount).addRecentSticker(MediaDataController.TYPE_FAVE, null, stickerUploader.mediaDocument.document, (int) (System.currentTimeMillis() / 1000), false), 350); + } else if (stickerUploader.stickerSet != null) { + TLRPC.TL_stickers_addStickerToSet req = new TLRPC.TL_stickers_addStickerToSet(); + req.stickerset = MediaDataController.getInputStickerSet(stickerUploader.stickerSet); + req.sticker = stickerUploader.tlInputStickerSetItem; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messages_stickerSet) { + MediaDataController.getInstance(currentAccount).toggleStickerSet(null, response, 2, null, false, false); + AndroidUtilities.runOnUIThread(() -> NotificationCenter.getInstance(UserConfig.selectedAccount).postNotificationNameOnUIThread(NotificationCenter.customStickerCreated, false, response, stickerUploader.mediaDocument.document), 250); + } + showError(error); + hideLoadingDialog(); + })); + } + } + + private static class StickerUploader { + public String path; + public String finalPath; + public String emoji; + public CharSequence stickerPackName; + public TLRPC.TL_inputStickerSetItem tlInputStickerSetItem; + public TLRPC.TL_messageMediaDocument mediaDocument; + public TLRPC.InputFile file; + public boolean addToFavorite; + public TLRPC.StickerSet stickerSet; + public TLRPC.Document replacedSticker; + + public MessageObject messageObject; + public VideoEditedInfo videoEditedInfo; + } + + private static class Point extends android.graphics.Point { + + public Point(int x, int y) { + super(x, y); + } + + public Point(int x, int y, float scale) { + super((int) (x * scale), (int) (y * scale)); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PaintingOverlay.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PaintingOverlay.java index 163a8d27f..7be320ebe 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PaintingOverlay.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PaintingOverlay.java @@ -47,8 +47,8 @@ public class PaintingOverlay extends FrameLayout { super(context); } - public void setData(String paintPath, ArrayList entities, boolean isVideo, boolean startAfterSet) { - setEntities(entities, isVideo, startAfterSet); + public void setData(String paintPath, ArrayList entities, boolean isVideo, boolean startAfterSet, boolean clip) { + setEntities(entities, isVideo, startAfterSet, clip); if (paintPath != null) { paintBitmap = BitmapFactory.decodeFile(paintPath); setBackground(backgroundDrawable = new BitmapDrawable(paintBitmap)); @@ -159,7 +159,8 @@ public class PaintingOverlay extends FrameLayout { setBackground(null); } - public void setEntities(ArrayList entities, boolean isVideo, boolean startAfterSet) { + public void setEntities(ArrayList entities, boolean isVideo, boolean startAfterSet, boolean clip) { + setClipChildren(clip); reset(); mediaEntityViews = new HashMap<>(); if (entities != null && !entities.isEmpty()) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java index 9f8a8ed17..c1dc97a7b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java @@ -49,10 +49,15 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.IdRes; +import androidx.annotation.NonNull; +import androidx.biometric.BiometricManager; +import androidx.biometric.BiometricPrompt; +import androidx.core.content.ContextCompat; import androidx.core.os.CancellationSignal; import androidx.dynamicanimation.animation.FloatValueHolder; import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; +import androidx.fragment.app.FragmentActivity; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; @@ -62,6 +67,8 @@ import org.telegram.messenger.LocaleController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; +import org.telegram.messenger.UserObject; +import org.telegram.messenger.Utilities; import org.telegram.messenger.support.fingerprint.FingerprintManagerCompat; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.Theme; @@ -72,6 +79,7 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Locale; +import java.util.concurrent.Executor; public class PasscodeView extends FrameLayout implements NotificationCenter.NotificationCenterDelegate { private final static float BACKGROUND_SPRING_STIFFNESS = 300f; @@ -86,10 +94,6 @@ public class PasscodeView extends FrameLayout implements NotificationCenter.Noti } else if (id == NotificationCenter.passcodeDismissed) { if (args[0] != this) { setVisibility(GONE); - - if (fingerprintDialog != null) { - fingerprintDialog.dismiss(); - } } } } @@ -437,12 +441,6 @@ public class PasscodeView extends FrameLayout implements NotificationCenter.Noti private ImageView fingerprintImage; private int keyboardHeight = 0; - private CancellationSignal cancellationSignal; - private ImageView fingerprintImageView; - private TextView fingerprintStatusTextView; - private boolean selfCancelled; - private AlertDialog fingerprintDialog; - private int imageY; private RLottieImageView imageView; @@ -1091,24 +1089,6 @@ public class PasscodeView extends FrameLayout implements NotificationCenter.Noti public void onPause() { AndroidUtilities.cancelRunOnUIThread(checkRunnable); - if (fingerprintDialog != null) { - try { - if (fingerprintDialog.isShowing()) { - fingerprintDialog.dismiss(); - } - fingerprintDialog = null; - } catch (Exception e) { - FileLog.e(e); - } - } - try { - if (Build.VERSION.SDK_INT >= 23 && cancellationSignal != null) { - cancellationSignal.cancel(); - cancellationSignal = null; - } - } catch (Exception e) { - FileLog.e(e); - } } @Override @@ -1134,115 +1114,31 @@ public class PasscodeView extends FrameLayout implements NotificationCenter.Noti Activity parentActivity = (Activity) getContext(); if (parentActivity != null && fingerprintView.getVisibility() == VISIBLE && !ApplicationLoader.mainInterfacePaused && (!(parentActivity instanceof LaunchActivity) || ((LaunchActivity) parentActivity).allowShowFingerprintDialog(this))) { try { - if (fingerprintDialog != null && fingerprintDialog.isShowing()) { - return; - } - } catch (Exception e) { - FileLog.e(e); - } - try { - FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(ApplicationLoader.applicationContext); - if (fingerprintManager.isHardwareDetected() && fingerprintManager.hasEnrolledFingerprints() && FingerprintController.isKeyReady() && !FingerprintController.checkDeviceFingerprintsChanged()) { - RelativeLayout relativeLayout = new RelativeLayout(getContext()); - relativeLayout.setPadding(AndroidUtilities.dp(24), 0, AndroidUtilities.dp(24), 0); - - TextView fingerprintTextView = new TextView(getContext()); - fingerprintTextView.setId(id_fingerprint_textview); - fingerprintTextView.setTextAppearance(android.R.style.TextAppearance_Material_Subhead); - fingerprintTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); - fingerprintTextView.setText(LocaleController.getString("FingerprintInfo", R.string.FingerprintInfo)); - relativeLayout.addView(fingerprintTextView); - RelativeLayout.LayoutParams layoutParams = LayoutHelper.createRelative(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT); - layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); - layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START); - fingerprintTextView.setLayoutParams(layoutParams); - - fingerprintImageView = new ImageView(getContext()); - fingerprintImageView.setImageResource(R.drawable.ic_fp_40px); - fingerprintImageView.setId(id_fingerprint_imageview); - relativeLayout.addView(fingerprintImageView, LayoutHelper.createRelative(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, 20, 0, 0, RelativeLayout.ALIGN_PARENT_START, RelativeLayout.BELOW, id_fingerprint_textview)); - - fingerprintStatusTextView = new TextView(getContext()); - fingerprintStatusTextView.setGravity(Gravity.CENTER_VERTICAL); - fingerprintStatusTextView.setText(LocaleController.getString("FingerprintHelp", R.string.FingerprintHelp)); - fingerprintStatusTextView.setTextAppearance(android.R.style.TextAppearance_Material_Body1); - fingerprintStatusTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack) & 0x42ffffff); - relativeLayout.addView(fingerprintStatusTextView); - layoutParams = LayoutHelper.createRelative(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT); - layoutParams.setMarginStart(AndroidUtilities.dp(16)); - layoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, id_fingerprint_imageview); - layoutParams.addRule(RelativeLayout.ALIGN_TOP, id_fingerprint_imageview); - layoutParams.addRule(RelativeLayout.END_OF, id_fingerprint_imageview); - fingerprintStatusTextView.setLayoutParams(layoutParams); - - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setView(relativeLayout); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - builder.setOnDismissListener(dialog -> { - if (cancellationSignal != null) { - selfCancelled = true; - try { - cancellationSignal.cancel(); - } catch (Exception e) { - FileLog.e(e); - } - cancellationSignal = null; - } - }); - if (fingerprintDialog != null) { - try { - if (fingerprintDialog.isShowing()) { - fingerprintDialog.dismiss(); - } - } catch (Exception e) { - FileLog.e(e); - } - } - fingerprintDialog = builder.show(); - - cancellationSignal = new CancellationSignal(); - selfCancelled = false; - fingerprintManager.authenticate(null, 0, cancellationSignal, new FingerprintManagerCompat.AuthenticationCallback() { + if (BiometricManager.from(getContext()).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG) == BiometricManager.BIOMETRIC_SUCCESS && FingerprintController.isKeyReady() && !FingerprintController.checkDeviceFingerprintsChanged()) { + final Executor executor = ContextCompat.getMainExecutor(getContext()); + BiometricPrompt prompt = new BiometricPrompt(LaunchActivity.instance, executor, new BiometricPrompt.AuthenticationCallback() { @Override - public void onAuthenticationError(int errMsgId, CharSequence errString) { - if (errMsgId == 10) { - try { - if (fingerprintDialog.isShowing()) { - fingerprintDialog.dismiss(); - } - } catch (Exception e) { - FileLog.e(e); - } - fingerprintDialog = null; - } else if (!selfCancelled && errMsgId != 5) { - showFingerprintError(errString); - } + public void onAuthenticationError(int errMsgId, @NonNull CharSequence errString) { + FileLog.d("PasscodeView onAuthenticationError " + errMsgId + " \"" + errString + "\""); } @Override - public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { - showFingerprintError(helpString); + public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) { + FileLog.d("PasscodeView onAuthenticationSucceeded"); + processDone(true); } @Override public void onAuthenticationFailed() { - showFingerprintError(LocaleController.getString("FingerprintNotRecognized", R.string.FingerprintNotRecognized)); + FileLog.d("PasscodeView onAuthenticationFailed"); } - - @Override - public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) { - try { - if (fingerprintDialog.isShowing()) { - fingerprintDialog.dismiss(); - } - } catch (Exception e) { - FileLog.e(e); - } - fingerprintDialog = null; - processDone(true); - } - }, null); + }); + final BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder() + .setTitle(LocaleController.getString("AppName", R.string.AppName)) + .setNegativeButtonText(LocaleController.getString(R.string.Back)) + .setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_STRONG) + .build(); + prompt.authenticate(promptInfo); } } catch (Throwable e) { //ignore @@ -1257,13 +1153,6 @@ public class PasscodeView extends FrameLayout implements NotificationCenter.Noti private void checkFingerprintButton() { Activity parentActivity = (Activity) getContext(); if (Build.VERSION.SDK_INT >= 23 && parentActivity != null && SharedConfig.useFingerprint) { - try { - if (fingerprintDialog != null && fingerprintDialog.isShowing()) { - return; - } - } catch (Exception e) { - FileLog.e(e); - } try { FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(ApplicationLoader.applicationContext); if (fingerprintManager.isHardwareDetected() && fingerprintManager.hasEnrolledFingerprints() && FingerprintController.isKeyReady() && !FingerprintController.checkDeviceFingerprintsChanged()) { @@ -1519,16 +1408,16 @@ public class PasscodeView extends FrameLayout implements NotificationCenter.Noti setOnTouchListener((v, event) -> true); } - private void showFingerprintError(CharSequence error) { - fingerprintImageView.setImageResource(R.drawable.ic_fingerprint_error); - fingerprintStatusTextView.setText(error); - fingerprintStatusTextView.setTextColor(0xfff4511e); - Vibrator v = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE); - if (v != null) { - v.vibrate(200); - } - AndroidUtilities.shakeView(fingerprintStatusTextView); - } +// private void showFingerprintError(CharSequence error) { +// fingerprintImageView.setImageResource(R.drawable.ic_fingerprint_error); +// fingerprintStatusTextView.setText(error); +// fingerprintStatusTextView.setTextColor(0xfff4511e); +// Vibrator v = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE); +// if (v != null) { +// v.vibrate(200); +// } +// AndroidUtilities.shakeView(fingerprintStatusTextView); +// } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java index 789ccee99..530def37b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java @@ -12,11 +12,13 @@ import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; import android.graphics.Shader; import android.graphics.SurfaceTexture; import android.graphics.drawable.Drawable; @@ -134,6 +136,10 @@ public class PhotoFilterView extends FrameLayout implements FilterShaders.Filter private ImageView curveItem; private Bitmap bitmapToEdit; + private Bitmap bitmapMask; + private final Rect maskRect = new Rect(); + private final Matrix maskMatrix = new Matrix(); + private final Paint maskPaint = new Paint(Paint.FILTER_BITMAP_FLAG); private int orientation; private final Theme.ResourcesProvider resourcesProvider; @@ -317,6 +323,10 @@ public class PhotoFilterView extends FrameLayout implements FilterShaders.Filter } public PhotoFilterView(Context context, VideoEditTextureView videoTextureView, Bitmap bitmap, int rotation, MediaController.SavedFilterState state, PaintingOverlay overlay, int hasFaces, boolean mirror, boolean ownLayout, BlurringShader.BlurManager blurManager, Theme.ResourcesProvider resourcesProvider) { + this(context, videoTextureView, bitmap, null, rotation, state, overlay, hasFaces, mirror, ownLayout, blurManager, resourcesProvider); + } + + public PhotoFilterView(Context context, VideoEditTextureView videoTextureView, Bitmap bitmap, Bitmap mask, int rotation, MediaController.SavedFilterState state, PaintingOverlay overlay, int hasFaces, boolean mirror, boolean ownLayout, BlurringShader.BlurManager blurManager, Theme.ResourcesProvider resourcesProvider) { super(context); this.ownLayout = ownLayout; this.resourcesProvider = resourcesProvider; @@ -384,6 +394,7 @@ public class PhotoFilterView extends FrameLayout implements FilterShaders.Filter filtersEmpty = true; } bitmapToEdit = bitmap; + bitmapMask = mask; orientation = rotation; if (videoTextureView != null) { @@ -1007,6 +1018,19 @@ public class PhotoFilterView extends FrameLayout implements FilterShaders.Filter if (paintingOverlay != null && child == textureView) { canvas.save(); canvas.translate(textureView.getLeft(), textureView.getTop()); + if (bitmapMask != null && textureView.getVisibility() == View.VISIBLE) { + maskRect.set(0, 0, textureView.getMeasuredWidth(), textureView.getMeasuredHeight()); + if (orientation != 0) { + maskMatrix.reset(); + maskMatrix.postRotate(orientation, bitmapMask.getWidth() / 2f, bitmapMask.getHeight() / 2f); + float dxy = (bitmapMask.getHeight() - bitmapMask.getWidth()) / 2f; + maskMatrix.postTranslate(dxy, -dxy); + maskMatrix.postScale(maskRect.width() / (float) bitmapMask.getHeight(), maskRect.height() / (float) bitmapMask.getWidth()); + canvas.drawBitmap(bitmapMask, maskMatrix, maskPaint); + } else { + canvas.drawBitmap(bitmapMask, null, maskRect, maskPaint); + } + } float scale = textureView.getMeasuredWidth() / (float) paintingOverlay.getMeasuredWidth(); canvas.scale(scale, scale); paintingOverlay.draw(canvas); @@ -1438,9 +1462,7 @@ public class PhotoFilterView extends FrameLayout implements FilterShaders.Filter } catch (Exception ignore) {} lastVibrateValue = newValue; } else if (Math.abs(newValueInt - lastVibrateValueInt) > (SharedConfig.getDevicePerformanceClass() == SharedConfig.PERFORMANCE_CLASS_HIGH ? 5 : 10)) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(this); lastVibrateValue = newValue; } filterView.setEnhanceValue(newValue); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/DoubledLimitsBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/DoubledLimitsBottomSheet.java index 23e8eff5c..e8a0300d7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/DoubledLimitsBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/DoubledLimitsBottomSheet.java @@ -155,7 +155,7 @@ public class DoubledLimitsBottomSheet extends BottomSheetWithRecyclerListView im } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { adapter = new Adapter(currentAccount, false, resourcesProvider); adapter.containerView = containerView; return adapter; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/FeaturesPageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/FeaturesPageView.java index a177c553e..34beeaa62 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/FeaturesPageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/FeaturesPageView.java @@ -25,7 +25,6 @@ import androidx.core.graphics.ColorUtils; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.BuildVars; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.R; @@ -137,10 +136,20 @@ public class FeaturesPageView extends BaseListPageView { PremiumPreviewFragment.PREMIUM_FEATURE_BUSINESS_AWAY_MESSAGES )); itemsTmp.add(new Item(VIEW_TYPE_ITEM, R.drawable.menu_premium_chatbot, - LocaleController.getString(R.string.PremiumBusinessChatbots), + LocaleController.getString(R.string.PremiumBusinessChatbots2), LocaleController.getString(R.string.PremiumBusinessChatbotsDescription), PremiumPreviewFragment.PREMIUM_FEATURE_BUSINESS_CHATBOTS )); + itemsTmp.add(new Item(VIEW_TYPE_ITEM, R.drawable.menu_feature_intro, + LocaleController.getString(R.string.PremiumBusinessIntro), + LocaleController.getString(R.string.PremiumBusinessIntroDescription), + PremiumPreviewFragment.PREMIUM_FEATURE_BUSINESS_INTRO + )); + itemsTmp.add(new Item(VIEW_TYPE_ITEM, R.drawable.menu_premium_chatlink, + LocaleController.getString(R.string.PremiumBusinessChatLinks), + LocaleController.getString(R.string.PremiumBusinessChatLinksDescription), + PremiumPreviewFragment.PREMIUM_FEATURE_BUSINESS_CHAT_LINKS + )); } if (order != null) { final SparseIntArray finalOrder = order; @@ -268,7 +277,7 @@ public class FeaturesPageView extends BaseListPageView { TextView textView = new TextView(context); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); textView.setText(LocaleController.getString("UpgradedStories", R.string.UpgradedStories)); addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 111, 0, 0)); @@ -342,14 +351,14 @@ public class FeaturesPageView extends BaseListPageView { textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); textView.setText(LocaleController.getString(R.string.TelegramBusiness)); textView.setGravity(Gravity.CENTER); - addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 150, 0, 0)); + addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 33, 150, 33, 0)); textView = new TextView(context); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider)); textView.setText(LocaleController.getString(R.string.TelegramBusinessSubtitle2)); textView.setGravity(Gravity.CENTER); - addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 183, 0, 20)); + addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 33, 183, 33, 20)); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GiftPremiumBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GiftPremiumBottomSheet.java index 3b64852b5..9c0d7108b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GiftPremiumBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/GiftPremiumBottomSheet.java @@ -368,7 +368,7 @@ public class GiftPremiumBottomSheet extends BottomSheetWithRecyclerListView impl } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return new RecyclerListView.SelectionAdapter() { private final static int VIEW_TYPE_HEADER = 0, VIEW_TYPE_TIER = 1, diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitReachedBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitReachedBottomSheet.java index 81e5b07b0..87c8a2028 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitReachedBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/LimitReachedBottomSheet.java @@ -16,6 +16,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.os.Build; +import android.text.Layout; import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; @@ -43,6 +44,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BotWebViewVibrationEffect; import org.telegram.messenger.ChannelBoostsController; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ContactsController; @@ -70,8 +72,10 @@ import org.telegram.ui.ChannelColorActivity; import org.telegram.ui.ChatActivity; import org.telegram.ui.ChatEditActivity; import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.AvatarsImageView; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.BottomSheetWithRecyclerListView; +import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.ColoredImageSpan; import org.telegram.ui.Components.CubicBezierInterpolator; @@ -139,9 +143,10 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp public static final int TYPE_BOOSTS_FOR_REPLY_ICON = 26; public static final int TYPE_BOOSTS_FOR_PROFILE_ICON = 27; public static final int TYPE_BOOSTS_FOR_CUSTOM_EMOJI_PACK = 29; - public static final int TYPE_FEATURES = 30; - public static final int TYPE_BOOSTS_FOR_REMOVE_RESTRICTIONS = 31; - public static final int TYPE_PIN_SAVED_DIALOGS = 28; + public static final int TYPE_BOOSTS_FOR_ADS = 30; + public static final int TYPE_FEATURES = 31; + public static final int TYPE_BOOSTS_FOR_REMOVE_RESTRICTIONS = 32; + public static final int TYPE_PIN_SAVED_DIALOGS = 33; private boolean canSendLink; private int linkRow = -1; @@ -203,6 +208,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp public final String countValue; public final String textKeyPlural; public final int countPlural; + public boolean incremental; private BoostFeature( int iconResId, @@ -234,6 +240,9 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp if (that == null) { return false; } + if (incremental && countPlural > 2) { + return true; + } return ( this.iconResId == that.iconResId && this.textKey == that.textKey && @@ -243,6 +252,11 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp ); } + public BoostFeature asIncremental() { + incremental = true; + return this; + } + public static boolean arraysEqual(ArrayList a, ArrayList b) { if (a == null && b == null) return true; if (a != null && b == null || a == null && b != null) return false; @@ -277,6 +291,8 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp private ArrayList inactiveChats = new ArrayList<>(); private ArrayList inactiveChatsSignatures = new ArrayList<>(); private ArrayList restrictedUsers = new ArrayList<>(); + private ArrayList premiumMessagingBlockedUsers = new ArrayList<>(); + private ArrayList premiumInviteBlockedUsers = new ArrayList<>(); PremiumButtonView premiumButtonView; TextView actionBtn; @@ -324,6 +340,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp type == TYPE_BOOSTS_FOR_REACTIONS || type == TYPE_BOOSTS_FOR_REPLY_ICON || type == TYPE_BOOSTS_FOR_PROFILE_ICON || + type == TYPE_BOOSTS_FOR_ADS || type == TYPE_FEATURES ) { ((ViewGroup) premiumButtonView.getParent()).removeView(premiumButtonView); @@ -401,6 +418,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp super.invalidate(); } }; + ScaleStateListAnimator.apply(premiumButtonView, .02f, 1.2f); if (!hasFixedSize && !( type == TYPE_BOOSTS_FOR_POSTING || @@ -412,7 +430,8 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp type == TYPE_BOOSTS_FOR_CUSTOM_WALLPAPER || type == TYPE_BOOSTS_FOR_REACTIONS || type == TYPE_BOOSTS_FOR_REPLY_ICON || - type == TYPE_BOOSTS_FOR_PROFILE_ICON + type == TYPE_BOOSTS_FOR_PROFILE_ICON || + type == TYPE_BOOSTS_FOR_ADS )) { divider = new View(context) { @Override @@ -430,7 +449,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp divider.setBackgroundColor(Theme.getColor(Theme.key_dialogBackground, resourcesProvider)); containerView.addView(divider, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 72, Gravity.BOTTOM, 0, 0, 0, 0)); } - containerView.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM, 16, 0, 16, 12)); + containerView.addView(premiumButtonView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM, 16 + backgroundPaddingLeft / AndroidUtilities.density, 0, 16 + backgroundPaddingLeft / AndroidUtilities.density, 12)); recyclerListView.setPadding(0, 0, 0, AndroidUtilities.dp(72)); recyclerListView.setOnItemClickListener((view, position) -> { if (view instanceof AdminedChannelCell) { @@ -449,6 +468,14 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp } GroupCreateUserCell cell = (GroupCreateUserCell) view; Object object = cell.getObject(); + if (cell.isBlocked()) { + long dialogId; + if (object instanceof TLRPC.User) { + dialogId = ((TLRPC.User) object).id; + } else return; + showPremiumBlockedToast(cell, dialogId); + return; + } if (selectedChats.contains(object)) { selectedChats.remove(object); } else { @@ -581,7 +608,8 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp type == TYPE_BOOSTS_FOR_CUSTOM_WALLPAPER || type == TYPE_BOOSTS_FOR_REACTIONS || type == TYPE_BOOSTS_FOR_REPLY_ICON || - type == TYPE_BOOSTS_FOR_PROFILE_ICON + type == TYPE_BOOSTS_FOR_PROFILE_ICON || + type == TYPE_BOOSTS_FOR_ADS ) { AndroidUtilities.addToClipboard(getBoostLink()); dismiss(); @@ -648,6 +676,33 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp (boostsStatus.next_level_boosts - boostsStatus.current_level_boosts)); } + private int shiftDp = -4; + private void showPremiumBlockedToast(View view, long dialogId) { + AndroidUtilities.shakeViewSpring(view, shiftDp = -shiftDp); + BotWebViewVibrationEffect.APP_ERROR.vibrate(); + String username = ""; + if (dialogId >= 0) { + username = UserObject.getForcedFirstName(MessagesController.getInstance(currentAccount).getUser(dialogId)); + } + Bulletin bulletin; + if (MessagesController.getInstance(currentAccount).premiumFeaturesBlocked()) { + bulletin = BulletinFactory.of((FrameLayout) containerView, resourcesProvider).createSimpleBulletin(R.raw.star_premium_2, AndroidUtilities.replaceTags(LocaleController.formatString(R.string.UserBlockedNonPremium, username))); + } else { + bulletin = BulletinFactory.of((FrameLayout) containerView, resourcesProvider) + .createSimpleBulletin(R.raw.star_premium_2, AndroidUtilities.replaceTags(LocaleController.formatString(R.string.UserBlockedNonPremium, username)), LocaleController.getString(R.string.UserBlockedNonPremiumButton), () -> { + BaseFragment lastFragment = LaunchActivity.getLastFragment(); + if (lastFragment == null) { + return; + } + BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams(); + params.transitionFromLeft = true; + params.allowNestedScroll = false; + parentFragment.showAsSheet(new PremiumPreviewFragment("noncontacts"), params); + }); + } + bulletin.show(); + } + private void boostChannel(Loadable button) { boostChannel(button, false); } @@ -817,7 +872,8 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp type == TYPE_BOOSTS_FOR_CUSTOM_WALLPAPER || type == TYPE_BOOSTS_FOR_REACTIONS || type == TYPE_BOOSTS_FOR_REPLY_ICON || - type == TYPE_BOOSTS_FOR_PROFILE_ICON + type == TYPE_BOOSTS_FOR_PROFILE_ICON || + type == TYPE_BOOSTS_FOR_ADS ) { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("d "); spannableStringBuilder.setSpan(new ColoredImageSpan(R.drawable.msg_copy_filled), 0, 1, 0); @@ -970,6 +1026,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp case TYPE_BOOSTS_FOR_REMOVE_RESTRICTIONS: return LocaleController.getString(R.string.BoostGroup); case TYPE_BOOSTS_FOR_USERS: + case TYPE_BOOSTS_FOR_ADS: return LocaleController.getString(isGroup() ? R.string.BoostGroup : R.string.BoostChannel); case TYPE_BOOSTS_FOR_POSTING: case TYPE_BOOSTS_FOR_COLOR: @@ -983,7 +1040,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp case TYPE_BOOSTS_FOR_PROFILE_COLOR: return LocaleController.getString(R.string.UnlockBoostChannelFeatures); case TYPE_ADD_MEMBERS_RESTRICTED: - return LocaleController.getString(R.string.ChannelInviteViaLink); + return LocaleController.getString(R.string.ChannelInviteViaLink2); default: return LocaleController.getString(R.string.LimitReached); } @@ -1137,7 +1194,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp private static final int VIEW_TYPE_BOOST_FEATURE = 9; @Override - public RecyclerListView.SelectionAdapter createAdapter() { + public RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return new RecyclerListView.SelectionAdapter() { @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { @@ -1276,6 +1333,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp break; case VIEW_TYPE_USER: view = new GroupCreateUserCell(context, 1, 0, false); + view.setPadding(backgroundPaddingLeft, 0, backgroundPaddingLeft, 0); break; case VIEW_TYPE_PROGRESS: FlickerLoadingView flickerLoadingView = new FlickerLoadingView(context, null); @@ -1310,7 +1368,14 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp cell.setChecked(selectedChats.contains(chat), false); } else if (type == TYPE_ADD_MEMBERS_RESTRICTED) { TLRPC.User user = restrictedUsers.get(position - chatStartRow); - String signature = LocaleController.formatUserStatus(currentAccount, user, null, null); + final boolean premiumBlocked = premiumMessagingBlockedUsers != null && premiumMessagingBlockedUsers.contains(user.id); + cell.overridePremiumBlocked(premiumBlocked, false); + String signature; + if (premiumBlocked) { + signature = LocaleController.getString(R.string.InvitePremiumBlockedUser); + } else { + signature = LocaleController.formatUserStatus(currentAccount, user, null, null); + } cell.setObject(user, ContactsController.formatName(user.first_name, user.last_name), signature, position != chatEndRow - 1f); cell.setChecked(selectedChats.contains(user), false); } @@ -1326,7 +1391,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp HeaderCell headerCell = (HeaderCell) holder.itemView; if (type == TYPE_ADD_MEMBERS_RESTRICTED) { if (canSendLink) { - headerCell.setText(LocaleController.getString("ChannelInviteViaLink", R.string.ChannelInviteViaLink)); + headerCell.setText(LocaleController.getString(R.string.ChannelInviteViaLink)); } else { if (restrictedUsers.size() == 1) { headerCell.setText(LocaleController.getString("ChannelInviteViaLinkRestricted2", R.string.ChannelInviteViaLinkRestricted2)); @@ -1397,7 +1462,8 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp || type == TYPE_BOOSTS_FOR_WALLPAPER || type == TYPE_BOOSTS_FOR_REPLY_ICON || type == TYPE_BOOSTS_FOR_PROFILE_ICON - || type == TYPE_BOOSTS_FOR_CUSTOM_WALLPAPER; + || type == TYPE_BOOSTS_FOR_CUSTOM_WALLPAPER + || type == TYPE_BOOSTS_FOR_ADS; } private String getBoostLink() { @@ -1416,16 +1482,42 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp updatePremiumButtonText(); } - public void setRestrictedUsers(TLRPC.Chat chat, ArrayList userRestrictedPrivacy) { + public void setRestrictedUsers( + TLRPC.Chat chat, + ArrayList userRestrictedPrivacy, + ArrayList premiumMessagingBlockedUsers, + ArrayList premiumInviteBlockedUsers + ) { fromChat = chat; - canSendLink = ChatObject.canUserDoAdminAction(chat, ChatObject.ACTION_INVITE); + canSendLink = ChatObject.canUserDoAdminAction(chat, ChatObject.ACTION_INVITE) || true; restrictedUsers = new ArrayList<>(userRestrictedPrivacy); + this.premiumMessagingBlockedUsers = premiumMessagingBlockedUsers; + this.premiumInviteBlockedUsers = premiumInviteBlockedUsers; selectedChats.clear(); if (canSendLink) { - selectedChats.addAll(restrictedUsers); + for (TLRPC.User user : restrictedUsers) { + if (premiumMessagingBlockedUsers == null || !premiumMessagingBlockedUsers.contains(user.id)) { + selectedChats.add(user); + } + } } updateRows(); updateButton(); + + if ( + (type == TYPE_ADD_MEMBERS_RESTRICTED && !MessagesController.getInstance(currentAccount).premiumFeaturesBlocked() && (premiumInviteBlockedUsers != null && !premiumInviteBlockedUsers.isEmpty() || premiumMessagingBlockedUsers != null && premiumMessagingBlockedUsers.size() >= restrictedUsers.size())) && + premiumInviteBlockedUsers != null && premiumMessagingBlockedUsers != null && (premiumInviteBlockedUsers.size() == 1 && premiumMessagingBlockedUsers.size() == 1 || premiumMessagingBlockedUsers.size() >= premiumInviteBlockedUsers.size()) + ) { + if (LimitReachedBottomSheet.this.premiumButtonView != null && LimitReachedBottomSheet.this.premiumButtonView.getParent() != null) { + ((ViewGroup) LimitReachedBottomSheet.this.premiumButtonView.getParent()).removeView(LimitReachedBottomSheet.this.premiumButtonView); + } + if (divider != null && divider.getParent() != null) { + ((ViewGroup) divider.getParent()).removeView(divider); + } + if (recyclerListView != null) { + recyclerListView.setPadding(0, 0, 0, 0); + } + } } public void setDialogId(long dialogId) { @@ -1524,6 +1616,11 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp R.string.GroupNeedBoostsForCustomEmojiPackDescription, messagesController.groupEmojiStickersLevelMin ); + } else if (type == TYPE_BOOSTS_FOR_ADS) { + descriptionStr = LocaleController.formatString( + R.string.ChannelNeedBoostsForSwitchOffAdsDescription, + messagesController.channelRestrictSponsoredLevelMin + ); } else if (type == TYPE_BOOSTS_FOR_EMOJI_STATUS) { descriptionStr = LocaleController.formatString( isGroup ? R.string.GroupNeedBoostsForEmojiStatusDescription : R.string.ChannelNeedBoostsForEmojiStatusDescription, @@ -1640,6 +1737,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp type == TYPE_BOOSTS_FOR_WALLPAPER || type == TYPE_BOOSTS_FOR_CUSTOM_WALLPAPER || type == TYPE_BOOSTS_FOR_USERS || + type == TYPE_BOOSTS_FOR_ADS || type == TYPE_BOOSTS_FOR_REACTIONS || type == TYPE_BOOSTS_FOR_REPLY_ICON || type == TYPE_BOOSTS_FOR_PROFILE_ICON || @@ -1649,7 +1747,128 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp currentValue = 0; } - if (type != TYPE_FEATURES) { + if (type == TYPE_ADD_MEMBERS_RESTRICTED && !MessagesController.getInstance(currentAccount).premiumFeaturesBlocked() && (premiumInviteBlockedUsers != null && !premiumInviteBlockedUsers.isEmpty() || premiumMessagingBlockedUsers != null && premiumMessagingBlockedUsers.size() >= restrictedUsers.size())) { + ArrayList userIds = premiumInviteBlockedUsers.isEmpty() ? premiumMessagingBlockedUsers : premiumInviteBlockedUsers; + + AvatarsImageView avatarsImageView = new AvatarsImageView(context, false); + avatarsImageView.avatarsDrawable.strokeWidth = dp(3.33f); + avatarsImageView.setSize(dp(72)); + avatarsImageView.setStepFactor(0.4f); + final int count = Math.min(userIds.size(), 3); + avatarsImageView.setCount(count); + for (int i = 0; i < count; ++i) { + long userId = userIds.get(i); + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(userId); + avatarsImageView.setObject(i, currentAccount, user); + } + avatarsImageView.commitTransition(false); + addView(avatarsImageView, LayoutHelper.createLinear(72 + (count - 1) * 30, 72, Gravity.CENTER_HORIZONTAL, 0, 16, 0, 13)); + + TextView title = new TextView(context); + title.setGravity(Gravity.CENTER); + title.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + title.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + title.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + title.setText(LocaleController.getString(R.string.InvitePremiumBlockedTitle)); + addView(title, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 32, 0, 32, 9)); + + TextView description = new TextView(context); + description.setGravity(Gravity.CENTER); + description.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + description.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + addView(description, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 32, 0, 32, 19)); + + final boolean andMessaging = premiumMessagingBlockedUsers != null && premiumMessagingBlockedUsers.size() >= premiumInviteBlockedUsers.size(); + final boolean onlyMessaging = premiumInviteBlockedUsers != null && premiumInviteBlockedUsers.isEmpty(); + String string; + if (userIds.size() == 1) { + string = LocaleController.formatString( + andMessaging ? R.string.InviteMessagePremiumBlockedOne : R.string.InvitePremiumBlockedOne, + UserObject.getForcedFirstName(MessagesController.getInstance(currentAccount).getUser(userIds.get(0))) + ); + } else if (userIds.size() == 2) { + string = LocaleController.formatString( + andMessaging ? R.string.InviteMessagePremiumBlockedTwo : R.string.InvitePremiumBlockedTwo, + UserObject.getForcedFirstName(MessagesController.getInstance(currentAccount).getUser(userIds.get(0))), + UserObject.getForcedFirstName(MessagesController.getInstance(currentAccount).getUser(userIds.get(1))) + ); + } else if (userIds.size() == 3) { + string = LocaleController.formatString( + andMessaging ? R.string.InviteMessagePremiumBlockedThree : R.string.InvitePremiumBlockedThree, + UserObject.getForcedFirstName(MessagesController.getInstance(currentAccount).getUser(userIds.get(0))), + UserObject.getForcedFirstName(MessagesController.getInstance(currentAccount).getUser(userIds.get(1))), + UserObject.getForcedFirstName(MessagesController.getInstance(currentAccount).getUser(userIds.get(2))) + ); + } else { + string = LocaleController.formatPluralString( + andMessaging ? "InviteMessagePremiumBlockedMany" : "InvitePremiumBlockedMany", + userIds.size() - 2, + UserObject.getForcedFirstName(MessagesController.getInstance(currentAccount).getUser(userIds.get(0))), + UserObject.getForcedFirstName(MessagesController.getInstance(currentAccount).getUser(userIds.get(1))) + ); + avatarsImageView.setPlus(userIds.size() - 2, getThemedColor(Theme.key_dialogBackground)); + } + description.setText(AndroidUtilities.replaceTags(string)); + + PremiumButtonView premiumButtonView = new PremiumButtonView(context, false, resourcesProvider); + ScaleStateListAnimator.apply(premiumButtonView, .02f, 1.2f); + premiumButtonView.setButton(LocaleController.getString(R.string.InvitePremiumBlockedSubscribe), v -> { + if (parentFragment == null) return; + BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams(); + params.transitionFromLeft = true; + params.allowNestedScroll = false; + parentFragment.showAsSheet(new PremiumPreviewFragment("invite_privacy"), params); + }); + addView(premiumButtonView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, 4 + backgroundPaddingLeft / AndroidUtilities.density, 0, 4 + backgroundPaddingLeft / AndroidUtilities.density, 18)); + + final int blockedInviting = premiumInviteBlockedUsers == null ? 0 : premiumInviteBlockedUsers.size(); + final int blockedMessaging = premiumMessagingBlockedUsers == null ? 0 : premiumMessagingBlockedUsers.size(); + + if ((blockedInviting - blockedMessaging) > 0 && !(blockedInviting == 1 && blockedMessaging == 1) && canSendLink) { + SimpleTextView or = new SimpleTextView(context) { + private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + @Override + protected void dispatchDraw(Canvas canvas) { + paint.setColor(Theme.multAlpha(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider), .8f)); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(1); + final float cy = getHeight() / 2f; + canvas.drawLine(0, cy, getWidth() / 2f - getTextWidth() / 2f - dp(8), cy, paint); + canvas.drawLine(getWidth() / 2f + getTextWidth() / 2f + dp(8), cy, getWidth(), cy, paint); + + super.dispatchDraw(canvas); + } + }; + or.setGravity(Gravity.CENTER); + or.setAlignment(Layout.Alignment.ALIGN_CENTER); + or.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText2, resourcesProvider)); + or.setText(" " + LocaleController.getString(R.string.InvitePremiumBlockedOr) + " "); + or.setTextSize(14); + addView(or, LayoutHelper.createLinear(190, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 12, 0, 12, 20)); + + title = new TextView(context); + title.setGravity(Gravity.CENTER); + title.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + title.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + title.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + title.setText(LocaleController.getString(R.string.InviteBlockedTitle)); + addView(title, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 32, 0, 32, 9)); + + description = new TextView(context); + description.setGravity(Gravity.CENTER); + description.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + description.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + if (premiumInviteBlockedUsers.size() <= 1) { + description.setText(LocaleController.getString(R.string.InviteBlockedOneMessage)); + } else { + description.setText(LocaleController.getString(R.string.InviteBlockedManyMessage)); + } + addView(description, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 32, 0, 32, 19)); + } + + updatePremiumButtonText(); + return; + } else if (type != TYPE_FEATURES) { limitPreviewView = new LimitPreviewView(context, icon, currentValue, premiumLimit, percent, resourcesProvider) { @Override public void invalidate() { @@ -1699,7 +1918,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp } title = new TextView(context); - title.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + title.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); if (type == TYPE_FEATURES) { title.setText(LocaleController.getString(R.string.BoostingAdditionalFeaturesTitle)); } else if (type == TYPE_BOOSTS_FOR_REMOVE_RESTRICTIONS) { @@ -1710,6 +1929,8 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp } else { title.setText(getBoostsTitleString()); } + } else if (type == TYPE_BOOSTS_FOR_ADS) { + title.setText(getBoostsTitleString()); } else if (type == TYPE_BOOSTS_FOR_POSTING) { if (boostsStatus.level == 0) { title.setText(LocaleController.getString("BoostingEnableStories", R.string.BoostingEnableStories)); @@ -1824,7 +2045,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp } else { addView(description, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 24, 0, 24, 24)); } - if(type == TYPE_FEATURES) { + if (type == TYPE_FEATURES) { ((MarginLayoutParams) description.getLayoutParams()).bottomMargin = dp(15); ((MarginLayoutParams) title.getLayoutParams()).bottomMargin = dp(6); ((MarginLayoutParams) title.getLayoutParams()).topMargin = dp(12); @@ -1941,6 +2162,11 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp R.string.GroupNeedBoostsForCustomEmojiPackDescription, messagesController.groupEmojiStickersLevelMin ); + } else if (type == TYPE_BOOSTS_FOR_ADS) { + descriptionStr = LocaleController.formatString( + R.string.ChannelNeedBoostsForSwitchOffAdsDescription, + messagesController.channelRestrictSponsoredLevelMin + ); } else if (type == TYPE_BOOSTS_FOR_EMOJI_STATUS) { descriptionStr = LocaleController.formatString( isGroup ? R.string.GroupNeedBoostsForEmojiStatusDescription : R.string.ChannelNeedBoostsForEmojiStatusDescription, @@ -2140,7 +2366,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp limitParams.descriptionStr = LocaleController.formatString("LimitReachedStoriesMonthly", R.string.LimitReachedStoriesMonthly, limitParams.defaultLimit, limitParams.premiumLimit); limitParams.descriptionStrPremium = LocaleController.formatString("LimitReachedStoriesMonthlyPremium", R.string.LimitReachedStoriesMonthlyPremium, limitParams.premiumLimit); limitParams.descriptionStrLocked = LocaleController.formatString("LimitReachedStoriesMonthlyPremium", R.string.LimitReachedStoriesMonthlyPremium, limitParams.defaultLimit); - } else if (type == TYPE_BOOSTS_FOR_POSTING || type == TYPE_BOOSTS_FOR_REMOVE_RESTRICTIONS || type == TYPE_BOOSTS_FOR_COLOR || type == TYPE_BOOSTS_FOR_PROFILE_COLOR || type == TYPE_BOOSTS_FOR_REPLY_ICON || type == TYPE_BOOSTS_FOR_PROFILE_ICON || type == TYPE_BOOSTS_FOR_EMOJI_STATUS || type == TYPE_BOOSTS_FOR_CUSTOM_EMOJI_PACK || type == TYPE_BOOSTS_FOR_WALLPAPER || type == TYPE_BOOSTS_FOR_CUSTOM_WALLPAPER || type == TYPE_BOOSTS_FOR_USERS || type == TYPE_BOOSTS_FOR_REACTIONS) { + } else if (type == TYPE_BOOSTS_FOR_POSTING || type == TYPE_BOOSTS_FOR_REMOVE_RESTRICTIONS || type == TYPE_BOOSTS_FOR_COLOR || type == TYPE_BOOSTS_FOR_PROFILE_COLOR || type == TYPE_BOOSTS_FOR_REPLY_ICON || type == TYPE_BOOSTS_FOR_PROFILE_ICON || type == TYPE_BOOSTS_FOR_EMOJI_STATUS || type == TYPE_BOOSTS_FOR_ADS || type == TYPE_BOOSTS_FOR_CUSTOM_EMOJI_PACK || type == TYPE_BOOSTS_FOR_WALLPAPER || type == TYPE_BOOSTS_FOR_CUSTOM_WALLPAPER || type == TYPE_BOOSTS_FOR_USERS || type == TYPE_BOOSTS_FOR_REACTIONS) { limitParams.defaultLimit = MessagesController.getInstance(currentAccount).storiesSentMonthlyLimitDefault; limitParams.premiumLimit = MessagesController.getInstance(currentAccount).storiesSentMonthlyLimitPremium; limitParams.icon = R.drawable.filled_limit_boost; @@ -2208,7 +2434,8 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp type == TYPE_BOOSTS_FOR_CUSTOM_WALLPAPER || type == TYPE_BOOSTS_FOR_EMOJI_STATUS || type == TYPE_BOOSTS_FOR_CUSTOM_EMOJI_PACK || - type == TYPE_BOOSTS_FOR_REACTIONS + type == TYPE_BOOSTS_FOR_REACTIONS || + type == TYPE_BOOSTS_FOR_ADS ) { if (type != TYPE_BOOSTS_FOR_USERS || ChatObject.hasAdminRights(getChat())) { topPadding = .24f; @@ -2228,20 +2455,29 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp rowCount += boostFeatures.size() - 1; chatEndRow = rowCount; } else if (!hasFixedSize(type)) { - dividerRow = rowCount++; - chatsTitleRow = rowCount++; + if (type != TYPE_ADD_MEMBERS_RESTRICTED) { + dividerRow = rowCount++; + chatsTitleRow = rowCount++; + } else { + topPadding = .24f; + } if (loading) { loadingRow = rowCount++; } else { - chatStartRow = rowCount; - if (type == TYPE_ADD_MEMBERS_RESTRICTED) { - rowCount += restrictedUsers.size(); - } else if (type == TYPE_TO0_MANY_COMMUNITIES) { - rowCount += inactiveChats.size(); - } else { - rowCount += chats.size(); + if ( + !(type == TYPE_ADD_MEMBERS_RESTRICTED && !MessagesController.getInstance(currentAccount).premiumFeaturesBlocked() && (premiumInviteBlockedUsers != null && !premiumInviteBlockedUsers.isEmpty() || premiumMessagingBlockedUsers != null && premiumMessagingBlockedUsers.size() >= restrictedUsers.size())) || + !(premiumInviteBlockedUsers != null && premiumInviteBlockedUsers.size() == 1 && premiumMessagingBlockedUsers != null && premiumMessagingBlockedUsers.size() == 1 && canSendLink) + ) { + chatStartRow = rowCount; + if (type == TYPE_ADD_MEMBERS_RESTRICTED) { + rowCount += restrictedUsers.size(); + } else if (type == TYPE_TO0_MANY_COMMUNITIES) { + rowCount += inactiveChats.size(); + } else { + rowCount += chats.size(); + } + chatEndRow = rowCount; } - chatEndRow = rowCount; if (chatEndRow - chatStartRow > 1) { emptyViewDividerRow = rowCount++; } @@ -2404,6 +2640,7 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp maxlvl = Math.max(maxlvl, m.channelEmojiStatusLevelMin); maxlvl = Math.max(maxlvl, m.channelWallpaperLevelMin); maxlvl = Math.max(maxlvl, m.channelCustomWallpaperLevelMin); + maxlvl = Math.max(maxlvl, m.channelRestrictSponsoredLevelMin); } } @@ -2422,9 +2659,9 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp ArrayList list = new ArrayList<>(); final MessagesController m = MessagesController.getInstance(currentAccount); if (m == null) return list; - list.add(BoostFeature.of(R.drawable.menu_feature_stories, "BoostFeatureStoriesPerDay", level)); + list.add(BoostFeature.of(R.drawable.menu_feature_stories, "BoostFeatureStoriesPerDay", level).asIncremental()); if (!isGroup) { - list.add(BoostFeature.of(R.drawable.menu_feature_reactions, "BoostFeatureCustomReaction", level)); + list.add(BoostFeature.of(R.drawable.menu_feature_reactions, "BoostFeatureCustomReaction", level).asIncremental()); } final int nameColorsAvailable = m.peerColors != null ? m.peerColors.colorsAvailable(level, false) : 0; final int profileColorsAvailable = m.profilePeerColors != null ? m.profilePeerColors.colorsAvailable(level, isGroup) : 0; @@ -2458,6 +2695,9 @@ public class LimitReachedBottomSheet extends BottomSheetWithRecyclerListView imp if ((!isGroup && level >= m.channelCustomWallpaperLevelMin) || (isGroup && level >= m.groupCustomWallpaperLevelMin)) { list.add(BoostFeature.of(R.drawable.menu_feature_custombg, isGroup ? R.string.BoostFeatureCustomBackgroundGroup : R.string.BoostFeatureCustomBackground)); } + if ((!isGroup && level >= m.channelRestrictSponsoredLevelMin)) { + list.add(BoostFeature.of(R.drawable.menu_feature_noads, R.string.BoostFeatureSwitchOffAds)); + } Collections.reverse(list); return list; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumFeatureBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumFeatureBottomSheet.java index 10e4d4a43..918dc6c5a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumFeatureBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumFeatureBottomSheet.java @@ -395,8 +395,8 @@ public class PremiumFeatureBottomSheet extends BottomSheet implements Notificati BaseFragment mainFragment = LaunchActivity.getLastFragment(); for (int i = 0; i < 2; i++) { BaseFragment currentFragment = i == 0 ? fragment : mainFragment; - if (currentFragment != null && currentFragment.storyViewer != null && currentFragment.storyViewer.isShown()) { - currentFragment.storyViewer.dismissVisibleDialogs(); + if (currentFragment != null && currentFragment.getLastStoryViewer() != null) { + currentFragment.getLastStoryViewer().dismissVisibleDialogs(); } if (currentFragment != null && currentFragment.getVisibleDialog() != null) { currentFragment.getVisibleDialog().dismiss(); @@ -515,8 +515,8 @@ public class PremiumFeatureBottomSheet extends BottomSheet implements Notificati private static Theme.ResourcesProvider getResourceProvider(BaseFragment fragment) { if (fragment != null) { - if (fragment.storyViewer != null && fragment.storyViewer.isShown()) { - return fragment.storyViewer.getResourceProvider(); + if (fragment.getLastStoryViewer() != null && fragment.getLastStoryViewer().isShown()) { + return fragment.getLastStoryViewer().getResourceProvider(); } return fragment.getResourceProvider(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumPreviewBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumPreviewBottomSheet.java index 6690a98b0..26de5b8bd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumPreviewBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/PremiumPreviewBottomSheet.java @@ -418,7 +418,7 @@ public class PremiumPreviewBottomSheet extends BottomSheetWithRecyclerListView i } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return new Adapter(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/BoostRepository.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/BoostRepository.java index 88b3018d5..d266c7e3b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/BoostRepository.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/BoostRepository.java @@ -19,7 +19,6 @@ import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; import org.telegram.messenger.MessagesStorage; -import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; import org.telegram.messenger.Utilities; @@ -28,7 +27,7 @@ import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.tgnet.tl.TL_stories; import org.telegram.ui.ActionBar.BaseFragment; -import org.telegram.ui.Components.BotWebViewSheet; +import org.telegram.ui.bots.BotWebViewSheet; import org.telegram.ui.LaunchActivity; import org.telegram.ui.PaymentFormActivity; @@ -512,7 +511,7 @@ public class BoostRepository { }); } - public static void loadGiftOptions(TLRPC.Chat chat, Utilities.Callback> onDone) { + public static int loadGiftOptions(TLRPC.Chat chat, Utilities.Callback> onDone) { MessagesController controller = MessagesController.getInstance(UserConfig.selectedAccount); ConnectionsManager connection = ConnectionsManager.getInstance(UserConfig.selectedAccount); TLRPC.TL_payments_getPremiumGiftCodeOptions req = new TLRPC.TL_payments_getPremiumGiftCodeOptions(); @@ -521,7 +520,7 @@ public class BoostRepository { req.boost_peer = controller.getInputPeer(-chat.id); } - int reqId = connection.sendRequest(req, (response, error) -> { + return connection.sendRequest(req, (response, error) -> { if (response != null) { TLRPC.Vector vector = (TLRPC.Vector) response; List result = new ArrayList<>(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/BoostViaGiftsBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/BoostViaGiftsBottomSheet.java index 785b12c49..89eb13b6f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/BoostViaGiftsBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/BoostViaGiftsBottomSheet.java @@ -443,7 +443,7 @@ public class BoostViaGiftsBottomSheet extends BottomSheetWithRecyclerListView im } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return adapter = new BoostAdapter(resourcesProvider); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/GiftInfoBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/GiftInfoBottomSheet.java index f5ef0d54c..c61ad3946 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/GiftInfoBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/GiftInfoBottomSheet.java @@ -146,7 +146,7 @@ public class GiftInfoBottomSheet extends BottomSheetWithRecyclerListView { } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return adapter = new GiftInfoAdapter(resourcesProvider) { @Override protected void dismiss() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/PremiumPreviewGiftToUsersBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/PremiumPreviewGiftToUsersBottomSheet.java index eb584bf3e..fc3554d4c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/PremiumPreviewGiftToUsersBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/PremiumPreviewGiftToUsersBottomSheet.java @@ -68,7 +68,8 @@ public class PremiumPreviewGiftToUsersBottomSheet extends PremiumPreviewBottomSh if (fragment == null) { return; } - new PremiumPreviewGiftToUsersBottomSheet(fragment, UserConfig.selectedAccount, selectedUsers, giftCodeOptions, fragment.getResourceProvider()).show(); + PremiumPreviewGiftToUsersBottomSheet sheet = new PremiumPreviewGiftToUsersBottomSheet(fragment, UserConfig.selectedAccount, selectedUsers, giftCodeOptions, fragment.getResourceProvider()); + fragment.showDialog(sheet); } public PremiumPreviewGiftToUsersBottomSheet(BaseFragment fragment, int currentAccount, List selectedUsers, List giftCodeOptions, Theme.ResourcesProvider resourcesProvider) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/ReassignBoostBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/ReassignBoostBottomSheet.java index 87268ccb8..a381a654e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/ReassignBoostBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/ReassignBoostBottomSheet.java @@ -226,7 +226,7 @@ public class ReassignBoostBottomSheet extends BottomSheetWithRecyclerListView { } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return new RecyclerListView.SelectionAdapter() { @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/SelectorBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/SelectorBottomSheet.java index ce9a776dd..65a00b84a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/SelectorBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/SelectorBottomSheet.java @@ -682,7 +682,7 @@ public class SelectorBottomSheet extends BottomSheetWithRecyclerListView { } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return selectorAdapter = new SelectorAdapter(getContext(), resourcesProvider); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/UserSelectorBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/UserSelectorBottomSheet.java index 39b2edd82..8c3f1ddeb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/UserSelectorBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/UserSelectorBottomSheet.java @@ -1,6 +1,8 @@ package org.telegram.ui.Components.Premium.boosts; import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.getString; +import static org.telegram.ui.Components.Premium.boosts.adapters.SelectorAdapter.VIEW_TYPE_TOP_SECTION; import android.annotation.SuppressLint; import android.content.Intent; @@ -25,6 +27,7 @@ import androidx.recyclerview.widget.LinearSmoothScrollerCustom; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BirthdayController; import org.telegram.messenger.ContactsController; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; @@ -62,6 +65,10 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp private static UserSelectorBottomSheet instance; public static void open() { + open(0, null); + } + + public static void open(long userId, BirthdayController.BirthdayState birthdayState) { BaseFragment fragment = LaunchActivity.getLastFragment(); if (fragment == null) { return; @@ -69,8 +76,12 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp if (instance != null) { return; } - UserSelectorBottomSheet sheet = new UserSelectorBottomSheet(fragment, true); - sheet.show(); + UserSelectorBottomSheet sheet = new UserSelectorBottomSheet(fragment, userId, birthdayState, true); + if (fragment != null) { + fragment.showDialog(sheet); + } else { + sheet.show(); + } instance = sheet; } @@ -128,6 +139,9 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp private float recipientsBtnExtraSpace; private ReplacementSpan recipientsBtnSpaceSpan; + private long userId; + private BirthdayController.BirthdayState birthdays; + private final Runnable remoteSearchRunnable = new Runnable() { @Override public void run() { @@ -150,12 +164,12 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp if (selectedIds.size() > 0) { if (!isHintSearchText) { isHintSearchText = true; - AndroidUtilities.runOnUIThread(() -> searchField.setHintText(LocaleController.getString("Search", R.string.Search), true), 10); + AndroidUtilities.runOnUIThread(() -> searchField.setHintText(getString("Search", R.string.Search), true), 10); } } else { if (isHintSearchText) { isHintSearchText = false; - AndroidUtilities.runOnUIThread(() -> searchField.setHintText(LocaleController.getString("GiftPremiumUsersSearchHint", R.string.GiftPremiumUsersSearchHint), true), 10); + AndroidUtilities.runOnUIThread(() -> searchField.setHintText(getString("GiftPremiumUsersSearchHint", R.string.GiftPremiumUsersSearchHint), true), 10); } } } @@ -174,9 +188,23 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp }; } - public UserSelectorBottomSheet(BaseFragment fragment, boolean needFocus) { + public UserSelectorBottomSheet(BaseFragment fragment, long userId, BirthdayController.BirthdayState state, boolean needFocus) { super(fragment, needFocus, false, false, fragment.getResourceProvider()); + this.birthdays = state; + if (birthdays != null && !birthdays.today.isEmpty()) { + for (TLRPC.User user : birthdays.today) { + selectedIds.add(user.id); + allSelectedObjects.put(user.id, user); + } + } + this.userId = userId; + if (userId != 0 && fragment != null && !selectedIds.contains(userId)) { + TLRPC.User user = fragment.getMessagesController().getUser(userId); + selectedIds.add(user.id); + allSelectedObjects.put(user.id, user); + } + headerView = new SelectorHeaderCell(getContext(), resourcesProvider) { @Override protected int getHeaderHeight() { @@ -212,7 +240,7 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp }; searchField.setBackgroundColor(getThemedColor(Theme.key_dialogBackground)); searchField.setOnSearchTextChange(this::onSearch); - searchField.setHintText(LocaleController.getString("GiftPremiumUsersSearchHint", R.string.GiftPremiumUsersSearchHint), false); + searchField.setHintText(getString(!selectedIds.isEmpty() ? R.string.Search : R.string.GiftPremiumUsersSearchHint), false); sectionCell = new View(getContext()) { @Override @@ -276,7 +304,7 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp checkEditTextHint(); updateList(true, false); }, null); - updateList(true, false); + updateList(true, true); clearSearchAfterSelect(); } }); @@ -396,7 +424,7 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp } private void showMaximumUsersToast() { - String text = LocaleController.getString("BoostingSelectUpToWarningUsers", R.string.BoostingSelectUpToWarningUsers); + String text = getString("BoostingSelectUpToWarningUsers", R.string.BoostingSelectUpToWarningUsers); BulletinFactory.of(container, resourcesProvider).createSimpleBulletin(R.raw.chats_infotip, text).show(true); try { container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); @@ -445,14 +473,14 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp SpannableStringBuilder stringBuilder = new SpannableStringBuilder(); if (selectedIds.size() == 0) { if (LocaleController.isRTL) { - stringBuilder.append(LocaleController.getString("GiftPremiumChooseRecipientsBtn", R.string.GiftPremiumChooseRecipientsBtn)); + stringBuilder.append(getString("GiftPremiumChooseRecipientsBtn", R.string.GiftPremiumChooseRecipientsBtn)); stringBuilder.append("d").setSpan(recipientsBtnSpaceSpan, stringBuilder.length() - 1, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else { stringBuilder.append("d").setSpan(recipientsBtnSpaceSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - stringBuilder.append(LocaleController.getString("GiftPremiumChooseRecipientsBtn", R.string.GiftPremiumChooseRecipientsBtn)); + stringBuilder.append(getString("GiftPremiumChooseRecipientsBtn", R.string.GiftPremiumChooseRecipientsBtn)); } } else { - stringBuilder.append(LocaleController.getString("GiftPremiumProceedBtn", R.string.GiftPremiumProceedBtn)); + stringBuilder.append(getString("GiftPremiumProceedBtn", R.string.GiftPremiumProceedBtn)); } actionButton.setCount(selectedIds.size(), true); actionButton.setText(stringBuilder, animated, false); @@ -474,26 +502,64 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp } } - private void updateSectionCell(boolean animated) { - if (selectedIds == null) { - return; - } - if (selectedIds.size() > 0) { - selectorAdapter.setTopSectionClickListener(v -> { - selectedIds.clear(); - searchField.spansContainer.removeAllSpans(true); - checkEditTextHint(); - updateList(true, false); - }); - } else { - selectorAdapter.setTopSectionClickListener(null); - } - } - private boolean isSearching() { return !TextUtils.isEmpty(query); } + private int addSection(ArrayList items, CharSequence title, ArrayList users, boolean addSelectAll) { + int h = 0; + if (users.isEmpty()) { + return h; + } + List userItems = new ArrayList<>(); + int count = 0; + boolean allSelected = true; + for (TLRPC.User user : users) { + if (user.id == userId) { + continue; + } + if (!selectedIds.contains(user.id)) { + allSelected = false; + } + count++; + h += dp(56); + userItems.add(Item.asUser(user, selectedIds.contains(user.id))); + } + if (userItems.isEmpty()) { + return h; + } + h += dp(32); + Item header = Item.asTopSection(title); + if (addSelectAll && count > 1) { + final boolean finalAllSelected = allSelected; + header.withRightText(getString(allSelected ? R.string.DeselectAll : R.string.SelectAll), v -> { + if (finalAllSelected) { + for (TLRPC.User user : users) { + selectedIds.remove(user.id); + allSelectedObjects.remove(user.id); + } + } else { + for (TLRPC.User user : users) { + if (!selectedIds.contains(user.id)) { + selectedIds.add(user.id); + allSelectedObjects.put(user.id, user); + } + } + } + checkEditTextHint(); + searchField.updateSpans(true, selectedIds, () -> { + checkEditTextHint(); + updateList(true, false); + }, null); + updateList(true, true); + clearSearchAfterSelect(); + }); + } + items.add(header); + items.addAll(userItems); + return h; + } + @SuppressLint("NotifyDataSetChanged") public void updateItems(boolean animated, boolean notify) { oldItems.clear(); @@ -507,19 +573,37 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp items.add(Item.asUser(foundedUser, selectedIds.contains(foundedUser.id))); } } else { + if (userId >= 0) { + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(userId); + if (user != null) { + // + } + } + if (birthdays != null) { + h += addSection(items, getString(R.string.BirthdayToday), birthdays.today, true); + h += addSection(items, getString(R.string.BirthdayYesterday), birthdays.yesterday, true); + h += addSection(items, getString(R.string.BirthdayTomorrow), birthdays.tomorrow, true); + } + Item topSection = null; + ArrayList selected = new ArrayList<>(); if (!hints.isEmpty()) { List userItems = new ArrayList<>(); for (TLRPC.TL_topPeer hint : hints) { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(hint.peer.user_id); - if (user.self || user.bot || UserObject.isService(user.id) || UserObject.isDeleted(user)) { + if (user == null || user.id == userId || user.self || user.bot || UserObject.isService(user.id) || UserObject.isDeleted(user)) { continue; } + if (birthdays != null && birthdays.contains(user.id)) { + continue; + } + if (selectedIds.contains(user.id)) selected.add(user.id); h += dp(56); userItems.add(Item.asUser(user, selectedIds.contains(user.id))); } if (!userItems.isEmpty()) { h += dp(32); - items.add(Item.asTopSection(LocaleController.getString("GiftPremiumFrequentContacts", R.string.GiftPremiumFrequentContacts))); + topSection = Item.asTopSection(getString(R.string.GiftPremiumFrequentContacts)); + items.add(topSection); items.addAll(userItems); } } @@ -527,11 +611,15 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp List userItems = new ArrayList<>(); for (TLRPC.TL_contact contact : contactsMap.get(contactLetter)) { long myUid = UserConfig.getInstance(currentAccount).getClientUserId(); - if (contact.user_id == myUid) { + if (contact.user_id == myUid || contact.user_id == userId) { + continue; + } + if (birthdays != null && birthdays.contains(contact.user_id)) { continue; } h += dp(56); TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(contact.user_id); + if (selectedIds.contains(user.id)) selected.add(user.id); userItems.add(Item.asUser(user, selectedIds.contains(user.id))); } @@ -541,6 +629,21 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp items.addAll(userItems); } } + if (topSection != null && selected.size() > 0 && !selectedIds.isEmpty()) { + topSection.withRightText(getString(R.string.DeselectAll), v -> { + for (long userId : selected) { + selectedIds.remove(userId); + allSelectedObjects.remove(userId); + } + checkEditTextHint(); + searchField.updateSpans(true, selectedIds, () -> { + checkEditTextHint(); + updateList(true, false); + }, null); + updateList(true, true); + clearSearchAfterSelect(); + }); + } } if (items.isEmpty()) { @@ -550,8 +653,6 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp int minHeight = (int) (AndroidUtilities.displaySize.y * 0.6f); items.add(Item.asPad(Math.max(0, minHeight - h))); - updateSectionCell(animated); - if (notify && selectorAdapter != null) { if (animated) { selectorAdapter.setItems(oldItems, items); @@ -569,11 +670,11 @@ public class UserSelectorBottomSheet extends BottomSheetWithRecyclerListView imp @Override protected CharSequence getTitle() { - return LocaleController.getString("GiftTelegramPremiumTitle", R.string.GiftTelegramPremiumTitle); + return getString("GiftTelegramPremiumTitle", R.string.GiftTelegramPremiumTitle); } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { selectorAdapter = new SelectorAdapter(getContext(), resourcesProvider); selectorAdapter.setGreenSelector(true); return selectorAdapter; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/adapters/SelectorAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/adapters/SelectorAdapter.java index 952ab38ed..dd95d46f6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/adapters/SelectorAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/adapters/SelectorAdapter.java @@ -2,6 +2,7 @@ package org.telegram.ui.Components.Premium.boosts.adapters; import android.annotation.SuppressLint; import android.content.Context; +import android.graphics.Paint; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -11,6 +12,8 @@ import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.DialogObject; +import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.R; @@ -25,6 +28,7 @@ import org.telegram.ui.Components.Premium.boosts.cells.selector.SelectorLetterCe import org.telegram.ui.Components.Premium.boosts.cells.selector.SelectorUserCell; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.StickerEmptyView; +import org.telegram.ui.DialogsActivity; import java.util.HashMap; import java.util.List; @@ -149,7 +153,7 @@ public class SelectorAdapter extends AdapterWithDiffUtils { } userCell.setChecked(item.checked, false); userCell.setCheckboxAlpha(1f, false); - userCell.setDivider(position < items.size() - 2); + userCell.setDivider(position + 1 >= items.size() || items.get(position + 1).viewType == viewType); if ((position + 1 < items.size()) && items.get(position + 1).viewType == VIEW_TYPE_LETTER) { userCell.setDivider(false); } @@ -176,11 +180,13 @@ public class SelectorAdapter extends AdapterWithDiffUtils { } } else if (viewType == VIEW_TYPE_TOP_SECTION) { GraySectionCell cell = (GraySectionCell) holder.itemView; - cell.setText(item.text); - if (topSectionClickListener == null) { - cell.setRightText(null, null); + if (TextUtils.equals(cell.getText(), item.text)) { + cell.setRightText(item.subtext == null ? "" : item.subtext, true, item.callback); } else { - cell.setRightText(LocaleController.getString(R.string.UsersDeselectAll), topSectionClickListener); + cell.setText(Emoji.replaceWithRestrictedEmoji(item.text, cell.getTextView(), null)); + if (!TextUtils.isEmpty(item.subtext)) { + cell.setRightText(item.subtext, item.callback); + } } topSectionCell = cell; } @@ -266,10 +272,11 @@ public class SelectorAdapter extends AdapterWithDiffUtils { public TLRPC.InputPeer peer; public TLRPC.Chat chat; public TLRPC.TL_help_country country; - public String text; + public CharSequence text, subtext; public int type; public boolean checked; public int padHeight = -1; + public View.OnClickListener callback; private Item(int viewType, boolean selectable) { super(viewType, selectable); @@ -296,12 +303,18 @@ public class SelectorAdapter extends AdapterWithDiffUtils { return item; } - public static Item asTopSection(String text) { + public static Item asTopSection(CharSequence text) { Item item = new Item(VIEW_TYPE_TOP_SECTION, false); item.text = text; return item; } + public Item withRightText(String rightText, View.OnClickListener whenRightTextClicked) { + subtext = rightText; + callback = whenRightTextClicked; + return this; + } + public static Item asCountry(TLRPC.TL_help_country tlHelpCountry, boolean checked) { Item item = new Item(VIEW_TYPE_COUNTRY, true); item.country = tlHelpCountry; @@ -327,6 +340,13 @@ public class SelectorAdapter extends AdapterWithDiffUtils { return item; } + public long getDialogId() { + if (user != null) return user.id; + if (chat != null) return -chat.id; + if (peer != null) return DialogObject.getPeerDialogId(peer); + return 0; + } + public static Item asNoUsers() { return new Item(VIEW_TYPE_NO_USERS, false); } @@ -341,16 +361,30 @@ public class SelectorAdapter extends AdapterWithDiffUtils { } if (viewType == VIEW_TYPE_PAD && (padHeight != i.padHeight)) { return false; - } else if (viewType == VIEW_TYPE_USER && (user != i.user || chat != i.chat || peer != i.peer || type != i.type || checked != i.checked)) { + } else if (viewType == VIEW_TYPE_USER && (getDialogId() != i.getDialogId() || type != i.type)) { return false; - } else if (viewType == VIEW_TYPE_COUNTRY && (country != i.country || checked != i.checked)) { + } else if (viewType == VIEW_TYPE_COUNTRY && (country != i.country)) { return false; } else if (viewType == VIEW_TYPE_LETTER && (!TextUtils.equals(text, i.text))) { return false; - } else if (viewType == VIEW_TYPE_TOP_SECTION && (!TextUtils.equals(text, i.text) || checked != i.checked)) { + } else if (viewType == VIEW_TYPE_TOP_SECTION && (!TextUtils.equals(text, i.text))) { return false; } return true; } + + @Override + protected boolean contentsEquals(AdapterWithDiffUtils.Item o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Item i = (Item) o; + if (checked != i.checked) { + return false; + } + if (viewType == VIEW_TYPE_TOP_SECTION) { + return TextUtils.equals(subtext, i.subtext) && (callback == null) == (i.callback == null); + } + return true; + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/cells/selector/SelectorLetterCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/cells/selector/SelectorLetterCell.java index 1785e1abb..5a4b0bbac 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/cells/selector/SelectorLetterCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/cells/selector/SelectorLetterCell.java @@ -32,7 +32,7 @@ public class SelectorLetterCell extends FrameLayout { addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 16, 0, 16, 0)); } - public void setLetter(String letter) { + public void setLetter(CharSequence letter) { textView.setText(letter); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java index 90246cc14..02dcce0bc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java @@ -213,9 +213,15 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma } generatingCache = false; decodeFrameFinishedInternal(); + if (whenCacheDone != null) { + whenCacheDone.run(); + whenCacheDone = null; + } } }; + public Runnable whenCacheDone; + BitmapsCache bitmapsCache; int generateCacheFramePointer; @@ -1019,6 +1025,14 @@ public class RLottieDrawable extends BitmapDrawable implements Animatable, Bitma return true; } + public void post(Runnable runnable) { + if (shouldLimitFps && Thread.currentThread() == ApplicationLoader.applicationHandler.getLooper().getThread()) { + DispatchQueuePoolBackground.execute(() -> AndroidUtilities.runOnUIThread(runnable), frameWaitSync != null); + } else { + loadFrameRunnableQueue.execute(() -> AndroidUtilities.runOnUIThread(runnable)); + } + } + public boolean isHeavyDrawable() { return isDice == 0; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/CustomEmojiReactionsWindow.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/CustomEmojiReactionsWindow.java index d2ed41a28..ab5b8413d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/CustomEmojiReactionsWindow.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/CustomEmojiReactionsWindow.java @@ -1,5 +1,6 @@ package org.telegram.ui.Components.Reactions; +import static org.telegram.ui.Components.ReactionsContainerLayout.TYPE_STICKER_SET_EMOJI; import static org.telegram.ui.Components.ReactionsContainerLayout.TYPE_STORY; import static org.telegram.ui.Components.ReactionsContainerLayout.TYPE_STORY_LIKES; import static org.telegram.ui.Components.ReactionsContainerLayout.TYPE_TAGS; @@ -48,6 +49,7 @@ import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.CubicBezierInterpolator; @@ -160,7 +162,7 @@ public class CustomEmojiReactionsWindow { dismiss(); } }); - attachToParent = type == TYPE_STORY_LIKES; + attachToParent = type == TYPE_STORY_LIKES || type == TYPE_STICKER_SET_EMOJI; // sizeNotifierFrameLayout.setFitsSystemWindows(true); @@ -200,7 +202,7 @@ public class CustomEmojiReactionsWindow { @Override protected void onEmojiSelected(View emojiView, Long documentId, TLRPC.Document document, Integer until) { - if (!UserConfig.getInstance(baseFragment.getCurrentAccount()).isPremium()) { + if (baseFragment != null && reactionsContainerLayout.getWindowType() != SelectAnimatedEmojiDialog.TYPE_STICKER_SET_EMOJI && !UserConfig.getInstance(baseFragment.getCurrentAccount()).isPremium()) { windowView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); BulletinFactory.of(windowView, null).createEmojiBulletin( document, @@ -210,7 +212,11 @@ public class CustomEmojiReactionsWindow { ).show(); return; } - reactionsContainerLayout.onReactionClicked(emojiView, ReactionsLayoutInBubble.VisibleReaction.fromCustomEmoji(documentId), false); + if (documentId == null && document == null) return; + if (document != null) { + AnimatedEmojiDrawable.getDocumentFetcher(UserConfig.selectedAccount).putDocument(document); + } + reactionsContainerLayout.onReactionClicked(emojiView, ReactionsLayoutInBubble.VisibleReaction.fromCustomEmoji(documentId == null ? document.id : documentId), false); AndroidUtilities.hideKeyboard(windowView); } @@ -360,7 +366,7 @@ public class CustomEmojiReactionsWindow { if (type == TYPE_STORY) { containerView.setTranslationX((windowView.getMeasuredWidth() - containerView.getMeasuredWidth()) / 2f - AndroidUtilities.dp(16)); - } else if (type == TYPE_STORY_LIKES) { + } else if (type == TYPE_STORY_LIKES || type == TYPE_STICKER_SET_EMOJI) { containerView.setTranslationX(location[0] - windowLocation[0] - AndroidUtilities.dp(18)); } else { containerView.setTranslationX(location[0] - windowLocation[0] - AndroidUtilities.dp(2)); @@ -731,7 +737,7 @@ public class CustomEmojiReactionsWindow { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int size; - if (type == TYPE_STORY || type == TYPE_STORY_LIKES) { + if (type == TYPE_STORY || type == TYPE_STORY_LIKES || type == TYPE_STICKER_SET_EMOJI) { size = reactionsContainerLayout.getMeasuredWidth(); } else { size = Math.min(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); @@ -782,7 +788,7 @@ public class CustomEmojiReactionsWindow { } if (reactionsContainerLayout.hintView != null) { canvas.save(); - canvas.translate(drawingRect.left, drawingRect.top + reactionsContainerLayout.hintView.getY() - (type == TYPE_TAGS ? reactionsContainerLayout.rect.top : 0)); + canvas.translate(drawingRect.left, drawingRect.top + reactionsContainerLayout.hintView.getY() - (type == TYPE_TAGS || type == TYPE_STICKER_SET_EMOJI ? reactionsContainerLayout.rect.top : 0)); canvas.saveLayerAlpha( 0, 0, reactionsContainerLayout.hintView.getMeasuredWidth(), reactionsContainerLayout.hintView.getMeasuredHeight(), (int) (255 * reactionsContainerLayout.hintView.getAlpha() * (1f - enterTransitionProgress)), Canvas.ALL_SAVE_FLAG); reactionsContainerLayout.hintView.draw(canvas); canvas.restore(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionsContainerLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionsContainerLayout.java index abceed44e..4de885e58 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionsContainerLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ReactionsContainerLayout.java @@ -4,6 +4,7 @@ import static org.telegram.messenger.AndroidUtilities.dp; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.LayoutTransition; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.SuppressLint; @@ -23,9 +24,9 @@ import android.graphics.drawable.Drawable; import android.provider.Settings; import android.text.Layout; import android.text.StaticLayout; +import android.text.TextUtils; import android.util.LongSparseArray; import android.util.Property; -import android.util.SparseArray; import android.util.TypedValue; import android.view.Gravity; import android.view.HapticFeedbackConstants; @@ -33,7 +34,6 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; -import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.OvershootInterpolator; import android.widget.FrameLayout; @@ -65,7 +65,6 @@ import org.telegram.messenger.SharedConfig; import org.telegram.messenger.SvgHelper; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; -import org.telegram.messenger.support.LongSparseLongArray; import org.telegram.tgnet.TLRPC; import org.telegram.tgnet.tl.TL_stories; import org.telegram.ui.ActionBar.AlertDialog; @@ -105,6 +104,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio public final static int TYPE_STORY = 1; public static final int TYPE_STORY_LIKES = 2; public static final int TYPE_TAGS = 3; + public static final int TYPE_STICKER_SET_EMOJI = 4; private final static int ALPHA_DURATION = 150; private final static float SIDE_SCALE = 0.6f; @@ -221,6 +221,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio public TextView hintView; public int hintViewWidth, hintViewHeight; public float bubblesOffset; + private float miniBubblesOffset; public ReactionsContainerLayout(int type, BaseFragment fragment, @NonNull Context context, int currentAccount, Theme.ResourcesProvider resourcesProvider) { super(context); @@ -384,7 +385,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio customEmojiReactionsIconView = new InternalImageView(context); customEmojiReactionsIconView.setImageResource(R.drawable.msg_reactions_expand); customEmojiReactionsIconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - if (type == TYPE_STORY || type == TYPE_STORY_LIKES) { + if (type == TYPE_STORY || type == TYPE_STORY_LIKES || type == TYPE_STICKER_SET_EMOJI) { customEmojiReactionsIconView.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY)); } else { customEmojiReactionsIconView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_dialogBackground), PorterDuff.Mode.MULTIPLY)); @@ -523,7 +524,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio nextRecentReaction.getLayoutParams().width = size - dp(12); nextRecentReaction.getLayoutParams().height = size; - if (type == TYPE_STORY_LIKES) { + if (type == TYPE_STORY_LIKES || type == TYPE_STICKER_SET_EMOJI) { bgPaint.setColor(ColorUtils.blendARGB(Color.BLACK, Color.WHITE, 0.13f)); } else { bgPaint.setColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuBackground, resourcesProvider)); @@ -535,7 +536,14 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio return showExpandableReactions; } + public List getVisibleReactionsList() { + return visibleReactionsList; + } + public int getWindowType() { + if (type == TYPE_STICKER_SET_EMOJI) { + return SelectAnimatedEmojiDialog.TYPE_STICKER_SET_EMOJI; + } if (type == TYPE_TAGS) { return SelectAnimatedEmojiDialog.TYPE_TAGS; } @@ -591,11 +599,11 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio //animatePullingBack(); } - protected void onShownCustomEmojiReactionDialog(){ + protected void onShownCustomEmojiReactionDialog() { } - private void invalidateLoopViews() { + public void invalidateLoopViews() { for (int i = 0; i < recyclerListView.getChildCount(); i++) { View child = recyclerListView.getChildAt(i); if (child instanceof ReactionHolderView) { @@ -942,7 +950,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio } cx = LocaleController.isRTL || mirrorX ? bigCircleOffset - bigCircleRadius : getWidth() - bigCircleOffset + bigCircleRadius; - cx += bubblesOffset; + cx += bubblesOffset + miniBubblesOffset; cy = isTop ? getPaddingTop() - expandSize() - dp(16) : getHeight() - smallCircleRadius - sPad + expandSize(); cy = AndroidUtilities.lerp(cy, smallCircleRadius + sPad - expandSize(), CubicBezierInterpolator.DEFAULT.getInterpolation(flipVerticalProgress)); sPad = -dp(1); @@ -960,6 +968,10 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio bgPaint.setAlpha(255); } + public void setMiniBubblesOffset(float miniBubblesOffset) { + this.miniBubblesOffset = miniBubblesOffset; + } + private void checkPressedProgressForOtherViews(View view) { int position = recyclerListView.getChildAdapterPosition(view); float translationX; @@ -1130,6 +1142,9 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio if (type == TYPE_TAGS && !UserConfig.getInstance(currentAccount).isPremium()) { showExpandableReactions = false; } + if (type == TYPE_STICKER_SET_EMOJI) { + showExpandableReactions = true; + } setVisibleReactionsList(visibleReactions); if (message != null && message.messageOwner.reactions != null && message.messageOwner.reactions.results != null) { @@ -1177,6 +1192,27 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio return selectedReactions; } + public String getSelectedEmoji() { + if (selectedReactions.isEmpty()) { + return ""; + } + String result = null; + ReactionsLayoutInBubble.VisibleReaction visibleReaction = selectedReactions.iterator().next(); + if (visibleReaction.documentId != 0) { + TLRPC.Document document = AnimatedEmojiDrawable.findDocument(currentAccount, visibleReaction.documentId); + if (document != null) { + result = MessageObject.findAnimatedEmojiEmoticon(document, null); + } + } + if (TextUtils.isEmpty(result)) { + result = visibleReaction.emojicon; + } + if (TextUtils.isEmpty(result)) { + result = "๐Ÿ‘"; + } + return result; + } + public static HashSet getInclusiveReactions(ArrayList messages) { LongSparseArray arr = new LongSparseArray<>(); HashSet messageReactions = new HashSet<>(); @@ -1216,6 +1252,12 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio updateSelected(); } + public void setSelectedReactionInclusive(ReactionsLayoutInBubble.VisibleReaction visibleReaction) { + selectedReactions.clear(); + selectedReactions.add(visibleReaction); + updateSelected(); + } + private void updateSelected() { AndroidUtilities.forEachViews(recyclerListView, child -> { int position = recyclerListView.getChildAdapterPosition(child); @@ -1238,7 +1280,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio } private void fillRecentReactionsList(List visibleReactions) { - if (!allReactionsAvailable) { + if (!allReactionsAvailable || type == TYPE_STICKER_SET_EMOJI) { if (type == TYPE_TAGS) { ArrayList topReactions = MediaDataController.getInstance(currentAccount).getSavedReactions(); HashSet hashSet = new HashSet<>(); @@ -1537,7 +1579,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio hintView.setPadding(dp(8), 0, dp(8), 0); hintView.setClickable(true); hintView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); - if (type == TYPE_STORY || type == TYPE_STORY_LIKES) { + if (type == TYPE_STORY || type == TYPE_STORY_LIKES || type == TYPE_STICKER_SET_EMOJI) { hintView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); hintView.setAlpha(0.5f); } else { @@ -1820,6 +1862,12 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio addView(enterImageView, LayoutHelper.createFrame(34, 34, Gravity.CENTER)); addView(pressedBackupImageView, LayoutHelper.createFrame(34, 34, Gravity.CENTER)); addView(loopImageView, LayoutHelper.createFrame(34, 34, Gravity.CENTER)); + if (type == TYPE_STICKER_SET_EMOJI) { + LayoutTransition layoutTransition = new LayoutTransition(); + layoutTransition.setDuration(100); + layoutTransition.enableTransitionType(LayoutTransition.CHANGING); + setLayoutTransition(layoutTransition); + } enterImageView.setLayerNum(Integer.MAX_VALUE); loopImageView.setLayerNum(Integer.MAX_VALUE); loopImageView.imageReceiver.setAutoRepeat(0); @@ -1870,6 +1918,9 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio currentReaction = react; selected = selectedReactions.contains(react); hasEnterAnimation = currentReaction.emojicon != null && (showCustomEmojiReaction() || allReactionsIsDefault) && LiteMode.isEnabled(LiteMode.FLAG_ANIMATED_EMOJI_REACTIONS); + if (type == TYPE_STICKER_SET_EMOJI) { + hasEnterAnimation = false; + } if (currentReaction.emojicon != null) { updateImage(react); @@ -1885,7 +1936,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio loopImageView.getImageReceiver().clearImage(); AnimatedEmojiDrawable pressedDrawable = new AnimatedEmojiDrawable(AnimatedEmojiDrawable.CACHE_TYPE_ALERT_PREVIEW_LARGE, currentAccount, currentReaction.documentId); AnimatedEmojiDrawable loopDrawable = new AnimatedEmojiDrawable(AnimatedEmojiDrawable.CACHE_TYPE_ALERT_PREVIEW, currentAccount, currentReaction.documentId); - if (type == TYPE_STORY || type == TYPE_STORY_LIKES) { + if (type == TYPE_STORY || type == TYPE_STORY_LIKES || type == TYPE_STICKER_SET_EMOJI) { pressedDrawable.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)); loopDrawable.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)); } else { @@ -1923,8 +1974,8 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio TLRPC.TL_availableReaction defaultReaction = MediaDataController.getInstance(currentAccount).getReactionsMap().get(currentReaction.emojicon); if (defaultReaction != null) { SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(defaultReaction.activate_animation, Theme.key_windowBackgroundWhiteGrayIcon, 0.2f); - if (!LiteMode.isEnabled(LiteMode.FLAG_ANIMATED_EMOJI_REACTIONS)) { - if (SharedConfig.getDevicePerformanceClass() <= SharedConfig.PERFORMANCE_CLASS_LOW) { + if (!LiteMode.isEnabled(LiteMode.FLAG_ANIMATED_EMOJI_REACTIONS) || type == TYPE_STICKER_SET_EMOJI) { + if (SharedConfig.getDevicePerformanceClass() <= SharedConfig.PERFORMANCE_CLASS_LOW || type == TYPE_STICKER_SET_EMOJI) { loopImageView.getImageReceiver().setImage(ImageLocation.getForDocument(defaultReaction.select_animation), "60_60_firstframe", null, null, hasEnterAnimation ? null : svgThumb, 0, "tgs", currentReaction, 0); } else { enterImageView.getImageReceiver().setImage(ImageLocation.getForDocument(defaultReaction.appear_animation), ReactionsUtils.APPEAR_ANIMATION_FILTER, null, null, svgThumb, 0, "tgs", react, 0); @@ -2058,7 +2109,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio pressed = true; pressedX = event.getX(); pressedY = event.getY(); - if (sideScale == 1f && !isLocked && type != TYPE_TAGS) { + if (sideScale == 1f && !isLocked && type != TYPE_TAGS && type != TYPE_STICKER_SET_EMOJI) { AndroidUtilities.runOnUIThread(longPressRunnable, ViewConfiguration.getLongPressTimeout()); } } @@ -2275,7 +2326,7 @@ public class ReactionsContainerLayout extends FrameLayout implements Notificatio @Override protected void dispatchDraw(Canvas canvas) { int color; - if (type == TYPE_STORY || type == TYPE_STORY_LIKES) { + if (type == TYPE_STORY || type == TYPE_STORY_LIKES || type == TYPE_STICKER_SET_EMOJI) { color = ColorUtils.setAlphaComponent(Color.WHITE, 30); } else { color = ColorUtils.blendARGB(Theme.getColor(Theme.key_actionBarDefaultSubmenuItemIcon, resourcesProvider), Theme.getColor(Theme.key_dialogBackground, resourcesProvider), 0.7f); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScaleStateListAnimator.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScaleStateListAnimator.java index 160df0ebe..ffa394361 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScaleStateListAnimator.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScaleStateListAnimator.java @@ -18,6 +18,8 @@ public class ScaleStateListAnimator { return; } + view.setLayerType(View.LAYER_TYPE_HARDWARE, null); + AnimatorSet pressedAnimator = new AnimatorSet(); pressedAnimator.playTogether( ObjectAnimator.ofFloat(view, View.SCALE_X, 1f - scale), diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTabStrip.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTabStrip.java index 78a5c3af4..0d00e521a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTabStrip.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTabStrip.java @@ -623,22 +623,29 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { tabView.imageView.setImageDrawable(thumbDrawable); } } else { - Object object = child.getTag(); + Object thumbObject = child.getTag(); Object parentObject = child.getTag(R.id.parent_tag); TLRPC.Document sticker = (TLRPC.Document) child.getTag(R.id.object_tag); ImageLocation imageLocation; - if (object instanceof TLRPC.Document) { + String thumbType = null; + if (thumbObject instanceof TLRPC.Document) { + //no thumb, using first sticker from set if (!tabView.inited) { - tabView.svgThumb = DocumentObject.getSvgThumb((TLRPC.Document) object, Theme.key_emptyListPlaceholder, 0.2f); + tabView.svgThumb = DocumentObject.getSvgThumb((TLRPC.Document) thumbObject, Theme.key_emptyListPlaceholder, 0.2f); } imageLocation = ImageLocation.getForDocument(sticker); - } else if (object instanceof TLRPC.PhotoSize) { - TLRPC.PhotoSize thumb = (TLRPC.PhotoSize) object; + } else if (thumbObject instanceof TLRPC.PhotoSize) { + TLRPC.PhotoSize thumb = (TLRPC.PhotoSize) thumbObject; int thumbVersion = 0; if (parentObject instanceof TLRPC.TL_messages_stickerSet) { + TLRPC.TL_messages_stickerSet stickerSet = ((TLRPC.TL_messages_stickerSet) parentObject); thumbVersion = ((TLRPC.TL_messages_stickerSet) parentObject).set.thumb_version; + if (!tabView.inited) { + tabView.svgThumb = DocumentObject.getSvgThumb(stickerSet.set.thumbs, Theme.key_emptyListPlaceholder, 0.2f); + } } + thumbType = thumb.type; imageLocation = ImageLocation.getForSticker(thumb, sticker, thumbVersion); } else { continue; @@ -656,16 +663,24 @@ public class ScrollSlidingTabStrip extends HorizontalScrollView { BackupImageView imageView = tabView.imageView; final boolean lite = !LiteMode.isEnabled(LiteMode.FLAG_ANIMATED_STICKERS_KEYBOARD); String imageFilter = lite ? "40_40_firstframe" : "40_40"; - if (MessageObject.isVideoSticker(sticker) && sticker.thumbs != null && sticker.thumbs.size() > 0) { - if (lite) { - TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(sticker.thumbs, 90); - imageView.setImage(ImageLocation.getForDocument(thumb, sticker), "40_40", svgThumb, 0, parentObject); - } else if (svgThumb != null) { - imageView.setImage(ImageLocation.getForDocument(sticker), imageFilter, svgThumb, 0, parentObject); + if ((thumbType == null && MessageObject.isVideoSticker(sticker) && sticker.thumbs != null && sticker.thumbs.size() > 0) || (thumbType != null && thumbType.equalsIgnoreCase("v"))) { + if (thumbType == null) { + if (lite) { + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(sticker.thumbs, 90); + imageView.setImage(ImageLocation.getForDocument(thumb, sticker), "40_40", svgThumb, 0, parentObject); + } else if (svgThumb != null) { + imageView.setImage(ImageLocation.getForDocument(sticker), imageFilter, svgThumb, 0, parentObject); + } else { + imageView.setImage(ImageLocation.getForDocument(sticker), imageFilter, imageLocation, null, 0, parentObject); + } } else { - imageView.setImage(ImageLocation.getForDocument(sticker), imageFilter, imageLocation, null, 0, parentObject); + if (svgThumb != null) { + imageView.setImage(imageLocation, imageFilter, svgThumb, 0, parentObject); + } else { + imageView.setImage(imageLocation, imageFilter, null, null, 0, parentObject); + } } - } else if (MessageObject.isAnimatedStickerDocument(sticker, true)) { + } else if ((thumbType == null && MessageObject.isAnimatedStickerDocument(sticker, true)) || (thumbType != null && thumbType.equalsIgnoreCase("a"))) { if (svgThumb != null) { imageView.setImage(imageLocation, imageFilter, svgThumb, 0, parentObject); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchDownloadsContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchDownloadsContainer.java index f85753b61..06c124e6a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchDownloadsContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchDownloadsContainer.java @@ -3,6 +3,8 @@ package org.telegram.ui.Components; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; +import android.text.SpannableString; +import android.text.Spanned; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -19,7 +21,9 @@ import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.DownloadController; +import org.telegram.messenger.FileLoadOperation; import org.telegram.messenger.FileLoader; +import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaController; import org.telegram.messenger.MessageObject; @@ -28,6 +32,7 @@ import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; +import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; @@ -36,6 +41,7 @@ import org.telegram.ui.Cells.SharedAudioCell; import org.telegram.ui.Cells.SharedDocumentCell; import org.telegram.ui.FilteredSearchView; import org.telegram.ui.PhotoViewer; +import org.telegram.ui.PremiumPreviewFragment; import java.util.ArrayList; @@ -79,7 +85,13 @@ public class SearchDownloadsContainer extends FrameLayout implements Notificatio this.parentFragment = fragment; this.parentActivity = fragment.getParentActivity(); this.currentAccount = currentAccount; - recyclerListView = new BlurredRecyclerView(getContext()); + recyclerListView = new BlurredRecyclerView(getContext()) { + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + checkItemsFloodWait(); + } + }; ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new TouchHelperCallback()); itemTouchHelper.attachToRecyclerView(recyclerListView); addView(recyclerListView); @@ -96,6 +108,7 @@ public class SearchDownloadsContainer extends FrameLayout implements Notificatio if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { AndroidUtilities.hideKeyboard(parentActivity.getCurrentFocus()); } + checkItemsFloodWait(); } }); DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator(); @@ -587,6 +600,7 @@ public class SearchDownloadsContainer extends FrameLayout implements Notificatio protected void onAttachedToWindow() { super.onAttachedToWindow(); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.onDownloadingFilesChanged); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.premiumFloodWaitReceived); if (getVisibility() == View.VISIBLE) { DownloadController.getInstance(currentAccount).clearUnviewedDownloads(); } @@ -598,6 +612,7 @@ public class SearchDownloadsContainer extends FrameLayout implements Notificatio protected void onDetachedFromWindow() { super.onDetachedFromWindow(); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.onDownloadingFilesChanged); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.premiumFloodWaitReceived); } @@ -608,6 +623,8 @@ public class SearchDownloadsContainer extends FrameLayout implements Notificatio DownloadController.getInstance(currentAccount).clearUnviewedDownloads(); } update(true); + } else if (id == NotificationCenter.premiumFloodWaitReceived) { + checkItemsFloodWait(); } } @@ -708,4 +725,57 @@ public class SearchDownloadsContainer extends FrameLayout implements Notificatio viewHolder.itemView.setPressed(false); } } + + public void checkItemsFloodWait() { + if (UserConfig.getInstance(currentAccount).isPremium()) return; + if (recyclerListView == null) return; + for (int i = 0; i < recyclerListView.getChildCount(); ++i) { + try { + View child = recyclerListView.getChildAt(i); + if (!(child instanceof Cell)) continue; + MessageObject messageObject = ((Cell) child).sharedDocumentCell.getMessage(); + if (messageObject == null) continue; + if (FileLoader.getInstance(currentAccount).checkLoadCaughtPremiumFloodWait(messageObject.getFileName())) { + showPremiumFloodWaitBulletin(false); + return; + } else if (FileLoader.getInstance(currentAccount).checkLoadCaughtPremiumFloodWait(messageObject.getFileName())) { + showPremiumFloodWaitBulletin(true); + return; + } + } catch (Exception e) { + FileLog.e(e); + } + } + } + + public void showPremiumFloodWaitBulletin(final boolean isUpload) { + if (parentFragment == null || !recyclerListView.isAttachedToWindow()) return; + + final long now = System.currentTimeMillis(); + if (now - ConnectionsManager.lastPremiumFloodWaitShown < 1000L * MessagesController.getInstance(currentAccount).uploadPremiumSpeedupNotifyPeriod) { + return; + } + ConnectionsManager.lastPremiumFloodWaitShown = now; + if (UserConfig.getInstance(currentAccount).isPremium() || MessagesController.getInstance(currentAccount).premiumFeaturesBlocked()) { + return; + } + + final float n; + if (isUpload) { + n = MessagesController.getInstance(currentAccount).uploadPremiumSpeedupUpload; + } else { + n = MessagesController.getInstance(currentAccount).uploadPremiumSpeedupDownload; + } + SpannableString boldN = new SpannableString(Double.toString(Math.round(n * 10) / 10.0).replaceAll("\\.0$", "")); + boldN.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), 0, boldN.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + if (parentFragment.hasStoryViewer()) return; + BulletinFactory.of(parentFragment).createSimpleBulletin( + R.raw.speed_limit, + LocaleController.getString(isUpload ? R.string.UploadSpeedLimited : R.string.DownloadSpeedLimited), + AndroidUtilities.replaceCharSequence("%d", AndroidUtilities.premiumText(LocaleController.getString(isUpload ? R.string.UploadSpeedLimitedMessage : R.string.DownloadSpeedLimitedMessage), () -> { + parentFragment.presentFragment(new PremiumPreviewFragment(isUpload ? "upload_speed" : "download_speed")); + }), boldN) + ).setDuration(8000).show(false); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBar.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBar.java index ddd1b0cad..daa39b0c6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBar.java @@ -465,10 +465,8 @@ public class SeekBar { lastWidth = width; if (timestampIndex != currentTimestamp) { - if (pressed && parentView != null) { - try { - parentView.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + if (pressed) { + AndroidUtilities.vibrateCursor(parentView); } currentTimestamp = timestampIndex; if (currentTimestamp >= 0 && currentTimestamp < timestamps.size()) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBarView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBarView.java index 48fe8cc71..f258d3299 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBarView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBarView.java @@ -310,9 +310,7 @@ public class SeekBarView extends FrameLayout { if (separatorsCount > 1) { int value = Math.round((separatorsCount - 1) * progress); if (!stop && value != lastValue) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(this); } lastValue = value; } @@ -698,9 +696,7 @@ public class SeekBarView extends FrameLayout { if (timestampIndex != currentTimestamp) { timestampLabel[1] = timestampLabel[0]; if (pressed) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(this); } if (timestampIndex >= 0 && timestampIndex < timestamps.size()) { CharSequence label = timestamps.get(timestampIndex).second; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java index 18b7175d9..1c2389692 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java @@ -8,6 +8,8 @@ package org.telegram.ui.Components; +import static org.telegram.messenger.AndroidUtilities.dp; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; @@ -128,6 +130,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi private View selectedCountView; private TextView pickerBottomLayout; private FrameLayout bulletinContainer; + public FrameLayout bulletinContainer2; private LinearLayout sharesCountLayout; private AnimatorSet animatorSet; private RecyclerListView topicsGridView; @@ -233,7 +236,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi rect = new RectF(); searchBackground = new View(context); - searchBackground.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(18), getThemedColor(darkTheme ? Theme.key_voipgroup_searchBackground : Theme.key_dialogSearchBackground))); + searchBackground.setBackgroundDrawable(Theme.createRoundRectDrawable(dp(18), getThemedColor(darkTheme ? Theme.key_voipgroup_searchBackground : Theme.key_dialogSearchBackground))); addView(searchBackground, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.TOP, 14, 0, 14, 0)); slidingView = new View(context) { @@ -259,7 +262,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi paint.setShader(linearGradient); } rect.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); - canvas.drawRoundRect(rect, AndroidUtilities.dp(18), AndroidUtilities.dp(18), paint); + canvas.drawRoundRect(rect, dp(18), dp(18), paint); } }; addView(slidingView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.TOP, 14, 0, 14, 0)); @@ -311,13 +314,13 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int width = MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(28); + int width = MeasureSpec.getSize(widthMeasureSpec) - dp(28); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) leftTab.getLayoutParams(); layoutParams.width = width / 2; layoutParams = (FrameLayout.LayoutParams) rightTab.getLayoutParams(); layoutParams.width = width / 2; - layoutParams.leftMargin = width / 2 + AndroidUtilities.dp(14); + layoutParams.leftMargin = width / 2 + dp(14); layoutParams = (FrameLayout.LayoutParams) slidingView.getLayoutParams(); layoutParams.width = width / 2; @@ -344,7 +347,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi super(context); searchBackground = new View(context); - searchBackground.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(18), getThemedColor(darkTheme ? Theme.key_voipgroup_searchBackground : Theme.key_dialogSearchBackground))); + searchBackground.setBackgroundDrawable(Theme.createRoundRectDrawable(dp(18), getThemedColor(darkTheme ? Theme.key_voipgroup_searchBackground : Theme.key_dialogSearchBackground))); addView(searchBackground, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.TOP, 14, 11, 14, 0)); searchIconImageView = new ImageView(context); @@ -361,7 +364,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi return getThemedColor(darkTheme ? Theme.key_voipgroup_searchPlaceholder : Theme.key_dialogSearchIcon); } }); - progressDrawable.setSide(AndroidUtilities.dp(7)); + progressDrawable.setSide(dp(7)); clearSearchImageView.setScaleX(0.1f); clearSearchImageView.setScaleY(0.1f); clearSearchImageView.setAlpha(0.0f); @@ -384,7 +387,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi searchEditText.setImeOptions(EditorInfo.IME_ACTION_SEARCH | EditorInfo.IME_FLAG_NO_EXTRACT_UI); searchEditText.setHint(LocaleController.getString("ShareSendTo", R.string.ShareSendTo)); searchEditText.setCursorColor(getThemedColor(darkTheme ? Theme.key_voipgroup_searchText : Theme.key_featuredStickers_addedIcon)); - searchEditText.setCursorSize(AndroidUtilities.dp(20)); + searchEditText.setCursorSize(dp(20)); searchEditText.setCursorWidth(1.5f); addView(searchEditText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 40, Gravity.LEFT | Gravity.TOP, 16 + 38, 9, 16 + 30, 0)); searchEditText.addTextChangedListener(new TextWatcher() { @@ -677,24 +680,24 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi int availableHeight = totalHeight - getPaddingTop(); int size = Math.max(searchAdapter.getItemCount(), listAdapter.getItemCount() - 1); - int contentSize = AndroidUtilities.dp(103) + AndroidUtilities.dp(48) + Math.max(2, (int) Math.ceil(size / 4.0f)) * AndroidUtilities.dp(103) + backgroundPaddingTop; + int contentSize = dp(103) + dp(48) + Math.max(2, (int) Math.ceil(size / 4.0f)) * dp(103) + backgroundPaddingTop; if (topicsGridView.getVisibility() != View.GONE) { - int topicsSize = AndroidUtilities.dp(103) + AndroidUtilities.dp(48) + Math.max(2, (int) Math.ceil((shareTopicsAdapter.getItemCount() - 1) / 4.0f)) * AndroidUtilities.dp(103) + backgroundPaddingTop; + int topicsSize = dp(103) + dp(48) + Math.max(2, (int) Math.ceil((shareTopicsAdapter.getItemCount() - 1) / 4.0f)) * dp(103) + backgroundPaddingTop; if (topicsSize > contentSize) { contentSize = AndroidUtilities.lerp(contentSize, topicsSize, topicsGridView.getAlpha()); } } - int padding = (contentSize < availableHeight ? 0 : availableHeight - (availableHeight / 5 * 3)) + AndroidUtilities.dp(8); + int padding = (contentSize < availableHeight ? 0 : availableHeight - (availableHeight / 5 * 3)) + dp(8); if (gridView.getPaddingTop() != padding) { ignoreLayout = true; - gridView.setPadding(0, padding, 0, AndroidUtilities.dp(48)); - topicsGridView.setPadding(0, padding, 0, AndroidUtilities.dp(48)); + gridView.setPadding(0, padding, 0, dp(48)); + topicsGridView.setPadding(0, padding, 0, dp(48)); ignoreLayout = false; } if (keyboardVisible && getLayoutParams().height <= 0 && searchGridView.getPaddingTop() != padding) { ignoreLayout = true; - searchGridView.setPadding(0, 0, 0, AndroidUtilities.dp(48)); + searchGridView.setPadding(0, 0, 0, dp(48)); ignoreLayout = false; } fullHeight = contentSize >= totalHeight; @@ -714,14 +717,14 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi widthSize -= backgroundPaddingLeft * 2; int keyboardSize = 0; - if (!commentTextView.isWaitingForKeyboardOpen() && keyboardSize <= AndroidUtilities.dp(20) && !commentTextView.isPopupShowing() && !commentTextView.isAnimatePopupClosing()) { + if (!commentTextView.isWaitingForKeyboardOpen() && keyboardSize <= dp(20) && !commentTextView.isPopupShowing() && !commentTextView.isAnimatePopupClosing()) { ignoreLayout = true; commentTextView.hideEmojiView(); ignoreLayout = false; } ignoreLayout = true; - if (keyboardSize <= AndroidUtilities.dp(20)) { + if (keyboardSize <= dp(20)) { if (!AndroidUtilities.isInMultiwindow) { int paddingBottom; if (keyboardVisible) { @@ -759,7 +762,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi if (commentTextView != null && commentTextView.isPopupView(child)) { if (AndroidUtilities.isInMultiwindow || AndroidUtilities.isTablet()) { if (AndroidUtilities.isTablet()) { - child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(Math.min(AndroidUtilities.dp(AndroidUtilities.isTablet() ? 200 : 320), heightSize - AndroidUtilities.statusBarHeight + getPaddingTop()), MeasureSpec.EXACTLY)); + child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(Math.min(dp(AndroidUtilities.isTablet() ? 200 : 320), heightSize - AndroidUtilities.statusBarHeight + getPaddingTop()), MeasureSpec.EXACTLY)); } else { child.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSize - AndroidUtilities.statusBarHeight + getPaddingTop(), MeasureSpec.EXACTLY)); } @@ -781,7 +784,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi if (keyboardVisible) { paddingBottom = 0; } else { - paddingBottom = keyboardSize <= AndroidUtilities.dp(20) && !AndroidUtilities.isInMultiwindow && !AndroidUtilities.isTablet() ? commentTextView.getEmojiPadding() : 0; + paddingBottom = keyboardSize <= dp(20) && !AndroidUtilities.isInMultiwindow && !AndroidUtilities.isTablet() ? commentTextView.getEmojiPadding() : 0; } setBottomClip(paddingBottom); @@ -850,12 +853,12 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (!fullHeight) { - if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getY() < topOffset - AndroidUtilities.dp(30)) { + if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getY() < topOffset - dp(30)) { dismiss(); return true; } } else { - if (ev.getAction() == MotionEvent.ACTION_DOWN && scrollOffsetY != 0 && ev.getY() < scrollOffsetY - AndroidUtilities.dp(30)) { + if (ev.getAction() == MotionEvent.ACTION_DOWN && scrollOffsetY != 0 && ev.getY() < scrollOffsetY - dp(30)) { dismiss(); return true; } @@ -883,9 +886,9 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi protected void onDraw(Canvas canvas) { canvas.save(); canvas.translate(0, currentPanTranslationY); - int y = scrollOffsetY - backgroundPaddingTop + AndroidUtilities.dp(6) + topOffset; - int top = containerViewTop = scrollOffsetY - backgroundPaddingTop - AndroidUtilities.dp(13) + topOffset; - int height = getMeasuredHeight() + AndroidUtilities.dp(30 + 30) + backgroundPaddingTop; + int y = scrollOffsetY - backgroundPaddingTop + dp(6) + topOffset; + int top = containerViewTop = scrollOffsetY - backgroundPaddingTop - dp(13) + topOffset; + int height = getMeasuredHeight() + dp(30 + 30) + backgroundPaddingTop; int statusBarHeight = 0; float radProgress = 1.0f; float pinAlpha = 0; @@ -893,38 +896,32 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi y += AndroidUtilities.statusBarHeight; final boolean pinnedToTop = fullHeight && top + backgroundPaddingTop < AndroidUtilities.statusBarHeight; top = AndroidUtilities.lerp(top + AndroidUtilities.statusBarHeight, -backgroundPaddingTop, pinAlpha = this.pinnedToTop.set(pinnedToTop)); -// top += AndroidUtilities.statusBarHeight; -// height -= AndroidUtilities.statusBarHeight; -// -// if (fullHeight) { -// if (top + backgroundPaddingTop < AndroidUtilities.statusBarHeight * 2) { -// int diff = Math.min(AndroidUtilities.statusBarHeight, AndroidUtilities.statusBarHeight * 2 - top - backgroundPaddingTop); -// top -= diff; -// height += diff; -// radProgress = 1.0f - Math.min(1.0f, (diff * 2) / (float) AndroidUtilities.statusBarHeight); -// } -// if (top + backgroundPaddingTop < AndroidUtilities.statusBarHeight) { -// statusBarHeight = Math.min(AndroidUtilities.statusBarHeight, AndroidUtilities.statusBarHeight - top - backgroundPaddingTop); -// } -// } } shadowDrawable.setBounds(0, top, getMeasuredWidth(), height); shadowDrawable.draw(canvas); -// if (radProgress != 1.0f) { -// Theme.dialogs_onlineCirclePaint.setColor(getThemedColor(darkTheme ? Theme.key_voipgroup_inviteMembersBackground : Theme.key_dialogBackground)); -// Theme.dialogs_onlineCirclePaint.setAlpha((int) (Theme.dialogs_onlineCirclePaint.getAlpha() * pinAlpha)); -// rect1.set(backgroundPaddingLeft, backgroundPaddingTop + top, getMeasuredWidth() - backgroundPaddingLeft, backgroundPaddingTop + top + AndroidUtilities.dp(24)); -// canvas.drawRoundRect(rect1, AndroidUtilities.dp(12) * radProgress, AndroidUtilities.dp(12) * radProgress, Theme.dialogs_onlineCirclePaint); -// } + if (bulletinContainer2 != null) { + if (top <= AndroidUtilities.statusBarHeight && bulletinContainer2.getChildCount() > 0) { + bulletinContainer2.setTranslationY(0); + Bulletin bulletin = Bulletin.getVisibleBulletin(); + if (bulletin != null) { + if (bulletin.getLayout() != null) { + bulletin.getLayout().setTop(true); + } + bulletin.hide(); + } + } else { + bulletinContainer2.setTranslationY(Math.max(0, top + backgroundPaddingTop - bulletinContainer2.getTop() - bulletinContainer2.getMeasuredHeight())); + } + } if (pinAlpha < 1) { - int w = AndroidUtilities.dp(36); - rect1.set((getMeasuredWidth() - w) / 2, y, (getMeasuredWidth() + w) / 2, y + AndroidUtilities.dp(4)); + int w = dp(36); + rect1.set((getMeasuredWidth() - w) / 2, y, (getMeasuredWidth() + w) / 2, y + dp(4)); Theme.dialogs_onlineCirclePaint.setColor(getThemedColor(darkTheme ? Theme.key_voipgroup_scrollUp : Theme.key_sheet_scrollUp)); Theme.dialogs_onlineCirclePaint.setAlpha((int) (Theme.dialogs_onlineCirclePaint.getAlpha() * (1f - pinAlpha))); - canvas.drawRoundRect(rect1, AndroidUtilities.dp(2), AndroidUtilities.dp(2), Theme.dialogs_onlineCirclePaint); + canvas.drawRoundRect(rect1, dp(2), dp(2), Theme.dialogs_onlineCirclePaint); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -948,7 +945,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi @Override protected void dispatchDraw(Canvas canvas) { canvas.save(); - canvas.clipRect(0, getPaddingTop() + currentPanTranslationY, getMeasuredWidth(), getMeasuredHeight() + currentPanTranslationY + AndroidUtilities.dp(50)); + canvas.clipRect(0, getPaddingTop() + currentPanTranslationY, getMeasuredWidth(), getMeasuredHeight() + currentPanTranslationY + dp(50)); super.dispatchDraw(canvas); canvas.restore(); } @@ -1023,7 +1020,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi topicsGridView.setOverScrollMode(View.OVER_SCROLL_NEVER); topicsGridView.setSelectorDrawableColor(0); topicsGridView.setItemSelectorColorProvider(i -> 0); - topicsGridView.setPadding(0, 0, 0, AndroidUtilities.dp(48)); + topicsGridView.setPadding(0, 0, 0, dp(48)); topicsGridView.setClipToPadding(false); topicsGridView.addItemDecoration(new RecyclerView.ItemDecoration() { @Override @@ -1031,11 +1028,11 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi RecyclerListView.Holder holder = (RecyclerListView.Holder) parent.getChildViewHolder(view); if (holder != null) { int pos = holder.getAdapterPosition(); - outRect.left = pos % 4 == 0 ? 0 : AndroidUtilities.dp(4); - outRect.right = pos % 4 == 3 ? 0 : AndroidUtilities.dp(4); + outRect.left = pos % 4 == 0 ? 0 : dp(4); + outRect.right = pos % 4 == 3 ? 0 : dp(4); } else { - outRect.left = AndroidUtilities.dp(4); - outRect.right = AndroidUtilities.dp(4); + outRect.left = dp(4); + outRect.right = dp(4); } } }); @@ -1084,14 +1081,14 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi @Override protected boolean allowSelectChildAtPosition(float x, float y) { - return y >= AndroidUtilities.dp(darkTheme && linkToCopy[1] != null ? 111 : 58) + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); + return y >= dp(darkTheme && linkToCopy[1] != null ? 111 : 58) + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); } @Override public void draw(Canvas canvas) { if (topicsGridView.getVisibility() != View.GONE) { canvas.save(); - canvas.clipRect(0, scrollOffsetY + AndroidUtilities.dp(darkTheme && linkToCopy[1] != null ? 111 : 58), getWidth(), getHeight()); + canvas.clipRect(0, scrollOffsetY + dp(darkTheme && linkToCopy[1] != null ? 111 : 58), getWidth(), getHeight()); } super.draw(canvas); if (topicsGridView.getVisibility() != View.GONE) { @@ -1101,7 +1098,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi }; gridView.setSelectorDrawableColor(0); gridView.setItemSelectorColorProvider(i -> 0); - gridView.setPadding(0, 0, 0, AndroidUtilities.dp(48)); + gridView.setPadding(0, 0, 0, dp(48)); gridView.setClipToPadding(false); gridView.setLayoutManager(layoutManager = new GridLayoutManager(getContext(), 4)); layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @@ -1122,11 +1119,11 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi RecyclerListView.Holder holder = (RecyclerListView.Holder) parent.getChildViewHolder(view); if (holder != null) { int pos = holder.getAdapterPosition(); - outRect.left = pos % 4 == 0 ? 0 : AndroidUtilities.dp(4); - outRect.right = pos % 4 == 3 ? 0 : AndroidUtilities.dp(4); + outRect.left = pos % 4 == 0 ? 0 : dp(4); + outRect.right = pos % 4 == 3 ? 0 : dp(4); } else { - outRect.left = AndroidUtilities.dp(4); - outRect.right = AndroidUtilities.dp(4); + outRect.left = dp(4); + outRect.right = dp(4); } } }); @@ -1157,14 +1154,14 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi @Override protected boolean allowSelectChildAtPosition(float x, float y) { - return y >= AndroidUtilities.dp(darkTheme && linkToCopy[1] != null ? 111 : 58) + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); + return y >= dp(darkTheme && linkToCopy[1] != null ? 111 : 58) + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); } @Override public void draw(Canvas canvas) { if (topicsGridView.getVisibility() != View.GONE) { canvas.save(); - canvas.clipRect(0, scrollOffsetY + AndroidUtilities.dp(darkTheme && linkToCopy[1] != null ? 111 : 58), getWidth(), getHeight()); + canvas.clipRect(0, scrollOffsetY + dp(darkTheme && linkToCopy[1] != null ? 111 : 58), getWidth(), getHeight()); } super.draw(canvas); if (topicsGridView.getVisibility() != View.GONE) { @@ -1174,7 +1171,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi }; searchGridView.setItemSelectorColorProvider(i -> 0); searchGridView.setSelectorDrawableColor(0); - searchGridView.setPadding(0, 0, 0, AndroidUtilities.dp(48)); + searchGridView.setPadding(0, 0, 0, dp(48)); searchGridView.setClipToPadding(false); searchGridView.setLayoutManager(searchLayoutManager = new FillLastGridLayoutManager(getContext(), 4, 0, searchGridView)); searchLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @@ -1215,12 +1212,12 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi outRect.left = outRect.right = 0; } else { final int pos = holder.getAdapterPosition(); - outRect.left = pos % 4 == 0 ? 0 : AndroidUtilities.dp(4); - outRect.right = pos % 4 == 3 ? 0 : AndroidUtilities.dp(4); + outRect.left = pos % 4 == 0 ? 0 : dp(4); + outRect.right = pos % 4 == 3 ? 0 : dp(4); } } else { - outRect.left = AndroidUtilities.dp(4); - outRect.right = AndroidUtilities.dp(4); + outRect.left = dp(4); + outRect.right = dp(4); } } }); @@ -1249,7 +1246,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi containerView.addView(searchGridView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 0, 0, 0, 0)); FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.getShadowHeight(), Gravity.TOP | Gravity.LEFT); - frameLayoutParams.topMargin = AndroidUtilities.dp(darkTheme && linkToCopy[1] != null ? 111 : 58); + frameLayoutParams.topMargin = dp(darkTheme && linkToCopy[1] != null ? 111 : 58); shadow[0] = new View(context); shadow[0].setBackgroundColor(getThemedColor(Theme.key_dialogShadowLine)); shadow[0].setAlpha(0.0f); @@ -1259,7 +1256,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi containerView.addView(frameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, darkTheme && linkToCopy[1] != null ? 111 : 58, Gravity.LEFT | Gravity.TOP)); frameLayoutParams = new FrameLayout.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.getShadowHeight(), Gravity.BOTTOM | Gravity.LEFT); - frameLayoutParams.bottomMargin = AndroidUtilities.dp(48); + frameLayoutParams.bottomMargin = dp(48); shadow[1] = new View(context); shadow[1].setBackgroundColor(getThemedColor(Theme.key_dialogShadowLine)); containerView.addView(shadow[1], frameLayoutParams); @@ -1269,7 +1266,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi pickerBottomLayout.setBackgroundDrawable(Theme.createSelectorWithBackgroundDrawable(getThemedColor(darkTheme ? Theme.key_voipgroup_inviteMembersBackground : Theme.key_dialogBackground), getThemedColor(darkTheme ? Theme.key_voipgroup_listSelector : Theme.key_listSelector))); pickerBottomLayout.setTextColor(getThemedColor(darkTheme ? Theme.key_voipgroup_listeningText : Theme.key_dialogTextBlue2)); pickerBottomLayout.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - pickerBottomLayout.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0); + pickerBottomLayout.setPadding(dp(18), 0, dp(18), 0); pickerBottomLayout.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); pickerBottomLayout.setGravity(Gravity.CENTER); if (darkTheme && linkToCopy[1] != null) { @@ -1321,6 +1318,9 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi bulletinContainer = new FrameLayout(context); containerView.addView(bulletinContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 100, Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0, 0, pickerBottomLayout != null ? 48 : 0)); + bulletinContainer2 = new FrameLayout(context); + containerView.addView(bulletinContainer2, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.FILL_HORIZONTAL | Gravity.TOP, 0, 0, 0, 0)); + frameLayout2 = new FrameLayout(context) { private final Paint p = new Paint(); @@ -1358,8 +1358,8 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi topBackgroundAnimator.start(); chatActivityEnterViewAnimateFromTop = 0; } - float alphaOffset = (frameLayout2.getMeasuredHeight() - AndroidUtilities.dp(48)) * (1f - getAlpha()); - shadow[1].setTranslationY(-(frameLayout2.getMeasuredHeight() - AndroidUtilities.dp(48)) + captionEditTextTopOffset + currentPanTranslationY + alphaOffset); + float alphaOffset = (frameLayout2.getMeasuredHeight() - dp(48)) * (1f - getAlpha()); + shadow[1].setTranslationY(-(frameLayout2.getMeasuredHeight() - dp(48)) + captionEditTextTopOffset + currentPanTranslationY + alphaOffset); // int newColor = getThemedColor(darkTheme ? Theme.key_voipgroup_inviteMembersBackground : Theme.key_dialogBackground); // if (color != newColor) { @@ -1455,7 +1455,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi commentTextView.setBackgroundColor(backgroundColor); commentTextView.setHint(LocaleController.getString("ShareComment", R.string.ShareComment)); commentTextView.onResume(); - commentTextView.setPadding(0, 0, AndroidUtilities.dp(84), 0); + commentTextView.setPadding(0, 0, dp(84), 0); frameLayout2.addView(commentTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT)); frameLayout2.setClipChildren(false); frameLayout2.setClipToPadding(false); @@ -1480,12 +1480,12 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi containerView.addView(writeButtonContainer, LayoutHelper.createFrame(60, 60, Gravity.RIGHT | Gravity.BOTTOM, 0, 0, 6, 10)); ImageView writeButton = new ImageView(context); - Drawable drawable = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(56), getThemedColor(Theme.key_dialogFloatingButton), getThemedColor(Build.VERSION.SDK_INT >= 21 ? Theme.key_dialogFloatingButtonPressed : Theme.key_dialogFloatingButton)); + Drawable drawable = Theme.createSimpleSelectorCircleDrawable(dp(56), getThemedColor(Theme.key_dialogFloatingButton), getThemedColor(Build.VERSION.SDK_INT >= 21 ? Theme.key_dialogFloatingButtonPressed : Theme.key_dialogFloatingButton)); if (Build.VERSION.SDK_INT < 21) { Drawable shadowDrawable = context.getResources().getDrawable(R.drawable.floating_shadow_profile).mutate(); shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.MULTIPLY)); CombinedDrawable combinedDrawable = new CombinedDrawable(shadowDrawable, drawable, 0, 0); - combinedDrawable.setIconSize(AndroidUtilities.dp(56), AndroidUtilities.dp(56)); + combinedDrawable.setIconSize(dp(56), dp(56)); drawable = combinedDrawable; } writeButton.setBackgroundDrawable(drawable); @@ -1498,7 +1498,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi @SuppressLint("NewApi") @Override public void getOutline(View view, Outline outline) { - outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56)); + outline.setOval(0, 0, dp(56), dp(56)); } }); } @@ -1508,7 +1508,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi return onSendLongClick(writeButton); }); - textPaint.setTextSize(AndroidUtilities.dp(12)); + textPaint.setTextSize(dp(12)); textPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); selectedCountView = new View(context) { @@ -1516,20 +1516,20 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi protected void onDraw(Canvas canvas) { String text = String.format("%d", Math.max(1, selectedDialogs.size())); int textSize = (int) Math.ceil(textPaint.measureText(text)); - int size = Math.max(AndroidUtilities.dp(16) + textSize, AndroidUtilities.dp(24)); + int size = Math.max(dp(16) + textSize, dp(24)); int cx = getMeasuredWidth() / 2; int cy = getMeasuredHeight() / 2; textPaint.setColor(getThemedColor(Theme.key_dialogRoundCheckBoxCheck)); paint.setColor(getThemedColor(darkTheme ? Theme.key_voipgroup_inviteMembersBackground : Theme.key_dialogBackground)); rect.set(cx - size / 2, 0, cx + size / 2, getMeasuredHeight()); - canvas.drawRoundRect(rect, AndroidUtilities.dp(12), AndroidUtilities.dp(12), paint); + canvas.drawRoundRect(rect, dp(12), dp(12), paint); paint.setColor(getThemedColor(Theme.key_dialogFloatingButton)); - rect.set(cx - size / 2 + AndroidUtilities.dp(2), AndroidUtilities.dp(2), cx + size / 2 - AndroidUtilities.dp(2), getMeasuredHeight() - AndroidUtilities.dp(2)); - canvas.drawRoundRect(rect, AndroidUtilities.dp(10), AndroidUtilities.dp(10), paint); + rect.set(cx - size / 2 + dp(2), dp(2), cx + size / 2 - dp(2), getMeasuredHeight() - dp(2)); + canvas.drawRoundRect(rect, dp(10), dp(10), paint); - canvas.drawText(text, cx - textSize / 2, AndroidUtilities.dp(16.2f), textPaint); + canvas.drawText(text, cx - textSize / 2, dp(16.2f), textPaint); } }; selectedCountView.setAlpha(0.0f); @@ -1853,9 +1853,9 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi searchView.setScaleY(0.9f + (1f - value) * 0.1f); searchView.setAlpha(1f - value); - topicsBackActionBar.getBackButton().setTranslationX(-AndroidUtilities.dp(16) * (1f - value)); - topicsBackActionBar.getTitleTextView().setTranslationY(AndroidUtilities.dp(16) * (1f - value)); - topicsBackActionBar.getSubtitleTextView().setTranslationY(AndroidUtilities.dp(16) * (1f - value)); + topicsBackActionBar.getBackButton().setTranslationX(-dp(16) * (1f - value)); + topicsBackActionBar.getTitleTextView().setTranslationY(dp(16) * (1f - value)); + topicsBackActionBar.getSubtitleTextView().setTranslationY(dp(16) * (1f - value)); topicsBackActionBar.setAlpha(value); topicsGridView.getLocationInWindow(loc); @@ -1988,7 +1988,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi sendWithoutSound.setIconColor(getThemedColor(Theme.key_windowBackgroundWhiteHintText)); } sendWithoutSound.setTextAndIcon(LocaleController.getString("SendWithoutSound", R.string.SendWithoutSound), R.drawable.input_notify_off); - sendWithoutSound.setMinimumWidth(AndroidUtilities.dp(196)); + sendWithoutSound.setMinimumWidth(dp(196)); sendPopupLayout2.addView(sendWithoutSound, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48)); sendWithoutSound.setOnClickListener(v -> { if (sendPopupWindow != null && sendPopupWindow.isShowing()) { @@ -2002,7 +2002,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi sendMessage.setIconColor(getThemedColor(Theme.key_windowBackgroundWhiteHintText)); } sendMessage.setTextAndIcon(LocaleController.getString("SendMessage", R.string.SendMessage), R.drawable.msg_send); - sendMessage.setMinimumWidth(AndroidUtilities.dp(196)); + sendMessage.setMinimumWidth(dp(196)); sendPopupLayout2.addView(sendMessage, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48)); sendMessage.setOnClickListener(v -> { if (sendPopupWindow != null && sendPopupWindow.isShowing()) { @@ -2024,17 +2024,17 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi sendPopupWindow.getContentView().setFocusableInTouchMode(true); SharedConfig.removeScheduledOrNoSoundHint(); - layout.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST)); + layout.measure(View.MeasureSpec.makeMeasureSpec(dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(dp(1000), View.MeasureSpec.AT_MOST)); sendPopupWindow.setFocusable(true); int[] location = new int[2]; view.getLocationInWindow(location); int y; - if (keyboardVisible && parentFragment != null && parentFragment.contentView.getMeasuredHeight() > AndroidUtilities.dp(58)) { + if (keyboardVisible && parentFragment != null && parentFragment.contentView.getMeasuredHeight() > dp(58)) { y = location[1] + view.getMeasuredHeight(); } else { - y = location[1] - layout.getMeasuredHeight() - AndroidUtilities.dp(2); + y = location[1] - layout.getMeasuredHeight() - dp(2); } - sendPopupWindow.showAtLocation(view, Gravity.LEFT | Gravity.TOP, location[0] + view.getMeasuredWidth() - layout.getMeasuredWidth() + AndroidUtilities.dp(8), y); + sendPopupWindow.showAtLocation(view, Gravity.LEFT | Gravity.TOP, location[0] + view.getMeasuredWidth() - layout.getMeasuredWidth() + dp(8), y); sendPopupWindow.dimBehind(); view.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); @@ -2219,7 +2219,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi } holder = (RecyclerListView.Holder) listView.findContainingViewHolder(child); - int top = child.getTop() - AndroidUtilities.dp(8); + int top = child.getTop() - dp(8); int newOffset = top > 0 && holder != null && holder.getAdapterPosition() == 0 ? top : 0; if (top >= 0 && holder != null && holder.getAdapterPosition() == 0) { lastOffset = child.getTop(); @@ -2244,7 +2244,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi } holder = (RecyclerListView.Holder) listView.findContainingViewHolder(child); - int topicsTop = child.getTop() - AndroidUtilities.dp(8); + int topicsTop = child.getTop() - dp(8); int topicsNewOffset = topicsTop > 0 && holder != null && holder.getAdapterPosition() == 0 ? topicsTop : 0; if (topicsTop >= 0 && holder != null && holder.getAdapterPosition() == 0) { lastOffset = child.getTop(); @@ -2394,8 +2394,8 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi } else { selectedCountView.invalidate(); if (!showCommentTextView(true) && animated != 0) { - selectedCountView.setPivotX(AndroidUtilities.dp(21)); - selectedCountView.setPivotY(AndroidUtilities.dp(12)); + selectedCountView.setPivotX(dp(21)); + selectedCountView.setPivotY(dp(12)); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether( ObjectAnimator.ofFloat(selectedCountView, View.SCALE_X, animated == 1 ? 1.1f : 0.9f, 1.0f), @@ -2538,13 +2538,13 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi return super.repostToCustomName(); } }; - view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, AndroidUtilities.dp(100))); + view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, dp(100))); break; } case 1: default: { view = new View(context); - view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, AndroidUtilities.dp(darkTheme && linkToCopy[1] != null ? 109 : 56))); + view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, dp(darkTheme && linkToCopy[1] != null ? 109 : 56))); break; } } @@ -2604,7 +2604,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi switch (viewType) { case 0: { view = new ShareTopicCell(context, resourcesProvider); - view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, AndroidUtilities.dp(100))); + view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, dp(100))); break; } case 1: @@ -3069,7 +3069,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi switch (viewType) { case 5: { view = new ShareDialogCell(context, darkTheme ? ShareDialogCell.TYPE_CALL : ShareDialogCell.TYPE_SHARE, resourcesProvider); - view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, AndroidUtilities.dp(100))); + view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, dp(100))); break; } case 0: { @@ -3079,7 +3079,7 @@ public class ShareAlert extends BottomSheet implements NotificationCenter.Notifi default: case 1: { view = new View(context); - view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, AndroidUtilities.dp(darkTheme && linkToCopy[1] != null ? 109 : 56))); + view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, dp(darkTheme && linkToCopy[1] != null ? 109 : 56))); break; } case 2: { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java index 0f6497c64..1506d2c9a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java @@ -9300,4 +9300,37 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter } return addPostButton; } + + public void showPremiumFloodWaitBulletin(final boolean isUpload) { + if (profileActivity == null) return; + +// final long now = System.currentTimeMillis(); +// if (now - ConnectionsManager.lastPremiumFloodWaitShown < 1000L * MessagesController.getInstance(currentAccount).uploadPremiumSpeedupNotifyPeriod) { +// return; +// } +// ConnectionsManager.lastPremiumFloodWaitShown = now; +// if (UserConfig.getInstance(currentAccount).isPremium() || MessagesController.getInstance(currentAccount).premiumFeaturesBlocked()) { +// return; +// } + + final int currentAccount = profileActivity.getCurrentAccount(); + + final float n; + if (isUpload) { + n = MessagesController.getInstance(currentAccount).uploadPremiumSpeedupUpload; + } else { + n = MessagesController.getInstance(currentAccount).uploadPremiumSpeedupDownload; + } + SpannableString boldN = new SpannableString(Double.toString(Math.round(n * 10) / 10.0).replaceAll("\\.0$", "")); + boldN.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)), 0, boldN.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + if (profileActivity.hasStoryViewer()) return; + BulletinFactory.of(profileActivity).createSimpleBulletin( + R.raw.speed_limit, + LocaleController.getString(isUpload ? R.string.UploadSpeedLimited : R.string.DownloadSpeedLimited), + AndroidUtilities.replaceCharSequence("%d", AndroidUtilities.premiumText(LocaleController.getString(isUpload ? R.string.UploadSpeedLimitedMessage : R.string.DownloadSpeedLimitedMessage), () -> { + profileActivity.presentFragment(new PremiumPreviewFragment(isUpload ? "upload_speed" : "download_speed")); + }), boldN) + ).setDuration(8000).show(true); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideChooseView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideChooseView.java index 4c00cd0b6..a68b4f10f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideChooseView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideChooseView.java @@ -182,9 +182,7 @@ public class SlideChooseView extends View { private void setOption(int index) { if (selectedIndex != index) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(this); } selectedIndex = index; if (callback != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerSetBulletinLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerSetBulletinLayout.java index 5d942e9cd..054eddab8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerSetBulletinLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickerSetBulletinLayout.java @@ -114,7 +114,7 @@ public class StickerSetBulletinLayout extends Bulletin.TwoLineLayout { imageLocation = ImageLocation.getForSticker(thumb, sticker, thumbVersion); } - if (object instanceof TLRPC.Document && MessageObject.isAnimatedStickerDocument(sticker, true) || MessageObject.isVideoSticker(sticker) || MessageObject.isGifDocument(sticker)) { + if (object instanceof TLRPC.Document && (MessageObject.isAnimatedStickerDocument(sticker, true) || MessageObject.isVideoSticker(sticker) || MessageObject.isGifDocument(sticker))) { imageView.setImage(ImageLocation.getForDocument(sticker), "50_50", imageLocation, null, 0, setObject); } else if (imageLocation != null && imageLocation.imageType == FileLoader.IMAGE_TYPE_LOTTIE) { imageView.setImage(imageLocation, "50_50", "tgs", null, setObject); @@ -205,9 +205,9 @@ public class StickerSetBulletinLayout extends Bulletin.TwoLineLayout { break; case TYPE_REPLACED_TO_FAVORITES_GIFS: final boolean isPremium = UserConfig.getInstance(UserConfig.selectedAccount).isPremium(); - if (!MessagesController.getInstance(UserConfig.selectedAccount).premiumFeaturesBlocked() || !isPremium) { - titleTextView.setText(LocaleController.formatString("LimitReachedFavoriteGifs", R.string.LimitReachedFavoriteGifs, MessagesController.getInstance(UserConfig.selectedAccount).savedGifsLimitDefault)); - CharSequence str = AndroidUtilities.premiumText(LocaleController.formatString("LimitReachedFavoriteGifsSubtitle", R.string.LimitReachedFavoriteGifsSubtitle, MessagesController.getInstance(UserConfig.selectedAccount).savedGifsLimitPremium), () -> { + if (!MessagesController.getInstance(UserConfig.selectedAccount).premiumFeaturesBlocked() && !isPremium) { + titleTextView.setText(LocaleController.formatString(R.string.LimitReachedFavoriteGifs, MessagesController.getInstance(UserConfig.selectedAccount).savedGifsLimitDefault)); + CharSequence str = AndroidUtilities.premiumText(LocaleController.formatString(R.string.LimitReachedFavoriteGifsSubtitle, MessagesController.getInstance(UserConfig.selectedAccount).savedGifsLimitPremium), () -> { Activity activity = AndroidUtilities.findActivity(context); if (activity instanceof LaunchActivity) { ((LaunchActivity) activity).presentFragment(new PremiumPreviewFragment(LimitReachedBottomSheet.limitTypeToServerString(LimitReachedBottomSheet.TYPE_GIFS))); @@ -215,8 +215,8 @@ public class StickerSetBulletinLayout extends Bulletin.TwoLineLayout { }); subtitleTextView.setText(str); } else { - titleTextView.setText(LocaleController.formatString("LimitReachedFavoriteGifs", R.string.LimitReachedFavoriteGifs, isPremium ? MessagesController.getInstance(UserConfig.selectedAccount).savedGifsLimitPremium : MessagesController.getInstance(UserConfig.selectedAccount).savedGifsLimitDefault)); - subtitleTextView.setText(LocaleController.formatString("LimitReachedFavoriteGifsSubtitlePremium", R.string.LimitReachedFavoriteGifsSubtitlePremium)); + titleTextView.setText(LocaleController.formatString(R.string.LimitReachedFavoriteGifs, isPremium ? MessagesController.getInstance(UserConfig.selectedAccount).savedGifsLimitPremium : MessagesController.getInstance(UserConfig.selectedAccount).savedGifsLimitDefault)); + subtitleTextView.setText(LocaleController.getString(R.string.LimitReachedFavoriteGifsSubtitlePremium)); } break; case TYPE_REMOVED_FROM_RECENT: diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java index 5aea3c823..08b097fd3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersAlert.java @@ -21,6 +21,8 @@ import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; @@ -35,7 +37,6 @@ import android.text.TextWatcher; import android.transition.Transition; import android.transition.TransitionManager; import android.transition.TransitionValues; -import android.util.Log; import android.util.SparseArray; import android.util.TypedValue; import android.view.Gravity; @@ -43,17 +44,21 @@ import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.animation.LinearInterpolator; import android.view.inputmethod.EditorInfo; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.collection.LongSparseArray; import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BuildVars; import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; @@ -74,6 +79,8 @@ import org.telegram.tgnet.RequestDelegate; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBarMenuItem; +import org.telegram.ui.ActionBar.ActionBarMenuSubItem; +import org.telegram.ui.ActionBar.ActionBarPopupWindow; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BottomSheet; @@ -87,6 +94,7 @@ import org.telegram.ui.Components.Premium.PremiumButtonView; import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; import org.telegram.ui.ContentPreviewViewer; import org.telegram.ui.LaunchActivity; +import org.telegram.ui.PhotoViewer; import org.telegram.ui.PremiumPreviewFragment; import org.telegram.ui.ProfileActivity; @@ -99,6 +107,8 @@ import java.util.regex.Pattern; public class StickersAlert extends BottomSheet implements NotificationCenter.NotificationCenterDelegate { + public final static boolean DISABLE_STICKER_EDITOR = !BuildVars.DEBUG_PRIVATE_VERSION; + public interface StickersAlertDelegate { void onStickerSelected(TLRPC.Document sticker, String query, Object parent, MessageObject.SendAnimationData sendAnimationData, boolean clearsInputField, boolean notify, int scheduleDate); boolean canSchedule(); @@ -123,10 +133,13 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not private Pattern urlPattern; private RecyclerListView gridView; private GridAdapter adapter; + private ItemTouchHelper dragAndDropHelper; + private TLRPC.Document draggedDocument; private LinkSpanDrawable.LinksTextView titleTextView; private TextView descriptionTextView; private ActionBarMenuItem optionsButton; - private TextView pickerBottomLayout; + private ActionBarMenuSubItem deleteItem; + private AnimatedTextView pickerBottomLayout; private PremiumButtonView premiumButtonView; private FrameLayout pickerBottomFrameLayout; private FrameLayout stickerPreviewLayout; @@ -143,6 +156,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not private Activity parentActivity; private int itemSize, itemHeight; public boolean probablyEmojis; + private boolean isEditModeEnabled; private TLRPC.TL_messages_stickerSet stickerSet; private TLRPC.Document selectedSticker; @@ -167,6 +181,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not private boolean showTooltipWhenToggle = true; private int buttonTextColorKey; + private final StickersShaker stickersShaker = new StickersShaker(); private ContentPreviewViewer.ContentPreviewViewerDelegate previewDelegate = new ContentPreviewViewer.ContentPreviewViewerDelegate() { @Override @@ -208,6 +223,52 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not removeSticker(importingSticker); } + @Override + public void deleteSticker(TLRPC.Document document) { + stickerSet.documents.remove(document); + adapter.notifyDataSetChanged(); + TLRPC.TL_stickers_removeStickerFromSet req = new TLRPC.TL_stickers_removeStickerFromSet(); + req.sticker = MediaDataController.getInputStickerSetItem(document, "").document; + ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messages_stickerSet) { + MediaDataController.getInstance(UserConfig.selectedAccount).toggleStickerSet(null, response, 2, null, false, false); + } + })); + } + + @Override + public boolean canEditSticker() { + return true; + } + + @Override + public void editSticker(TLRPC.Document document) { + final ChatActivity chatActivity; + if (parentFragment instanceof ChatActivity) { + chatActivity = (ChatActivity) parentFragment; + } else { + chatActivity = null; + } + final ArrayList photos = new ArrayList<>(); + File file = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(document, true); + if (file == null || !file.exists()) { + return; + } + AndroidUtilities.runOnUIThread(() -> { + final MediaController.PhotoEntry entry = new MediaController.PhotoEntry(0, 0, 0, file.getAbsolutePath(), 0, false, 0, 0, 0); + photos.add(entry); + PhotoViewer.getInstance().setParentActivity(parentFragment.getParentActivity(), resourcesProvider); + PhotoViewer.getInstance().openPhotoForSelect(photos, 0, PhotoViewer.SELECT_TYPE_STICKER, false, new PhotoViewer.EmptyPhotoViewerProvider() { + @Override + public boolean allowCaption() { + return false; + } + }, chatActivity); + PhotoViewer.getInstance().enableStickerMode(document); + ContentPreviewViewer.getInstance().setStickerSetForCustomSticker(stickerSet); + }, 300); + } + @Override public boolean needSend(int contentType) { return delegate != null; @@ -226,7 +287,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not return 0; } }; - + public StickersAlert(Context context, Object parentObject, TLObject object, Theme.ResourcesProvider resourcesProvider) { super(context, false, resourcesProvider); this.resourcesProvider = resourcesProvider; @@ -690,8 +751,28 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not containerView.addView(shadow[0], frameLayoutParams); gridView = new RecyclerListView(context) { + @Override + public boolean drawChild(Canvas canvas, View child, long drawingTime) { + if (child instanceof StickerEmojiCell) { + if (isEditModeEnabled) { + int pos = gridView.getChildViewHolder(child).getAdapterPosition(); + canvas.save(); + canvas.rotate(stickersShaker.getRotationValueForPos(pos), child.getLeft() + (child.getMeasuredWidth() / 2f), child.getTop() + (child.getMeasuredHeight() / 2f)); + canvas.translate(stickersShaker.getTranslateXValueForPos(pos), stickersShaker.getTranslateYValueForPos(pos)); + boolean result = super.drawChild(canvas, child, drawingTime); + canvas.restore(); + invalidate(); + return result; + } + } + return super.drawChild(canvas, child, drawingTime); + } + @Override public boolean onInterceptTouchEvent(MotionEvent event) { + if (isEditModeEnabled) { + return super.onInterceptTouchEvent(event); + } boolean result = ContentPreviewViewer.getInstance().onInterceptTouchEvent(event, gridView, 0, previewDelegate, resourcesProvider); return super.onInterceptTouchEvent(event) || result; } @@ -720,6 +801,59 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not return 1; } }); + dragAndDropHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT, 0) { + + private int movedPos = -1; + + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder source, @NonNull RecyclerView.ViewHolder target) { + if (source.getItemViewType() == GridAdapter.TYPE_ADD_STICKER) { + return false; + } + if (source.getItemViewType() != target.getItemViewType()) { + return false; + } + int fromPosition = source.getAdapterPosition(); + int toPosition = target.getAdapterPosition(); + TLRPC.Document removed = stickerSet.documents.remove(fromPosition); + stickerSet.documents.add(toPosition, removed); + adapter.notifyItemMoved(fromPosition, toPosition); + movedPos = toPosition; + return true; + } + + @Override + public int getDragDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { + if (viewHolder.getItemViewType() == GridAdapter.TYPE_ADD_STICKER) { + return 0; + } + return super.getDragDirs(recyclerView, viewHolder); + } + + @Override + public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { + super.onSelectedChanged(viewHolder, actionState); + if (actionState == ItemTouchHelper.ACTION_STATE_IDLE && draggedDocument != null && movedPos > 0) { + TLRPC.TL_stickers_changeStickerPosition req = new TLRPC.TL_stickers_changeStickerPosition(); + req.position = movedPos; + req.sticker = MediaDataController.getInputStickerSetItem(draggedDocument, "").document; + AndroidUtilities.runOnUIThread(() -> ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messages_stickerSet) { + MediaDataController.getInstance(UserConfig.selectedAccount).toggleStickerSet(null, response, 2, null, false, false); + } + })), 200); + movedPos = -1; + draggedDocument = null; + } else if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { + draggedDocument = ((StickerEmojiCell) viewHolder.itemView).getSticker(); + } + } + + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + + } + }); gridView.setAdapter(adapter = new GridAdapter(context)); gridView.setVerticalScrollBarEnabled(false); gridView.addItemDecoration(new RecyclerView.ItemDecoration() { @@ -735,7 +869,13 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not gridView.setClipToPadding(false); gridView.setEnabled(true); gridView.setGlowColor(getThemedColor(Theme.key_dialogScrollGlow)); - gridView.setOnTouchListener((v, event) -> ContentPreviewViewer.getInstance().onTouch(event, gridView, 0, stickersOnItemClickListener, previewDelegate, resourcesProvider)); + + gridView.setOnTouchListener((v, event) -> { + if (isEditModeEnabled) { + return false; + } + return ContentPreviewViewer.getInstance().onTouch(event, gridView, 0, stickersOnItemClickListener, previewDelegate, resourcesProvider); + }); gridView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { @@ -743,6 +883,13 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } }); stickersOnItemClickListener = (view, position) -> { + if (view instanceof AddStickerBtnView) { + StickersDialogs.showAddStickerDialog(stickerSet, view, parentFragment, resourcesProvider); + return; + } + if (isEditModeEnabled) { + return; + } if (stickerSetCovereds != null) { TLRPC.StickerSetCovered pack = adapter.positionsToSets.get(position); if (pack != null) { @@ -846,7 +993,11 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not containerView.addView(optionsButton, LayoutHelper.createFrame(40, 40, Gravity.TOP | Gravity.RIGHT, 0, 5, 5, 0)); optionsButton.addSubItem(1, R.drawable.msg_share, LocaleController.getString("StickersShare", R.string.StickersShare)); optionsButton.addSubItem(2, R.drawable.msg_link, LocaleController.getString("CopyLink", R.string.CopyLink)); - optionsButton.setOnClickListener(v -> optionsButton.toggleSubMenu()); + + optionsButton.setOnClickListener(v -> { + checkOptions(); + optionsButton.toggleSubMenu(); + }); optionsButton.setDelegate(this::onSubItemClick); optionsButton.setContentDescription(LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions)); optionsButton.setVisibility(inputStickerSet != null ? View.VISIBLE : View.GONE); @@ -860,10 +1011,10 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not shadow[1].setBackgroundColor(getThemedColor(Theme.key_dialogShadowLine)); containerView.addView(shadow[1], frameLayoutParams); - pickerBottomLayout = new TextView(context); + pickerBottomLayout = new AnimatedTextView(context); pickerBottomLayout.setBackground(Theme.createSelectorWithBackgroundDrawable(getThemedColor(Theme.key_dialogBackground), getThemedColor(Theme.key_listSelector))); pickerBottomLayout.setTextColor(getThemedColor(buttonTextColorKey = Theme.key_dialogTextBlue2)); - pickerBottomLayout.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + pickerBottomLayout.setTextSize(dp(14)); pickerBottomLayout.setPadding(dp(18), 0, dp(18), 0); pickerBottomLayout.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); pickerBottomLayout.setGravity(Gravity.CENTER); @@ -946,6 +1097,57 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } } + private void checkOptions() { + final MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); + boolean notInstalled = !mediaDataController.isStickerPackInstalled(stickerSet.set.id); + if (stickerSet != null && stickerSet.set != null && stickerSet.set.creator && deleteItem == null && !DISABLE_STICKER_EDITOR) { + optionsButton.addSubItem(3, R.drawable.tabs_reorder, LocaleController.getString(R.string.StickersReorder)); + optionsButton.addSubItem(4, R.drawable.msg_edit, LocaleController.getString(R.string.EditName)); + if (notInstalled) { + deleteItem = optionsButton.addSubItem(5, R.drawable.msg_delete, LocaleController.getString(R.string.Delete)); + } else { + ActionBarPopupWindow.ActionBarPopupWindowLayout moreDeleteOptions = new ActionBarPopupWindow.ActionBarPopupWindowLayout(getContext(), 0, resourcesProvider); + moreDeleteOptions.setFitItems(true); + ActionBarMenuSubItem backItem = ActionBarMenuItem.addItem(moreDeleteOptions, R.drawable.msg_arrow_back, LocaleController.getString(R.string.Back), false, resourcesProvider); + backItem.setOnClickListener(view -> optionsButton.getPopupLayout().getSwipeBack().closeForeground()); + ActionBarMenuSubItem deleteForeverItem = ActionBarMenuItem.addItem(moreDeleteOptions, 0, LocaleController.getString(R.string.StickersDeleteForEveryone), false, resourcesProvider); + int redColor = getThemedColor(Theme.key_text_RedBold); + deleteForeverItem.setColors(redColor, redColor); + deleteForeverItem.setSelectorColor(Theme.multAlpha(redColor, .1f)); + ActionBarMenuSubItem deleteForMe = ActionBarMenuItem.addItem(moreDeleteOptions, 0, LocaleController.getString(R.string.StickersRemoveForMe), false, resourcesProvider); + deleteForMe.setOnClickListener(v -> { + optionsButton.closeSubMenu(); + dismiss(); + MediaDataController.getInstance(currentAccount).toggleStickerSet(getContext(), stickerSet, 1, parentFragment, true, true); + }); + deleteForeverItem.setOnClickListener(v -> { + optionsButton.closeSubMenu(); + StickersDialogs.showDeleteForEveryOneDialog(stickerSet.set, resourcesProvider, getContext(), () -> { + dismiss(); + MediaDataController.getInstance(currentAccount).toggleStickerSet(getContext(), stickerSet, 1, parentFragment, false, false); + }); + }); + deleteItem = optionsButton.addSwipeBackItem(R.drawable.msg_delete, null, LocaleController.getString(R.string.Delete), moreDeleteOptions); + } + optionsButton.addColoredGap(); + View stickersBotBtn = new MessageContainsEmojiButton(currentAccount, getContext(), resourcesProvider, new ArrayList<>(), MessageContainsEmojiButton.STICKERS_BOT_TYPE); + stickersBotBtn.setOnClickListener(v -> { + optionsButton.closeSubMenu(); + dismiss(); + AndroidUtilities.runOnUIThread(() -> MessagesController.getInstance(currentAccount).openByUserName("stickers", parentFragment, 1), 200); + }); + stickersBotBtn.setTag(R.id.fit_width_tag, 1); + optionsButton.addSubItem(stickersBotBtn, LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT); + + int redColor = getThemedColor(Theme.key_text_RedBold); + deleteItem.setColors(redColor, redColor); + deleteItem.setSelectorColor(Theme.multAlpha(redColor, .1f)); + if (deleteItem.getRightIcon() != null) { + deleteItem.getRightIcon().setColorFilter(redColor); + } + } + } + private void updateSendButton() { int size = (int) (Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) / 2 / AndroidUtilities.density); if (importingStickers != null) { @@ -1058,6 +1260,17 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } catch (Exception e) { FileLog.e(e); } + } else if (id == 3) { + enableEditMode(); + } else if (id == 4) { + StickersDialogs.showNameEditorDialog(stickerSet.set, resourcesProvider, getContext(), arg -> { + titleTextView.setText(arg); + }); + } else if (id == 5) { + StickersDialogs.showDeleteForEveryOneDialog(stickerSet.set, resourcesProvider, getContext(), () -> { + dismiss(); + MediaDataController.getInstance(currentAccount).toggleStickerSet(getContext(), stickerSet, 1, parentFragment, false, false); + }); } } @@ -1203,7 +1416,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not type = MediaDataController.TYPE_MASK; } else if (stickerSet.set.emojis) { type = MediaDataController.TYPE_EMOJIPACKS; - }; + } try { if (error == null) { if (showTooltipWhenToggle) { @@ -1223,14 +1436,25 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not }, text, Theme.key_featuredStickers_buttonText, Theme.key_featuredStickers_addButton, Theme.key_featuredStickers_addButtonPressed); } else { String text; - if (stickerSet.set.masks) { + boolean isEditModeAvailable = stickerSet.set.creator && !DISABLE_STICKER_EDITOR; + if (isEditModeAvailable) { + text = LocaleController.getString(isEditModeEnabled ? R.string.Done : R.string.EditStickers); + } else if (stickerSet.set.masks) { text = LocaleController.formatPluralString("RemoveManyMasksCount", stickerSet.documents.size()); } else if (stickerSet.set.emojis) { text = LocaleController.formatPluralString("RemoveManyEmojiCount", stickerSet.documents.size()); } else { text = LocaleController.formatPluralString("RemoveManyStickersCount", stickerSet.documents.size()); } - if (stickerSet.set.official) { + if (isEditModeAvailable) { + setButton(v -> { + if (isEditModeEnabled) { + disableEditMode(); + } else { + enableEditMode(); + } + }, text, Theme.key_featuredStickers_buttonText, Theme.key_featuredStickers_addButton, Theme.key_featuredStickers_addButtonPressed); + } else if (stickerSet.set.official) { setButton(v -> { if (installDelegate != null) { installDelegate.onStickerSetUninstalled(); @@ -1591,6 +1815,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not @Override public void dismiss() { super.dismiss(); + stickersShaker.stopShake(false); if (!ignoreMasterDismiss && masterDismissListener != null) { masterDismissListener.run(); } @@ -1691,6 +1916,20 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not updateFields(); } } else if (id == NotificationCenter.stickersDidLoad) { + TLRPC.TL_messages_stickerSet newStickerSet = null; + if (inputStickerSet != null) { + final MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); + if (newStickerSet == null && inputStickerSet.short_name != null) { + newStickerSet = mediaDataController.getStickerSetByName(inputStickerSet.short_name); + } + if (newStickerSet == null) { + newStickerSet = mediaDataController.getStickerSetById(inputStickerSet.id); + } + } + if (newStickerSet != stickerSet) { + stickerSet = newStickerSet; + loadStickerSet(); + } updateFields(); } } @@ -1703,7 +1942,7 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not if (colorKey >= 0) { pickerBottomLayout.setTextColor(getThemedColor(buttonTextColorKey = colorKey)); } - pickerBottomLayout.setText(title); + pickerBottomLayout.setText(title, false); pickerBottomLayout.setOnClickListener(onClickListener); ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) pickerBottomLayout.getLayoutParams(); @@ -1758,6 +1997,15 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not optionsButton.setPopupItemsSelectorColor(getThemedColor(Theme.key_dialogButtonSelector)); optionsButton.redrawPopup(getThemedColor(Theme.key_actionBarDefaultSubmenuBackground)); + if (deleteItem != null) { + int redColor = getThemedColor(Theme.key_text_RedBold); + deleteItem.setColors(redColor, redColor); + deleteItem.setSelectorColor(Theme.multAlpha(redColor, .1f)); + if (deleteItem.getRightIcon() != null) { + deleteItem.getRightIcon().setColorFilter(redColor); + } + } + if (applyDescriptions) { if (Theme.isAnimatingColor() && animatingDescriptions == null) { animatingDescriptions = getThemeDescriptions(); @@ -1817,6 +2065,8 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not private class GridAdapter extends RecyclerListView.SelectionAdapter { + public static final int TYPE_ADD_STICKER = 3; + private Context context; private int stickersPerRow; private SparseArray cache = new SparseArray<>(); @@ -1846,6 +2096,9 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } return 1; } + if (stickerSet != null && stickerSet.documents.size() == position) { + return 3; + } return 0; } @@ -1873,32 +2126,41 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not case 2: view = new FeaturedStickerSetInfoCell(context, 8, true, false, resourcesProvider); break; + case TYPE_ADD_STICKER: + view = new AddStickerBtnView(context, resourcesProvider); + break; } - return new RecyclerListView.Holder(view); } @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (stickerSetCovereds != null) { switch (holder.getItemViewType()) { case 0: TLRPC.Document sticker = (TLRPC.Document) cache.get(position); - ((StickerEmojiCell) holder.itemView).setSticker(sticker, positionsToSets.get(position), false); + StickerEmojiCell cell = (StickerEmojiCell) holder.itemView; + cell.setSticker(sticker, positionsToSets.get(position), false); break; case 1: ((EmptyCell) holder.itemView).setHeight(dp(82)); break; case 2: TLRPC.StickerSetCovered stickerSetCovered = stickerSetCovereds.get((Integer) cache.get(position)); - FeaturedStickerSetInfoCell cell = (FeaturedStickerSetInfoCell) holder.itemView; - cell.setStickerSet(stickerSetCovered, false); + FeaturedStickerSetInfoCell cell2 = (FeaturedStickerSetInfoCell) holder.itemView; + cell2.setStickerSet(stickerSetCovered, false); break; } } else if (importingStickers != null) { ((StickerEmojiCell) holder.itemView).setSticker(importingStickersPaths.get(position)); } else { - ((StickerEmojiCell) holder.itemView).setSticker(stickerSet.documents.get(position), stickerSet, showEmoji); + if (holder.getItemViewType() != TYPE_ADD_STICKER) { + StickerEmojiCell cell = (StickerEmojiCell) holder.itemView; + cell.setSticker(stickerSet.documents.get(position), null, stickerSet, null, showEmoji, isEditModeEnabled); + cell.editModeIcon.setOnClickListener(v -> { + ContentPreviewViewer.getInstance().showMenuFor(cell); + }); + } } } @@ -1952,6 +2214,9 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not totalItems = importingStickersPaths.size(); } else { totalItems = stickerSet != null ? stickerSet.documents.size() : 0; + if (stickerSet != null && stickerSet.set.creator && !DISABLE_STICKER_EDITOR && !stickerSet.set.masks && !stickerSet.set.emojis) { + totalItems++; + } } super.notifyDataSetChanged(); } @@ -1982,6 +2247,42 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not } } + @SuppressLint("NotifyDataSetChanged") + public void enableEditMode() { + if (isEditModeEnabled) { + return; + } + dragAndDropHelper.attachToRecyclerView(gridView); + isEditModeEnabled = true; + stickersShaker.startShake(); + AndroidUtilities.forEachViews(gridView, view -> { + if (view instanceof StickerEmojiCell) { + ((StickerEmojiCell) view).enableEditMode(true); + } + }); + optionsButton.postDelayed(() -> adapter.notifyDataSetChanged(), 200); + optionsButton.animate().alpha(0f).start(); + pickerBottomLayout.setText(LocaleController.getString(R.string.Done), true); + } + + @SuppressLint("NotifyDataSetChanged") + public void disableEditMode() { + if (!isEditModeEnabled) { + return; + } + dragAndDropHelper.attachToRecyclerView(null); + isEditModeEnabled = false; + stickersShaker.stopShake(true); + AndroidUtilities.forEachViews(gridView, view -> { + if (view instanceof StickerEmojiCell) { + ((StickerEmojiCell) view).disableEditMode(true); + } + }); + optionsButton.postDelayed(() -> adapter.notifyDataSetChanged(), 200); + optionsButton.animate().alpha(1f).start(); + pickerBottomLayout.setText(LocaleController.getString(R.string.EditStickers), true); + } + @Override public void onBackPressed() { if (ContentPreviewViewer.getInstance().isVisible()) { @@ -1996,4 +2297,151 @@ public class StickersAlert extends BottomSheet implements NotificationCenter.Not public void setOnMasterDismiss(Runnable listener) { masterDismissListener = listener; } + + private static class AddStickerBtnView extends FrameLayout { + + public AddStickerBtnView(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + View btnView = new View(context); + Drawable circle = Theme.createRoundRectDrawable(dp(28), Theme.multAlpha(Theme.getColor(Theme.key_chat_emojiPanelIcon, resourcesProvider), .12f)); + Drawable drawable = context.getResources().getDrawable(R.drawable.filled_add_sticker).mutate(); + drawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_emojiPanelIcon, resourcesProvider), PorterDuff.Mode.MULTIPLY)); + CombinedDrawable combinedDrawable = new CombinedDrawable(circle, drawable); + combinedDrawable.setCustomSize(dp(56), dp(56)); + combinedDrawable.setIconSize(dp(24), dp(24)); + btnView.setBackground(combinedDrawable); + ScaleStateListAnimator.apply(btnView); + addView(btnView, LayoutHelper.createFrame(56, 56, Gravity.CENTER)); + } + } + + private static class StickersShaker { + private static final int MAX_SHAKERS = 6; + private final List rotateAnimators = new ArrayList<>(); + private final List translateXAnimators = new ArrayList<>(); + private final List translateYAnimators = new ArrayList<>(); + + private final List imageRotations = new ArrayList<>(); + private final List imageTranslationsX = new ArrayList<>(); + private final List imageTranslationsY = new ArrayList<>(); + + private void init() { + if (!imageRotations.isEmpty()) return; + for (int i = 0; i < MAX_SHAKERS; i++) { + imageRotations.add(0f); + imageTranslationsX.add(0f); + imageTranslationsY.add(0f); + } + } + + public float getRotationValueForPos(int pos) { + if (imageRotations.isEmpty()) return 0; + pos = pos - ((pos / MAX_SHAKERS) * MAX_SHAKERS); + return imageRotations.get(pos); + } + + public float getTranslateXValueForPos(int pos) { + if (imageTranslationsX.isEmpty()) return 0; + pos = pos - ((pos / MAX_SHAKERS) * MAX_SHAKERS); + return imageTranslationsX.get(pos); + } + + public float getTranslateYValueForPos(int pos) { + if (imageTranslationsY.isEmpty()) return 0; + pos = pos - ((pos / MAX_SHAKERS) * MAX_SHAKERS); + return imageTranslationsY.get(pos); + } + + public void startShake() { + init(); + for (int i = 0; i < MAX_SHAKERS; i++) { + final int pos = i; + int duration = 300; + long currentTime = (long) (Utilities.random.nextFloat() * duration); + + ValueAnimator rotateAnimator = ValueAnimator.ofFloat(0, -2f, 0, 2f, 0f); + rotateAnimator.addUpdateListener(animation -> { + imageRotations.set(pos, (float) animation.getAnimatedValue()); + }); + rotateAnimator.setRepeatCount(ValueAnimator.INFINITE); + rotateAnimator.setRepeatMode(ValueAnimator.RESTART); + rotateAnimator.setInterpolator(new LinearInterpolator()); + rotateAnimator.setCurrentPlayTime(currentTime); + rotateAnimator.setDuration(duration); + rotateAnimator.start(); + + float max = dp(0.5f); + ValueAnimator translateXAnimator = ValueAnimator.ofFloat(0, max, 0, -max, 0); + translateXAnimator.addUpdateListener(animation -> { + imageTranslationsX.set(pos, (float) animation.getAnimatedValue()); + }); + translateXAnimator.setRepeatCount(ValueAnimator.INFINITE); + translateXAnimator.setRepeatMode(ValueAnimator.RESTART); + translateXAnimator.setInterpolator(new LinearInterpolator()); + translateXAnimator.setCurrentPlayTime(currentTime); + translateXAnimator.setDuration((long) (duration * 1.2)); + translateXAnimator.start(); + + ValueAnimator translateYAnimator = ValueAnimator.ofFloat(0, max, 0 - max, 0); + translateYAnimator.addUpdateListener(animation -> { + imageTranslationsY.set(pos, (float) animation.getAnimatedValue()); + }); + translateYAnimator.setRepeatCount(ValueAnimator.INFINITE); + translateYAnimator.setRepeatMode(ValueAnimator.RESTART); + translateYAnimator.setInterpolator(new LinearInterpolator()); + translateYAnimator.setCurrentPlayTime(currentTime); + translateYAnimator.setDuration(duration); + translateYAnimator.start(); + + rotateAnimators.add(rotateAnimator); + translateXAnimators.add(translateXAnimator); + translateYAnimators.add(translateYAnimator); + } + } + + public void stopShake(boolean animate) { + for (int i = 0; i < rotateAnimators.size(); i++) { + final int pos = i; + rotateAnimators.get(i).cancel(); + if (animate) { + ValueAnimator animator = ValueAnimator.ofFloat(imageRotations.get(i), 0f); + animator.addUpdateListener(animation -> { + imageRotations.set(pos, (float) animation.getAnimatedValue()); + }); + animator.setDuration(100); + animator.start(); + } + } + + for (int i = 0; i < translateXAnimators.size(); i++) { + final int pos = i; + translateXAnimators.get(i).cancel(); + if (animate) { + ValueAnimator animator = ValueAnimator.ofFloat(imageTranslationsX.get(i), 0f); + animator.addUpdateListener(animation -> { + imageTranslationsX.set(pos, (float) animation.getAnimatedValue()); + }); + animator.setDuration(100); + animator.start(); + } + } + + for (int i = 0; i < translateYAnimators.size(); i++) { + final int pos = i; + translateYAnimators.get(i).cancel(); + if (animate) { + ValueAnimator animator = ValueAnimator.ofFloat(imageTranslationsY.get(i), 0f); + animator.addUpdateListener(animation -> { + imageTranslationsY.set(pos, (float) animation.getAnimatedValue()); + }); + animator.setDuration(100); + animator.start(); + } + } + + translateYAnimators.clear(); + translateXAnimators.clear(); + rotateAnimators.clear(); + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersDialogs.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersDialogs.java new file mode 100644 index 000000000..e2c87b9c3 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/StickersDialogs.java @@ -0,0 +1,244 @@ +package org.telegram.ui.Components; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.content.Context; +import android.content.DialogInterface; +import android.text.Editable; +import android.text.InputFilter; +import android.text.InputType; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.FrameLayout; +import android.widget.TextView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBarMenuItem; +import org.telegram.ui.ActionBar.ActionBarPopupWindow; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ChatActivity; +import org.telegram.ui.ContentPreviewViewer; +import org.telegram.ui.Stories.recorder.EmojiBottomSheet; + +import java.util.ArrayList; + +public class StickersDialogs { + private static int getThemedColor(int key, Theme.ResourcesProvider resourcesProvider) { + return Theme.getColor(key, resourcesProvider); + } + + public static void showNameEditorDialog(TLRPC.StickerSet set, Theme.ResourcesProvider resourcesProvider, Context context, Utilities.Callback callback) { + AlertDialog.Builder builder = new AlertDialog.Builder(context, resourcesProvider); + boolean editMode = set != null; + builder.setTitle(LocaleController.getString(editMode ? R.string.EditStickerPack : R.string.NewStickerPack)); + builder.setMessage(LocaleController.getString(R.string.StickersChooseNameForStickerPack)); + FrameLayout frameLayout = new FrameLayout(context); + frameLayout.setPadding(dp(24), 0, dp(20), 0); + final EditTextBoldCursor editText = new EditTextBoldCursor(context) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(dp(50), MeasureSpec.EXACTLY)); + } + }; + editText.setTextColor(getThemedColor(Theme.key_dialogTextBlack, resourcesProvider)); + editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); + editText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + editText.setTextColor(getThemedColor(Theme.key_dialogTextBlack, resourcesProvider)); + editText.setHandlesColor(getThemedColor(Theme.key_chat_TextSelectionCursor, resourcesProvider)); + editText.setHeaderHintColor(getThemedColor(Theme.key_windowBackgroundWhiteBlueHeader, resourcesProvider)); + editText.setSingleLine(true); + editText.setFocusable(true); + InputFilter[] inputFilters = new InputFilter[2]; + final int maxLength = 50; + inputFilters[0] = new InputFilter.LengthFilter(maxLength); + inputFilters[1] = (source, start, end, dest, dstart, dend) -> { + if (source.length() > 0 && Character.isWhitespace(source.charAt(0)) && (TextUtils.isEmpty(editText.getText()) || dstart == 0)) { + return ""; + } + return source; + }; + editText.setFilters(inputFilters); + editText.setLineColors(getThemedColor(Theme.key_windowBackgroundWhiteInputField, resourcesProvider), getThemedColor(Theme.key_windowBackgroundWhiteInputFieldActivated, resourcesProvider), getThemedColor(Theme.key_text_RedRegular, resourcesProvider)); + editText.setImeOptions(EditorInfo.IME_ACTION_DONE); + editText.setBackground(null); + editText.requestFocus(); + editText.setPadding(dp(LocaleController.isRTL ? 28 : 0), 0, dp(LocaleController.isRTL ? 0 : 28), 0); + frameLayout.addView(editText); + + NumberTextView checkTextView = new NumberTextView(context); + checkTextView.setCenterAlign(true); + checkTextView.setTextSize(15); + checkTextView.setNumber(maxLength, false); + checkTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText4)); + checkTextView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); + frameLayout.addView(checkTextView, LayoutHelper.createFrame(26, 20, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, 0, 2, 4, 0)); + editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + checkTextView.setNumber(maxLength - Character.codePointCount(s, 0, s.length()), true); + } + }); + if (editMode) { + editText.setText(set.title); + editText.setSelection(set.title.length()); + } + builder.setView(frameLayout); + builder.setCustomViewOffset(4); + builder.setPositiveButton(LocaleController.getString(editMode ? R.string.Done : R.string.Create), (dialog, i) -> { + CharSequence text = editText.getText().toString().trim(); + if (!TextUtils.isEmpty(text)) { + AndroidUtilities.hideKeyboard(editText); + dialog.dismiss(); + callback.run(text); + if (editMode) { + TLRPC.TL_stickers_renameStickerSet req = new TLRPC.TL_stickers_renameStickerSet(); + req.stickerset = MediaDataController.getInputStickerSet(set); + req.title = text.toString(); + ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messages_stickerSet) { + MediaDataController.getInstance(UserConfig.selectedAccount).toggleStickerSet(null, response, 2, null, false, false); + } + })); + } + } + }); + builder.setNegativeButton(LocaleController.getString(R.string.Cancel), (dialog, which) -> { + AndroidUtilities.hideKeyboard(editText); + dialog.dismiss(); + }); + AlertDialog alertDialog = builder.show(); + alertDialog.setDismissDialogByButtons(false); + editText.setOnEditorActionListener((view1, i, keyEvent) -> { + if (i == EditorInfo.IME_ACTION_DONE) { + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).callOnClick(); + return true; + } + return false; + }); + } + + public static void showDeleteForEveryOneDialog(TLRPC.StickerSet set, Theme.ResourcesProvider resourcesProvider, Context context, Runnable callback) { + if (set == null) return; + AlertDialog alertDialog = new AlertDialog.Builder(context, resourcesProvider) + .setTitle(LocaleController.getString(R.string.StickersDeleteStickerSetTitle)) + .setMessage(LocaleController.getString(R.string.StickersDeleteStickerSetDescription)) + .setPositiveButton(LocaleController.getString(R.string.Delete), (di, w) -> { + callback.run(); + TLRPC.TL_stickers_deleteStickerSet req = new TLRPC.TL_stickers_deleteStickerSet(); + req.stickerset = MediaDataController.getInputStickerSet(set); + ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + + })); + }) + .setNegativeButton(LocaleController.getString(R.string.Cancel), null) + .create(); + alertDialog.show(); + TextView button = (TextView) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); + if (button != null) { + button.setTextColor(getThemedColor(Theme.key_text_RedBold, resourcesProvider)); + } + } + + private static void openStickerPickerDialog(TLRPC.TL_messages_stickerSet stickerSet, BaseFragment fragment, Theme.ResourcesProvider resourcesProvider) { + EmojiBottomSheet sheet = new EmojiBottomSheet(fragment.getContext(), true, resourcesProvider); + sheet.whenDocumentSelected((parentObject, document, a) -> { + String emoji = MessageObject.findAnimatedEmojiEmoticon(document, "\uD83D\uDE00", UserConfig.selectedAccount); + if (TextUtils.isEmpty(emoji)) { + emoji = "\uD83D\uDE00"; + } + TLRPC.TL_stickers_addStickerToSet req = new TLRPC.TL_stickers_addStickerToSet(); + req.stickerset = MediaDataController.getInputStickerSet(stickerSet.set); + req.sticker = MediaDataController.getInputStickerSetItem(document, emoji); + ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messages_stickerSet) { + MediaDataController.getInstance(UserConfig.selectedAccount).toggleStickerSet(null, response, 1, null, false, false); + AndroidUtilities.runOnUIThread(() -> NotificationCenter.getInstance(UserConfig.selectedAccount).postNotificationNameOnUIThread(NotificationCenter.customStickerCreated, false, response, document), 250); + } else if (error != null) { + BulletinFactory.showError(error); + } + })); + }); + if (fragment.visibleDialog != null) { + sheet.show(); + } else { + fragment.showDialog(sheet); + } + } + + public static void showAddStickerDialog(TLRPC.TL_messages_stickerSet stickerSet, View view, BaseFragment fragment, Theme.ResourcesProvider resourcesProvider) { + Context context = fragment.getContext(); + if (!(fragment instanceof ChatActivity)) { + openStickerPickerDialog(stickerSet, fragment, resourcesProvider); + return; + } + ActionBarPopupWindow.ActionBarPopupWindowLayout previewMenu = new ActionBarPopupWindow.ActionBarPopupWindowLayout(context, R.drawable.popup_fixed_alert3, resourcesProvider, 0); + ArrayList items = new ArrayList<>(); + final ArrayList actions = new ArrayList<>(); + ArrayList icons = new ArrayList<>(); + + items.add(LocaleController.getString(R.string.StickersCreateNewSticker)); + icons.add(R.drawable.menu_sticker_add); + actions.add(0); + + items.add(LocaleController.getString(R.string.StickersAddAnExistingSticker)); + icons.add(R.drawable.menu_sticker_select); + actions.add(1); + + ActionBarPopupWindow popupWindow = new ActionBarPopupWindow(previewMenu, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT); + View.OnClickListener onItemClickListener = v -> { + int which = (int) v.getTag(); + popupWindow.dismiss(); + if (actions.get(which) == 1) { + openStickerPickerDialog(stickerSet, fragment, resourcesProvider); + } else { + ((ChatActivity) fragment).openAttachMenuForCreatingSticker(); + ContentPreviewViewer.getInstance().setStickerSetForCustomSticker(stickerSet); + } + }; + + for (int i = 0; i < items.size(); i++) { + View item = ActionBarMenuItem.addItem(previewMenu, icons.get(i), items.get(i), false, resourcesProvider); + item.setTag(i); + item.setOnClickListener(onItemClickListener); + } + + popupWindow.setDismissAnimationDuration(100); + popupWindow.setScaleOut(true); + popupWindow.setOutsideTouchable(true); + popupWindow.setClippingEnabled(true); + popupWindow.setAnimationStyle(R.style.PopupContextAnimation); + popupWindow.setFocusable(true); + previewMenu.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST)); + popupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED); + popupWindow.getContentView().setFocusableInTouchMode(true); + int[] pos = new int[2]; + view.getLocationInWindow(pos); + popupWindow.showAtLocation(view, 0, pos[0] + (view.getMeasuredWidth() / 2) - (previewMenu.getMeasuredWidth() / 2), pos[1] + (view.getMeasuredHeight() / 2) - (previewMenu.getMeasuredHeight() / 2)); + popupWindow.dimBehind(); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TopViewCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TopViewCell.java index baef2917b..18c3c27bb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TopViewCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TopViewCell.java @@ -32,11 +32,6 @@ public class TopViewCell extends LinearLayout { imageView.getImageReceiver().setAutoRepeatCount(1); imageView.getImageReceiver().setAutoRepeat(1); imageView.setOnClickListener(v -> { - RLottieDrawable lottie = imageView.getImageReceiver().getLottieAnimation(); - if (lottie != null) { - if (lottie.getCurrentFrame() < lottie.getFramesCount() - 20) return; - lottie.setProgress(0f); - } imageView.getImageReceiver().startAnimation(); }); addView(imageView, LayoutHelper.createLinear(90, 90, Gravity.CENTER, 0, 9, 0, 9)); @@ -68,6 +63,7 @@ public class TopViewCell extends LinearLayout { public void setEmoji(int iconResId) { if (lastIconResId != iconResId) { imageView.setImageDrawable(new RLottieDrawable(lastIconResId = iconResId, "" + iconResId, dp(90), dp(90))); + imageView.getImageReceiver().setAutoRepeat(2); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UItem.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UItem.java index 57fcacffe..d0a79e28b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UItem.java @@ -4,10 +4,15 @@ package org.telegram.ui.Components; import android.text.TextUtils; import android.view.View; -import org.checkerframework.checker.guieffect.qual.UI; import org.telegram.messenger.Utilities; +import org.telegram.tgnet.TLRPC; +import org.telegram.tgnet.tl.TL_stats; +import org.telegram.ui.Business.BusinessLinksActivity; import org.telegram.ui.Business.QuickRepliesController; +import org.telegram.ui.Cells.SlideIntChooseView; +import org.telegram.ui.ChannelMonetizationLayout; import org.telegram.ui.Components.ListView.AdapterWithDiffUtils; +import org.telegram.ui.StatisticActivity; import java.util.Objects; @@ -17,10 +22,12 @@ public class UItem extends AdapterWithDiffUtils.Item { public int id; public boolean checked; public boolean enabled = true; + public boolean hideDivider; public int iconResId; + public int backgroundKey; public CharSequence text, subtext, textValue; public String[] texts; - public boolean accent, red; + public boolean accent, red, transparent; public boolean include; public long dialogId; @@ -51,6 +58,18 @@ public class UItem extends AdapterWithDiffUtils.Item { return i; } + public static UItem asLargeHeader(CharSequence text) { + UItem i = new UItem(UniversalAdapter.VIEW_TYPE_LARGE_HEADER, false); + i.text = text; + return i; + } + + public static UItem asBlackHeader(CharSequence text) { + UItem i = new UItem(UniversalAdapter.VIEW_TYPE_BLACK_HEADER, false); + i.text = text; + return i; + } + public static UItem asTopView(CharSequence text, String setName, String emoji) { UItem i = new UItem(UniversalAdapter.VIEW_TYPE_TOPVIEW, false); i.text = text; @@ -98,6 +117,14 @@ public class UItem extends AdapterWithDiffUtils.Item { return i; } + public static UItem asButton(int id, CharSequence text, TLRPC.Document sticker) { + UItem i = new UItem(UniversalAdapter.VIEW_TYPE_TEXT, false); + i.id = id; + i.text = text; + i.object = sticker; + return i; + } + public static UItem asRippleCheck(int id, CharSequence text) { UItem i = new UItem(UniversalAdapter.VIEW_TYPE_CHECKRIPPLE, false); i.id = id; @@ -141,6 +168,25 @@ public class UItem extends AdapterWithDiffUtils.Item { return i; } + public static UItem asLargeShadow(CharSequence text) { + UItem i = new UItem(UniversalAdapter.VIEW_TYPE_LARGE_SHADOW, false); + i.text = text; + return i; + } + + public static UItem asCenterShadow(CharSequence text) { + UItem i = new UItem(UniversalAdapter.VIEW_TYPE_SHADOW, false); + i.text = text; + i.accent = true; + return i; + } + + public static UItem asProceedOverview(ChannelMonetizationLayout.ProceedOverview value) { + UItem i = new UItem(UniversalAdapter.VIEW_TYPE_PROCEED_OVERVIEW, false); + i.object = value; + return i; + } + public static UItem asShadow(int id, CharSequence text) { UItem i = new UItem(UniversalAdapter.VIEW_TYPE_SHADOW, false); i.id = id; @@ -178,6 +224,20 @@ public class UItem extends AdapterWithDiffUtils.Item { return item; } + public static UItem asIntSlideView( + int style, + int minStringResId, int min, + int valueMinStringResId, int valueStringResId, int valueMaxStringResId, int value, + int maxStringResId, int max, + Utilities.Callback whenChose + ) { + UItem item = new UItem(UniversalAdapter.VIEW_TYPE_INTSLIDE, false); + item.intValue = value; + item.intCallback = whenChose; + item.object = SlideIntChooseView.Options.make(style, min, minStringResId, valueMinStringResId, valueStringResId, valueMaxStringResId, max, maxStringResId); + return item; + } + public static UItem asQuickReply(QuickRepliesController.QuickReply quickReply) { UItem item = new UItem(UniversalAdapter.VIEW_TYPE_QUICK_REPLY, false); item.object = quickReply; @@ -190,6 +250,37 @@ public class UItem extends AdapterWithDiffUtils.Item { return item; } + public static UItem asBusinessChatLink(BusinessLinksActivity.BusinessLinkWrapper businessLink) { + UItem item = new UItem(UniversalAdapter.VIEW_TYPE_BUSINESS_LINK, false); + item.object = businessLink; + return item; + } + + public static UItem asChart(int type, int stats_dc, StatisticActivity.ChartViewData data) { + UItem item = new UItem(UniversalAdapter.VIEW_TYPE_CHART0 + type, false); + item.intValue = stats_dc; + item.object = data; + return item; + } + + public static UItem asTransaction(TL_stats.BroadcastRevenueTransaction transaction) { + UItem item = new UItem(UniversalAdapter.VIEW_TYPE_TRANSACTION, false); + item.object = transaction; + return item; + } + + public static UItem asRadioUser(Object object) { + UItem item = new UItem(UniversalAdapter.VIEW_TYPE_RADIO_USER, false); + item.object = object; + return item; + } + + public static UItem asSpace(int height) { + UItem item = new UItem(UniversalAdapter.VIEW_TYPE_SPACE, false); + item.intValue = height; + return item; + } + public UItem setCloseIcon(Runnable onCloseClick) { clickCallback = onCloseClick; return this; @@ -197,6 +288,9 @@ public class UItem extends AdapterWithDiffUtils.Item { public UItem setChecked(boolean checked) { this.checked = checked; + if (viewType == UniversalAdapter.VIEW_TYPE_FILTER_CHAT) { + viewType = UniversalAdapter.VIEW_TYPE_FILTER_CHAT_CHECK; + } return this; } @@ -223,7 +317,11 @@ public class UItem extends AdapterWithDiffUtils.Item { return ( viewType == item.viewType && id == item.id && + dialogId == item.dialogId && iconResId == item.iconResId && + backgroundKey == item.backgroundKey && + hideDivider == item.hideDivider && + transparent == item.transparent && red == item.red && accent == item.accent && TextUtils.equals(text, item.text) && diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/URLSpanCopyToClipboard.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/URLSpanCopyToClipboard.java new file mode 100644 index 000000000..c73438768 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/URLSpanCopyToClipboard.java @@ -0,0 +1,32 @@ +package org.telegram.ui.Components; + +import android.view.View; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.ui.ActionBar.BaseFragment; + +public class URLSpanCopyToClipboard extends URLSpanNoUnderline { + private BaseFragment fragment; + + public URLSpanCopyToClipboard(String url, BaseFragment fragment) { + super(url); + this.fragment = fragment; + } + + public URLSpanCopyToClipboard(String url, boolean forceNoUnderline, BaseFragment fragment) { + super(url, forceNoUnderline); + this.fragment = fragment; + } + + public URLSpanCopyToClipboard(String url, TextStyleSpan.TextStyleRun run, BaseFragment fragment) { + super(url, run); + this.fragment = fragment; + } + + @Override + public void onClick(View widget) { + String url = getURL(); + AndroidUtilities.addToClipboard(url); + BulletinFactory.of(fragment).createCopyLinkBulletin().show(); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalAdapter.java index d6b869c2e..ce98d4d6d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalAdapter.java @@ -1,31 +1,42 @@ package org.telegram.ui.Components; +import static org.telegram.messenger.AndroidUtilities.dp; + import android.content.Context; import android.graphics.Canvas; import android.text.TextUtils; -import android.util.Log; +import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.R; import org.telegram.messenger.Utilities; +import org.telegram.tgnet.TLRPC; +import org.telegram.tgnet.tl.TL_stats; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Business.BusinessLinksActivity; import org.telegram.ui.Business.QuickRepliesActivity; import org.telegram.ui.Business.QuickRepliesController; import org.telegram.ui.Cells.DialogRadioCell; import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.NotificationsCheckCell; +import org.telegram.ui.Cells.SlideIntChooseView; import org.telegram.ui.Cells.TextCell; import org.telegram.ui.Cells.TextCheckCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.Cells.TextRightIconCell; import org.telegram.ui.Cells.UserCell; +import org.telegram.ui.ChannelMonetizationLayout; +import org.telegram.ui.Charts.BaseChartView; import org.telegram.ui.Components.ListView.AdapterWithDiffUtils; +import org.telegram.ui.StatisticActivity; +import org.telegram.ui.Stories.recorder.HintView2; +import org.telegram.ui.Stories.recorder.StoryPrivacyBottomSheet; import java.util.ArrayList; @@ -34,33 +45,66 @@ public class UniversalAdapter extends AdapterWithDiffUtils { public static final int VIEW_TYPE_CUSTOM = -1; public static final int VIEW_TYPE_HEADER = 0; - public static final int VIEW_TYPE_TOPVIEW = 1; + public static final int VIEW_TYPE_BLACK_HEADER = 1; + public static final int VIEW_TYPE_TOPVIEW = 2; - public static final int VIEW_TYPE_TEXT = 2; - public static final int VIEW_TYPE_CHECK = 3; - public static final int VIEW_TYPE_TEXT_CHECK = 4; - public static final int VIEW_TYPE_ICON_TEXT_CHECK = 5; - public static final int VIEW_TYPE_SHADOW = 6; - public static final int VIEW_TYPE_CHECKRIPPLE = 7; - public static final int VIEW_TYPE_RADIO = 8; - public static final int VIEW_TYPE_FILTER_CHAT = 9; - public static final int VIEW_TYPE_USER_ADD = 10; - public static final int VIEW_TYPE_SLIDE = 11; - public static final int VIEW_TYPE_QUICK_REPLY = 12; - public static final int VIEW_TYPE_LARGE_QUICK_REPLY = 13; + public static final int VIEW_TYPE_TEXT = 3; + public static final int VIEW_TYPE_CHECK = 4; + public static final int VIEW_TYPE_TEXT_CHECK = 5; + public static final int VIEW_TYPE_ICON_TEXT_CHECK = 6; + public static final int VIEW_TYPE_SHADOW = 7; + public static final int VIEW_TYPE_LARGE_SHADOW = 8; + public static final int VIEW_TYPE_CHECKRIPPLE = 9; + public static final int VIEW_TYPE_RADIO = 10; + public static final int VIEW_TYPE_FILTER_CHAT = 11; + public static final int VIEW_TYPE_FILTER_CHAT_CHECK = 12; + public static final int VIEW_TYPE_USER_ADD = 13; + public static final int VIEW_TYPE_SLIDE = 14; + public static final int VIEW_TYPE_INTSLIDE = 15; + public static final int VIEW_TYPE_QUICK_REPLY = 16; + public static final int VIEW_TYPE_LARGE_QUICK_REPLY = 17; + public static final int VIEW_TYPE_CHART0 = 18; + public static final int VIEW_TYPE_CHART1 = 19; + public static final int VIEW_TYPE_CHART2 = 20; + public static final int VIEW_TYPE_CHART3 = 21; + + public static final int VIEW_TYPE_PROCEED_OVERVIEW = 22; + public static final int VIEW_TYPE_TRANSACTION = 23; + + public static final int VIEW_TYPE_LARGE_HEADER = 24; + public static final int VIEW_TYPE_RADIO_USER = 25; + public static final int VIEW_TYPE_SPACE = 26; + + public static final int VIEW_TYPE_BUSINESS_LINK = 27; + + public static final int VIEW_TYPE_RIGHT_ICON_TEXT = 28; + + private final RecyclerListView listView; private final Context context; private final int currentAccount; + private final int classGuid; private final Utilities.Callback2, UniversalAdapter> fillItems; private final Theme.ResourcesProvider resourcesProvider; private final ArrayList oldItems = new ArrayList<>(); private final ArrayList items = new ArrayList<>(); - public UniversalAdapter(Context context, int currentAccount, Utilities.Callback2, UniversalAdapter> fillItems, Theme.ResourcesProvider resourcesProvider) { + private BaseChartView.SharedUiComponents chartSharedUI; + + public UniversalAdapter( + RecyclerListView listView, + Context context, + int currentAccount, + int classGuid, + Utilities.Callback2, UniversalAdapter> fillItems, + Theme.ResourcesProvider resourcesProvider + ) { super(); + this.listView = listView; this.context = context; this.currentAccount = currentAccount; + this.classGuid = classGuid; this.fillItems = fillItems; this.resourcesProvider = resourcesProvider; update(false); @@ -195,6 +239,16 @@ public class UniversalAdapter extends AdapterWithDiffUtils { view = new HeaderCell(context, resourcesProvider); view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); break; + case VIEW_TYPE_BLACK_HEADER: + view = new HeaderCell(context, Theme.key_windowBackgroundWhiteBlackText, 17, 15, false, resourcesProvider); + view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + break; + case VIEW_TYPE_LARGE_HEADER: + HeaderCell headerCell = new HeaderCell(context, Theme.key_windowBackgroundWhiteBlackText, 23, 8, 10, false, resourcesProvider); + headerCell.setTextSize(20); + headerCell.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + view = headerCell; + break; case VIEW_TYPE_TOPVIEW: view = new TopViewCell(context, resourcesProvider); break; @@ -232,7 +286,8 @@ public class UniversalAdapter extends AdapterWithDiffUtils { }; break; case VIEW_TYPE_FILTER_CHAT: - UserCell userCell = new UserCell(context, 6, 0, false); + case VIEW_TYPE_FILTER_CHAT_CHECK: + UserCell userCell = new UserCell(context, 6, viewType == VIEW_TYPE_FILTER_CHAT_CHECK ? 3 : 0, false); userCell.setSelfAsSavedMessages(true); userCell.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); view = userCell; @@ -242,10 +297,20 @@ public class UniversalAdapter extends AdapterWithDiffUtils { userCell2.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); view = userCell2; break; + case VIEW_TYPE_RADIO_USER: + StoryPrivacyBottomSheet.UserCell userCell3 = new StoryPrivacyBottomSheet.UserCell(context, resourcesProvider); + userCell3.setIsSendAs(false, false); + userCell3.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + view = userCell3; + break; case VIEW_TYPE_SLIDE: view = new SlideChooseView(context, resourcesProvider); view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); break; + case VIEW_TYPE_INTSLIDE: + view = new SlideIntChooseView(context, resourcesProvider); + view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + break; case VIEW_TYPE_QUICK_REPLY: view = new QuickRepliesActivity.QuickReplyView(context, onReordered != null, resourcesProvider); view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); @@ -254,8 +319,39 @@ public class UniversalAdapter extends AdapterWithDiffUtils { view = new QuickRepliesActivity.LargeQuickReplyView(context, resourcesProvider); view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); break; + case VIEW_TYPE_CHART0: + case VIEW_TYPE_CHART1: + case VIEW_TYPE_CHART2: + case VIEW_TYPE_CHART3: + if (chartSharedUI == null) { + chartSharedUI = new BaseChartView.SharedUiComponents(); + } + view = new StatisticActivity.UniversalChartCell(context, currentAccount, viewType - VIEW_TYPE_CHART0, chartSharedUI, classGuid); + view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + break; + case VIEW_TYPE_TRANSACTION: + view = new ChannelMonetizationLayout.TransactionCell(context, resourcesProvider); + view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + break; + case VIEW_TYPE_PROCEED_OVERVIEW: + view = new ChannelMonetizationLayout.ProceedOverviewCell(context, resourcesProvider); + view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + break; + case VIEW_TYPE_SPACE: + view = new View(context); + view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + break; + case VIEW_TYPE_BUSINESS_LINK: + view = new BusinessLinksActivity.BusinessLinkView(context, resourcesProvider); + view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + break; + case VIEW_TYPE_RIGHT_ICON_TEXT: + view = new TextRightIconCell(context, resourcesProvider); + view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + break; default: case VIEW_TYPE_SHADOW: + case VIEW_TYPE_LARGE_SHADOW: view = new TextInfoPrivacyCell(context, resourcesProvider); break; } @@ -272,7 +368,11 @@ public class UniversalAdapter extends AdapterWithDiffUtils { private boolean hasDivider(int position) { UItem item = getItem(position); UItem nextItem = getItem(position + 1); - return item != null && nextItem != null && (nextItem.viewType != VIEW_TYPE_SHADOW) == (item.viewType != VIEW_TYPE_SHADOW); + return item != null && !item.hideDivider && nextItem != null && isShadow(nextItem.viewType) == isShadow(item.viewType); + } + + private boolean isShadow(int viewType) { + return viewType == VIEW_TYPE_SHADOW || viewType == VIEW_TYPE_LARGE_SHADOW; } @Override @@ -285,7 +385,12 @@ public class UniversalAdapter extends AdapterWithDiffUtils { final boolean divider = hasDivider(position); switch (viewType) { case VIEW_TYPE_HEADER: + case VIEW_TYPE_BLACK_HEADER: + case VIEW_TYPE_LARGE_HEADER: ((HeaderCell) holder.itemView).setText(item.text); + if (item.backgroundKey != 0) { + holder.itemView.setBackgroundColor(getThemedColor(item.backgroundKey)); + } break; case VIEW_TYPE_TOPVIEW: TopViewCell topCell = (TopViewCell) holder.itemView; @@ -298,7 +403,9 @@ public class UniversalAdapter extends AdapterWithDiffUtils { break; case VIEW_TYPE_TEXT: TextCell cell = (TextCell) holder.itemView; - if (TextUtils.isEmpty(item.textValue)) { + if (item.object instanceof TLRPC.Document) { + cell.setTextAndSticker(item.text, (TLRPC.Document) item.object, divider); + } else if (TextUtils.isEmpty(item.textValue)) { if (item.iconResId == 0) { cell.setText(item.text, divider); } else { @@ -318,6 +425,9 @@ public class UniversalAdapter extends AdapterWithDiffUtils { } else { cell.setColors(Theme.key_windowBackgroundWhiteGrayIcon, Theme.key_windowBackgroundWhiteBlackText); } + if (item.backgroundKey != 0) { + cell.setBackgroundColor(getThemedColor(item.backgroundKey)); + } break; case VIEW_TYPE_CHECK: case VIEW_TYPE_CHECKRIPPLE: @@ -356,16 +466,27 @@ public class UniversalAdapter extends AdapterWithDiffUtils { ((NotificationsCheckCell) holder.itemView).setTextAndValueAndCheck(item.text, item.subtext, item.checked, divider); break; case VIEW_TYPE_SHADOW: + case VIEW_TYPE_LARGE_SHADOW: TextInfoPrivacyCell cell2 = (TextInfoPrivacyCell) holder.itemView; if (TextUtils.isEmpty(item.text)) { - cell2.setFixedSize(12); + cell2.setFixedSize(viewType == VIEW_TYPE_LARGE_SHADOW ? 220 : 12); cell2.setText(""); } else { cell2.setFixedSize(0); cell2.setText(item.text); } - final boolean prev = prevItem != null && prevItem.viewType != viewType; - final boolean next = nextItem != null && nextItem.viewType != viewType; + if (item.accent) { // asCenterShadow + cell2.setTextGravity(Gravity.CENTER); + cell2.getTextView().setWidth(Math.min(HintView2.cutInFancyHalf(cell2.getText(), cell2.getTextView().getPaint()), AndroidUtilities.displaySize.x - dp(60))); + cell2.getTextView().setPadding(0, dp(17), 0, dp(17)); + } else { + cell2.setTextGravity(Gravity.START); + cell2.getTextView().setMinWidth(0); + cell2.getTextView().setMaxWidth(AndroidUtilities.displaySize.x); + cell2.getTextView().setPadding(0, dp(10), 0, dp(17)); + } + final boolean prev = prevItem != null && !isShadow(prevItem.viewType); + final boolean next = nextItem != null && !isShadow(nextItem.viewType); int drawable; if (prev && next) { drawable = R.drawable.greydivider; @@ -376,6 +497,9 @@ public class UniversalAdapter extends AdapterWithDiffUtils { } else { drawable = R.drawable.field_carret_empty; } + if (item.backgroundKey != 0) { + cell2.setBackgroundColor(getThemedColor(item.backgroundKey)); + } cell2.setBackground(Theme.getThemedDrawableByKey(context, drawable, Theme.key_windowBackgroundGrayShadow, resourcesProvider)); break; case VIEW_TYPE_CUSTOM: @@ -389,8 +513,12 @@ public class UniversalAdapter extends AdapterWithDiffUtils { } break; case VIEW_TYPE_FILTER_CHAT: + case VIEW_TYPE_FILTER_CHAT_CHECK: UserCell userCell = (UserCell) holder.itemView; userCell.setFromUItem(currentAccount, item, divider); + if (viewType == VIEW_TYPE_FILTER_CHAT_CHECK) { + userCell.setChecked(item.checked, false); + } break; case VIEW_TYPE_USER_ADD: UserCell userCell2 = (UserCell) holder.itemView; @@ -407,6 +535,10 @@ public class UniversalAdapter extends AdapterWithDiffUtils { } }); break; + case VIEW_TYPE_INTSLIDE: + SlideIntChooseView slideIntChooseView = (SlideIntChooseView) holder.itemView; + slideIntChooseView.set(item.intValue, (SlideIntChooseView.Options) item.object, item.intCallback); + break; case VIEW_TYPE_QUICK_REPLY: QuickRepliesActivity.QuickReplyView replyView = (QuickRepliesActivity.QuickReplyView) holder.itemView; replyView.setChecked(item.checked, false); @@ -422,9 +554,83 @@ public class UniversalAdapter extends AdapterWithDiffUtils { replyView2.set((QuickRepliesController.QuickReply) item.object, divider); } break; + case VIEW_TYPE_CHART0: + case VIEW_TYPE_CHART1: + case VIEW_TYPE_CHART2: + case VIEW_TYPE_CHART3: + ((StatisticActivity.UniversalChartCell) holder.itemView).set( + item.intValue, + (StatisticActivity.ChartViewData) item.object, + () -> { + View view = findViewByItemObject(item.object); + if (view instanceof StatisticActivity.UniversalChartCell) { + return (StatisticActivity.UniversalChartCell) view; + } + return null; + } + ); + break; + case VIEW_TYPE_TRANSACTION: + ((ChannelMonetizationLayout.TransactionCell) holder.itemView).set((TL_stats.BroadcastRevenueTransaction) item.object, divider); + break; + case VIEW_TYPE_PROCEED_OVERVIEW: + ((ChannelMonetizationLayout.ProceedOverviewCell) holder.itemView).set((ChannelMonetizationLayout.ProceedOverview) item.object); + break; + case VIEW_TYPE_RADIO_USER: + StoryPrivacyBottomSheet.UserCell userCell1 = (StoryPrivacyBottomSheet.UserCell) holder.itemView; + final boolean animated = userCell1.dialogId == (item.object instanceof TLRPC.User ? ((TLRPC.User) item.object).id : (item.object instanceof TLRPC.Chat ? -((TLRPC.Chat) item.object).id : 0)); + userCell1.setIsSendAs(false, true); + userCell1.set(item.object); + userCell1.checkBox.setVisibility(View.GONE); + userCell1.radioButton.setVisibility(View.VISIBLE); + userCell1.setChecked(item.checked, animated); + userCell1.setDivider(divider); + break; + case VIEW_TYPE_SPACE: + if (item.transparent) { + holder.itemView.setBackgroundColor(0x00000000); + } + holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, item.intValue)); + break; + case VIEW_TYPE_BUSINESS_LINK: + BusinessLinksActivity.BusinessLinkView businessLinkView = (BusinessLinksActivity.BusinessLinkView) holder.itemView; + if (item.object instanceof BusinessLinksActivity.BusinessLinkWrapper) { + businessLinkView.set((BusinessLinksActivity.BusinessLinkWrapper) item.object, divider); + } + break; + case VIEW_TYPE_RIGHT_ICON_TEXT: + TextRightIconCell textCell = (TextRightIconCell) holder.itemView; + textCell.setTextAndIcon(item.text, item.iconResId); + textCell.setDivider(divider); + if (item.backgroundKey != 0) { + textCell.setBackgroundColor(getThemedColor(item.backgroundKey)); + } + break; } } + private View findViewByItemObject(Object object) { + int position = -1; + for (int i = 0; i < getItemCount(); ++i) { + UItem item = getItem(i); + if (item != null && item.object == object) { + position = i; + break; + } + } + if (position == RecyclerListView.NO_POSITION) { + return null; + } + for (int i = 0; i < listView.getChildCount(); ++i) { + View child = listView.getChildAt(i); + int childPosition = listView.getChildAdapterPosition(child); + if (childPosition != RecyclerListView.NO_POSITION && childPosition == position) { + return child; + } + } + return null; + } + @Override public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) { updateReorder(holder, allowReorder); @@ -453,11 +659,16 @@ public class UniversalAdapter extends AdapterWithDiffUtils { viewType == VIEW_TYPE_TEXT || viewType == VIEW_TYPE_TEXT_CHECK || viewType == VIEW_TYPE_ICON_TEXT_CHECK || + viewType == VIEW_TYPE_RIGHT_ICON_TEXT || viewType == VIEW_TYPE_CHECK || viewType == VIEW_TYPE_RADIO || viewType == VIEW_TYPE_FILTER_CHAT || + viewType == VIEW_TYPE_FILTER_CHAT_CHECK || viewType == VIEW_TYPE_LARGE_QUICK_REPLY || - viewType == VIEW_TYPE_QUICK_REPLY + viewType == VIEW_TYPE_QUICK_REPLY || + viewType == VIEW_TYPE_BUSINESS_LINK || + viewType == VIEW_TYPE_TRANSACTION || + viewType == VIEW_TYPE_RADIO_USER ) && (item == null || item.enabled); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalFragment.java new file mode 100644 index 000000000..329644ee6 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalFragment.java @@ -0,0 +1,139 @@ +package org.telegram.ui.Components; + +import static org.telegram.messenger.LocaleController.formatPluralString; +import static org.telegram.messenger.LocaleController.getString; + +import android.content.Context; +import android.view.View; +import android.widget.FrameLayout; + +import androidx.recyclerview.widget.LinearLayoutManager; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.R; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.AdjustPanLayoutHelper; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BackDrawable; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.INavigationLayout; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Business.QuickRepliesController; +import org.telegram.ui.ChatActivity; +import org.telegram.ui.DialogsActivity; +import org.telegram.ui.LaunchActivity; + +import java.util.ArrayList; + +public abstract class UniversalFragment extends BaseFragment { + + public UniversalRecyclerView listView; + + @Override + public View createView(Context context) { + actionBar.setBackButtonDrawable(new BackDrawable(false)); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(getTitle()); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } + } + }); + + FrameLayout contentView = new SizeNotifierFrameLayout(context) { +// private AdjustPanLayoutHelper adjustPanLayoutHelper = new AdjustPanLayoutHelper(this) { +// @Override +// protected void onTransitionStart(boolean keyboardVisible, int contentHeight) {} +// @Override +// protected void onTransitionEnd() {} +// @Override +// protected void onPanTranslationUpdate(float y, float progress, boolean keyboardVisible) { +// if (getParentLayout() != null && getParentLayout().isPreviewOpenAnimationInProgress()) { +// return; +// } +// actionBar.setTranslationY(y); +// } +// }; +// +// @Override +// protected void onAttachedToWindow() { +// super.onAttachedToWindow(); +// adjustPanLayoutHelper.onAttach(); +// } +// +// @Override +// protected void onDetachedFromWindow() { +// super.onDetachedFromWindow(); +// adjustPanLayoutHelper.onDetach(); +// } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure( + MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY) + ); + } + }; + contentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); + + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, this::onLongClick) { + @Override + protected void onMeasure(int widthSpec, int heightSpec) { +// applyScrolledPosition(); + super.onMeasure(widthSpec, heightSpec); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + savedScrollPosition = -1; + } + }; + contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + + return fragmentView = contentView; + } + + protected abstract CharSequence getTitle(); + protected abstract void fillItems(ArrayList items, UniversalAdapter adapter); + protected abstract void onClick(UItem item, View view, int position, float x, float y); + protected abstract boolean onLongClick(UItem item, View view, int position, float x, float y); + + private int savedScrollPosition = -1; + private int savedScrollOffset; + + public void saveScrollPosition() { + if (listView != null && listView.getChildCount() > 0) { + View view = null; + int position = -1; + int top = Integer.MAX_VALUE; + for (int i = 0; i < listView.getChildCount(); i++) { + int childPosition = listView.getChildAdapterPosition(listView.getChildAt(i)); + View child = listView.getChildAt(i); + if (childPosition != RecyclerListView.NO_POSITION && child.getTop() < top) { + view = child; + position = childPosition; + top = child.getTop(); + } + } + if (view != null) { + savedScrollPosition = position; + savedScrollOffset = view.getTop(); + if (savedScrollPosition == 0 && savedScrollOffset > AndroidUtilities.dp(88)) { + savedScrollOffset = AndroidUtilities.dp(88); + } + listView.layoutManager.scrollToPositionWithOffset(position, view.getTop() - listView.getPaddingTop()); + } + } + } + + public void applyScrolledPosition() { + if (savedScrollPosition >= 0) { + listView.layoutManager.scrollToPositionWithOffset(savedScrollPosition, savedScrollOffset - listView.getPaddingTop()); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalRecyclerView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalRecyclerView.java index bd6f27238..480737cd4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalRecyclerView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalRecyclerView.java @@ -14,29 +14,62 @@ import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.Utilities; +import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.DialogCell; import org.telegram.ui.FiltersSetupActivity; import java.util.ArrayList; +import kotlinx.coroutines.android.AndroidDispatcherFactory; + public class UniversalRecyclerView extends RecyclerListView { public final LinearLayoutManager layoutManager; public final UniversalAdapter adapter; private ItemTouchHelper itemTouchHelper; + private boolean doNotDetachViews; + public void doNotDetachViews() { + doNotDetachViews = true; + } + + public UniversalRecyclerView( + BaseFragment fragment, + Utilities.Callback2, UniversalAdapter> fillItems, + Utilities.Callback5 onClick, + Utilities.Callback5Return onLongClick + ) { + this( + fragment.getContext(), + fragment.getCurrentAccount(), + fragment.getClassGuid(), + fillItems, + onClick, + onLongClick, + fragment.getResourceProvider() + ); + } + public UniversalRecyclerView( Context context, int currentAccount, + int classGuid, Utilities.Callback2, UniversalAdapter> fillItems, Utilities.Callback5 onClick, Utilities.Callback5Return onLongClick, Theme.ResourcesProvider resourcesProvider ) { super(context, resourcesProvider); - setLayoutManager(layoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)); - setAdapter(adapter = new UniversalAdapter(context, currentAccount, fillItems, resourcesProvider)); + + setLayoutManager(layoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) { + @Override + protected int getExtraLayoutSpace(State state) { + if (doNotDetachViews) return AndroidUtilities.displaySize.y; + return super.getExtraLayoutSpace(state); + } + }); + setAdapter(adapter = new UniversalAdapter(this, context, currentAccount, classGuid, fillItems, resourcesProvider)); if (onClick != null) { setOnItemClickListener((view, position, x, y) -> { @@ -66,8 +99,6 @@ public class UniversalRecyclerView extends RecyclerListView { itemAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); itemAnimator.setDurations(350); setItemAnimator(itemAnimator); - - setTranslateSelector(true); } private boolean reorderingAllowed; @@ -115,6 +146,18 @@ public class UniversalRecyclerView extends RecyclerListView { return findViewByPosition(position); } + public View findViewByItemObject(Object object) { + int position = -1; + for (int i = 0; i < adapter.getItemCount(); ++i) { + UItem item = adapter.getItem(i); + if (item != null && item.object == object) { + position = i; + break; + } + } + return findViewByPosition(position); + } + public int findPositionByItemId(int itemId) { int position = -1; for (int i = 0; i < adapter.getItemCount(); ++i) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayer.java index 3b5542ba4..c6cb67fe1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayer.java @@ -16,6 +16,7 @@ import android.graphics.SurfaceTexture; import android.media.AudioManager; import android.media.MediaFormat; import android.net.Uri; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.view.Surface; @@ -878,6 +879,18 @@ public class VideoPlayer implements Player.Listener, VideoListener, AnalyticsLis hdrInfo.maxlum = byteBuffer.getShort(17); hdrInfo.minlum = byteBuffer.getShort(19) * 0.0001f; } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + if (mediaFormat.containsKey(MediaFormat.KEY_COLOR_TRANSFER)) { + hdrInfo.colorTransfer = mediaFormat.getInteger(MediaFormat.KEY_COLOR_TRANSFER); + } + if (mediaFormat.containsKey(MediaFormat.KEY_COLOR_STANDARD)) { + hdrInfo.colorStandard = mediaFormat.getInteger(MediaFormat.KEY_COLOR_STANDARD); + } + if (mediaFormat.containsKey(MediaFormat.KEY_COLOR_RANGE)) { + hdrInfo.colorRange = mediaFormat.getInteger(MediaFormat.KEY_COLOR_RANGE); + } + } } catch (Exception ignore) { hdrInfo.maxlum = hdrInfo.minlum = 0; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayerSeekBar.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayerSeekBar.java index bb9dafbda..2f8eb1d31 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayerSeekBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoPlayerSeekBar.java @@ -598,9 +598,7 @@ public class VideoPlayerSeekBar { if (timestampIndex != currentTimestamp) { timestampLabel[1] = timestampLabel[0]; if (pressed) { - try { - parentView.performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(parentView); } if (timestampIndex >= 0 && timestampIndex < timestamps.size()) { CharSequence label = timestamps.get(timestampIndex).second; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java index fe24f9893..f2b2731c0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java @@ -128,6 +128,10 @@ public class ViewPagerFixed extends FrameLayout { return true; } + protected boolean canScrollForward(MotionEvent e) { + return canScroll(e); + } + protected void onScrollEnd() {} public ViewPagerFixed(@NonNull Context context) { @@ -384,6 +388,9 @@ public class ViewPagerFixed extends FrameLayout { if (!canScroll(ev)) { return false; } + if (forward && !canScrollForward(ev)) { + return false; + } getParent().requestDisallowInterceptTouchEvent(true); maybeStartTracking = false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilersTextView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilersTextView.java index 8ffbdc205..b97e3e58c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilersTextView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/spoilers/SpoilersTextView.java @@ -11,13 +11,12 @@ import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.Region; import android.text.Layout; -import android.text.Spannable; import android.text.Spanned; -import android.text.StaticLayout; import android.view.MotionEvent; import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Emoji; import org.telegram.ui.Cells.TextSelectionHelper; import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AnimatedEmojiSpan; @@ -37,6 +36,7 @@ public class SpoilersTextView extends TextView implements TextSelectionHelper.Si public int cacheType = AnimatedEmojiDrawable.CACHE_TYPE_MESSAGES; private AnimatedEmojiSpan.EmojiGroupedSpans animatedEmoji; + private boolean useAlphaForEmoji = true; public SpoilersTextView(Context context) { this(context, true); @@ -72,6 +72,10 @@ public class SpoilersTextView extends TextView implements TextSelectionHelper.Si super.setText(text, type); } + public void setUseAlphaForEmoji(boolean useAlphaForEmoji) { + this.useAlphaForEmoji = useAlphaForEmoji; + } + @Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { super.onTextChanged(text, start, lengthBefore, lengthAfter); @@ -103,7 +107,9 @@ public class SpoilersTextView extends TextView implements TextSelectionHelper.Si path.addRect(bounds.left + pl, bounds.top + pt, bounds.right + pl, bounds.bottom + pt, Path.Direction.CW); } canvas.clipPath(path, Region.Op.DIFFERENCE); + Emoji.emojiDrawingUseAlpha = useAlphaForEmoji; super.onDraw(canvas); + Emoji.emojiDrawingUseAlpha = true; canvas.restore(); canvas.save(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java index d4d821d89..e90a75143 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContentPreviewViewer.java @@ -8,6 +8,8 @@ package org.telegram.ui; +import static org.telegram.messenger.AndroidUtilities.dp; + import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.app.Activity; @@ -15,8 +17,11 @@ import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.PixelFormat; +import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; @@ -30,12 +35,19 @@ import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; import android.view.WindowInsets; import android.view.WindowManager; import android.widget.FrameLayout; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.DocumentObject; import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; @@ -48,14 +60,16 @@ import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SendMessagesHelper; +import org.telegram.messenger.SvgHelper; import org.telegram.messenger.UserConfig; -import org.telegram.messenger.Utilities; +import org.telegram.messenger.VideoEditedInfo; import org.telegram.messenger.WebFile; +import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; -import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.ActionBarMenuSubItem; import org.telegram.ui.ActionBar.ActionBarPopupWindow; +import org.telegram.ui.ActionBar.SimpleTextView; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.ContextLinkCell; import org.telegram.ui.Cells.StickerCell; @@ -63,14 +77,22 @@ import org.telegram.ui.Cells.StickerEmojiCell; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.AnimatedEmojiDrawable; import org.telegram.ui.Components.AnimatedEmojiSpan; +import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EmojiPacksAlert; import org.telegram.ui.Components.EmojiView; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.PaintingOverlay; +import org.telegram.ui.Components.Reactions.CustomEmojiReactionsWindow; +import org.telegram.ui.Components.ReactionsContainerLayout; import org.telegram.ui.Components.RecyclerListView; +import org.telegram.ui.Components.StickersAlert; +import org.telegram.ui.Components.StickersDialogs; import org.telegram.ui.Components.SuggestEmojiView; +import org.telegram.ui.Stories.DarkThemeResourceProvider; import java.util.ArrayList; +import java.util.List; public class ContentPreviewViewer { @@ -84,6 +106,12 @@ public class ContentPreviewViewer { protected void onDraw(Canvas canvas) { ContentPreviewViewer.this.onDraw(canvas); } + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + if (child instanceof PaintingOverlay) return false; + return super.drawChild(canvas, child, drawingTime); + } } public interface ContentPreviewViewerDelegate { @@ -91,25 +119,72 @@ public class ContentPreviewViewer { return true; } - void openSet(TLRPC.InputStickerSet set, boolean clearInputField); + default void openSet(TLRPC.InputStickerSet set, boolean clearInputField) { - boolean needSend(int contentType); - default void sendSticker(TLRPC.Document sticker, String query, Object parent, boolean notify, int scheduleDate) {} - default void sendGif(Object gif, Object parent, boolean notify, int scheduleDate) {} - default void sendEmoji(TLRPC.Document emoji) {} + } - boolean canSchedule(); - boolean isInScheduleMode(); + default boolean needSend(int contentType) { + return false; + } + + default void stickerSetSelected(TLRPC.StickerSet set, String emoji) { + + } + + default void newStickerPackSelected(CharSequence name, String emoji) { + + } + + default void addToFavoriteSelected(String emoji) { + + } + + default void sendSticker() { + } + + default void sendSticker(TLRPC.Document sticker, String query, Object parent, boolean notify, int scheduleDate) { + } + + default void sendGif(Object gif, Object parent, boolean notify, int scheduleDate) { + } + + default void sendEmoji(TLRPC.Document emoji) { + } + + default boolean canSchedule() { + return false; + } + + default boolean isInScheduleMode() { + return false; + } long getDialogId(); default boolean needRemove() { return false; } + default void remove(SendMessagesHelper.ImportingSticker sticker) { } + default void deleteSticker(TLRPC.Document document) { + + } + + default boolean canEditSticker() { + return false; + } + + default void editSticker(TLRPC.Document document) { + + } + + default boolean isReplacedSticker() { + return false; + } + default String getQuery(boolean isGif) { return null; } @@ -118,7 +193,8 @@ public class ContentPreviewViewer { return true; } - default void gifAddedOrDeleted() {} + default void gifAddedOrDeleted() { + } default boolean needMenu() { return true; @@ -127,29 +203,41 @@ public class ContentPreviewViewer { default Boolean canSetAsStatus(TLRPC.Document document) { return null; } - default void setAsEmojiStatus(TLRPC.Document document, Integer until) {} + + default void setAsEmojiStatus(TLRPC.Document document, Integer until) { + } default boolean needCopy(TLRPC.Document document) { return false; } - default void copyEmoji(TLRPC.Document document) {} - default void resetTouch() {} + default void copyEmoji(TLRPC.Document document) { + } + + default void resetTouch() { + } default boolean needRemoveFromRecent(TLRPC.Document document) { return false; } - default void removeFromRecent(TLRPC.Document document) {} + + default void removeFromRecent(TLRPC.Document document) { + } default boolean isPhotoEditor() { return false; } + + default boolean isStickerEditor() { + return false; + } } public final static int CONTENT_TYPE_NONE = -1; public final static int CONTENT_TYPE_STICKER = 0; public final static int CONTENT_TYPE_GIF = 1; public final static int CONTENT_TYPE_EMOJI = 2; + public final static int CONTENT_TYPE_CUSTOM_STIKER = 3; private static TextPaint textPaint; @@ -168,6 +256,7 @@ public class ContentPreviewViewer { private ActionBarPopupWindow visibleMenu; private ContentPreviewViewerDelegate delegate; private boolean isPhotoEditor; + private boolean isStickerEditor; private boolean isRecentSticker; @@ -183,6 +272,8 @@ public class ContentPreviewViewer { private FrameLayoutDrawer containerView; private ImageReceiver centerImage = new ImageReceiver(); private ImageReceiver effectImage = new ImageReceiver(); + private PaintingOverlay paintingOverlay; + private Path paintingOverlayClipPath; private boolean isVisible = false; private float showProgress; private StaticLayout stickerEmojiLayout; @@ -193,18 +284,155 @@ public class ContentPreviewViewer { private float blurProgress; private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); private UnlockPremiumView unlockPremiumView; + private ReactionsContainerLayout reactionsLayout; + private FrameLayout reactionsLayoutContainer; private boolean closeOnDismiss; private boolean drawEffect; + private TLRPC.TL_messages_stickerSet stickerSetForCustomSticker; - private Runnable showSheetRunnable = new Runnable() { + private final Runnable showSheetRunnable = new Runnable() { @Override public void run() { if (parentActivity == null || isPhotoEditor) { return; } closeOnDismiss = true; - ActionBarPopupWindow.ActionBarPopupWindowLayout previewMenu = new ActionBarPopupWindow.ActionBarPopupWindowLayout(containerView.getContext(), R.drawable.popup_fixed_alert3, resourcesProvider); - if (currentContentType == CONTENT_TYPE_STICKER) { + int flags = 0; + if (currentContentType == CONTENT_TYPE_CUSTOM_STIKER) { + flags |= ActionBarPopupWindow.ActionBarPopupWindowLayout.FLAG_USE_SWIPEBACK; + } + ActionBarPopupWindow.ActionBarPopupWindowLayout previewMenu = new ActionBarPopupWindow.ActionBarPopupWindowLayout(containerView.getContext(), R.drawable.popup_fixed_alert3, resourcesProvider, flags); + if (currentContentType == CONTENT_TYPE_CUSTOM_STIKER) { + ArrayList items = new ArrayList<>(); + final ArrayList actions = new ArrayList<>(); + ArrayList icons = new ArrayList<>(); + + if (stickerSetForCustomSticker == null) { + items.add(LocaleController.getString("SendStickerPreview", R.string.SendStickerPreview)); + icons.add(R.drawable.msg_send); + actions.add(0); + + items.add(LocaleController.getString("AddToFavorites", R.string.AddToFavorites)); + icons.add(R.drawable.msg_fave); + actions.add(1); + } + + items.add(LocaleController.getString(delegate != null && delegate.isReplacedSticker() ? R.string.StickersReplaceSticker : R.string.AddToStickerPack)); + icons.add(delegate != null && delegate.isReplacedSticker() ? R.drawable.msg_replace : R.drawable.menu_sticker_add); + actions.add(2); + + ActionBarMenuSubItem backCell = new ActionBarMenuSubItem(parentActivity, true, false, resourcesProvider); + backCell.setItemHeight(44); + backCell.setTextAndIcon(LocaleController.getString("Back", R.string.Back), R.drawable.msg_arrow_back); + backCell.getTextView().setPadding(LocaleController.isRTL ? 0 : AndroidUtilities.dp(40), 0, LocaleController.isRTL ? AndroidUtilities.dp(40) : 0, 0); + + FrameLayout backContainer = new FrameLayout(containerView.getContext()); + LinearLayout linearLayout = new LinearLayout(containerView.getContext()); + linearLayout.setBackgroundColor(getThemedColor(Theme.key_actionBarDefaultSubmenuBackground)); + linearLayout.setOrientation(LinearLayout.VERTICAL); + RecyclerListView listView = createMyStickerPacksListView(); + listView.setOnItemClickListener((view, position) -> { + StickerPackNameView stickerPackNameView = (StickerPackNameView) view; + TLRPC.StickerSetCovered stickerSetCovered = stickerPackNameView.getCover(); + CustomEmojiReactionsWindow reactionsWindow = reactionsLayout.getReactionsWindow(); + if (reactionsWindow != null && reactionsWindow.isShowing()) { + reactionsWindow.dismiss(); + } + if (stickerSetCovered instanceof TLRPC.TL_stickerSetNoCovered) { + StickersDialogs.showNameEditorDialog(null, resourcesProvider, containerView.getContext(), arg -> { + delegate.newStickerPackSelected(arg, reactionsLayout.getSelectedEmoji()); + if (popupWindow != null) { + popupWindow.dismiss(); + } + }); + return; + } + delegate.stickerSetSelected(stickerSetCovered.set, reactionsLayout.getSelectedEmoji()); + if (popupWindow != null) { + popupWindow.dismiss(); + } + }); + backContainer.addView(backCell); + linearLayout.addView(backContainer); + linearLayout.addView(new ActionBarPopupWindow.GapView(containerView.getContext(), resourcesProvider), LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 8)); + + View.OnClickListener onItemClickListener = v -> { + if (parentActivity == null) { + return; + } + int which = (int) v.getTag(); + if (actions.get(which) == 2) { + if (stickerSetForCustomSticker == null) { + listView.requestLayout(); + linearLayout.requestLayout(); + listView.getAdapter().notifyDataSetChanged(); + previewMenu.getSwipeBack().openForeground(1); + } else { + delegate.stickerSetSelected(stickerSetForCustomSticker.set, reactionsLayout.getSelectedEmoji()); + if (popupWindow != null) { + popupWindow.dismiss(); + } + } + } else { + if (actions.get(which) == 1) { + delegate.addToFavoriteSelected(reactionsLayout.getSelectedEmoji()); + } else if (actions.get(which) == 0) { + delegate.sendSticker(); + } + if (popupWindow != null) { + popupWindow.dismiss(); + } + } + }; + for (int i = 0; i < items.size(); i++) { + View item = ActionBarMenuItem.addItem(previewMenu, icons.get(i), items.get(i), false, resourcesProvider); + item.setTag(i); + item.setOnClickListener(onItemClickListener); + } + + previewMenu.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST)); + linearLayout.addView(listView, new LinearLayout.LayoutParams(previewMenu.getMeasuredWidth() - dp(16), (int) (previewMenu.getMeasuredHeight() * 1.5f))); + previewMenu.addViewToSwipeBack(linearLayout); + backContainer.setOnClickListener(view -> previewMenu.getSwipeBack().closeForeground()); + + popupWindow = new ActionBarPopupWindow(previewMenu, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT) { + @Override + public void dismiss() { + super.dismiss(); + popupWindow = null; + menuVisible = false; + if (closeOnDismiss) { + close(); + } + } + }; + popupWindow.setPauseNotifications(true); + popupWindow.setDismissAnimationDuration(100); + popupWindow.setScaleOut(true); + popupWindow.setOutsideTouchable(false); + popupWindow.setClippingEnabled(false); + popupWindow.setAnimationStyle(R.style.PopupContextAnimation); + popupWindow.setFocusable(false); + previewMenu.measure(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(1000), View.MeasureSpec.AT_MOST)); + popupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED); + popupWindow.getContentView().setFocusableInTouchMode(true); + + int insets = 0; + int top; + if (Build.VERSION.SDK_INT >= 21 && lastInsets != null) { + insets = lastInsets.getStableInsetBottom() + lastInsets.getStableInsetTop(); + top = lastInsets.getStableInsetTop(); + } else { + top = AndroidUtilities.statusBarHeight; + } + int size = (int) (Math.min(containerView.getWidth(), containerView.getHeight() - insets) / 1.8f); + int y = (int) (moveY + Math.max(size / 2 + top, (containerView.getHeight() - insets - keyboardHeight) / 2) + size / 2); + y += AndroidUtilities.dp(24 + 60); + popupWindow.showAtLocation(containerView, 0, (int) ((containerView.getMeasuredWidth() - previewMenu.getMeasuredWidth()) / 2f), y); + showEmojiSelectorForStickers(); + menuVisible = true; + containerView.invalidate(); + } else if (currentContentType == CONTENT_TYPE_STICKER) { if (MessageObject.isPremiumSticker(currentDocument) && !AccountInstance.getInstance(currentAccount).getUserConfig().isPremium()) { showUnlockPremiumView(); menuVisible = true; @@ -232,7 +460,7 @@ public class ContentPreviewViewer { icons.add(R.drawable.msg_autodelete); actions.add(3); } - if (currentStickerSet != null && delegate.needOpen()) { + if (currentStickerSet != null && !(currentStickerSet instanceof TLRPC.TL_inputStickerSetEmpty) && delegate.needOpen()) { items.add(LocaleController.formatString("ViewPackPreview", R.string.ViewPackPreview)); icons.add(R.drawable.msg_media); actions.add(1); @@ -253,15 +481,27 @@ public class ContentPreviewViewer { icons.add(R.drawable.msg_delete); actions.add(4); } + + if (currentStickerSet != null && currentDocument != null) { + final MediaDataController mediaDataController = MediaDataController.getInstance(currentAccount); + TLRPC.TL_messages_stickerSet stickerSet = mediaDataController.getStickerSet(currentStickerSet, true); + if (stickerSet != null && stickerSet.set.creator && !StickersAlert.DISABLE_STICKER_EDITOR) { + if (delegate != null && delegate.canEditSticker() && !stickerSet.set.emojis && !stickerSet.set.masks && MessageObject.isStaticStickerDocument(currentDocument)) { + items.add(LocaleController.getString(R.string.EditSticker)); + icons.add(R.drawable.msg_edit); + actions.add(7); + } + items.add(LocaleController.getString(R.string.DeleteSticker)); + icons.add(R.drawable.msg_delete); + actions.add(8); + } + } + if (items.isEmpty()) { return; } menuVisible = true; containerView.invalidate(); - int[] ic = new int[icons.size()]; - for (int a = 0; a < icons.size(); a++) { - ic[a] = icons.get(a); - } View.OnClickListener onItemClickListener = new View.OnClickListener() { @Override @@ -293,6 +533,10 @@ public class ContentPreviewViewer { MediaDataController.getInstance(currentAccount).addRecentSticker(MediaDataController.TYPE_IMAGE, parentObject, currentDocument, (int) (System.currentTimeMillis() / 1000), true); } else if (actions.get(which) == 5) { delegate.remove(importingSticker); + } else if (actions.get(which) == 7) { + delegate.editSticker(currentDocument); + } else if (actions.get(which) == 8) { + delegate.deleteSticker(currentDocument); } if (popupWindow != null) { popupWindow.dismiss(); @@ -301,9 +545,14 @@ public class ContentPreviewViewer { }; for (int i = 0; i < items.size(); i++) { - View item = ActionBarMenuItem.addItem(previewMenu, icons.get(i), items.get(i), false, resourcesProvider); + ActionBarMenuSubItem item = ActionBarMenuItem.addItem(previewMenu, icons.get(i), items.get(i), false, resourcesProvider); item.setTag(i); item.setOnClickListener(onItemClickListener); + if (actions.get(i) == 8) { + int redColor = getThemedColor(Theme.key_text_RedBold); + item.setColors(redColor, redColor); + item.setSelectorColor(Theme.multAlpha(redColor, .1f)); + } } popupWindow = new ActionBarPopupWindow(previewMenu, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT) { @Override @@ -314,6 +563,16 @@ public class ContentPreviewViewer { if (closeOnDismiss) { close(); } + if (currentPreviewCell != null) { + if (currentPreviewCell instanceof StickerEmojiCell) { + ((StickerEmojiCell) currentPreviewCell).setScaled(false); + } else if (currentPreviewCell instanceof StickerCell) { + ((StickerCell) currentPreviewCell).setScaled(false); + } else if (currentPreviewCell instanceof ContextLinkCell) { + ((ContextLinkCell) currentPreviewCell).setScaled(false); + } + currentPreviewCell = null; + } } }; popupWindow.setPauseNotifications(true); @@ -637,6 +896,51 @@ public class ContentPreviewViewer { } }; + public void setStickerSetForCustomSticker(TLRPC.TL_messages_stickerSet stickerSetForCustomSticker) { + this.stickerSetForCustomSticker = stickerSetForCustomSticker; + } + + private void showEmojiSelectorForStickers() { + if (reactionsLayout == null) { + reactionsLayout = new ReactionsContainerLayout(ReactionsContainerLayout.TYPE_STICKER_SET_EMOJI, null, containerView.getContext(), UserConfig.selectedAccount, resourcesProvider) { + @Override + public void invalidateLoopViews() { + super.invalidateLoopViews(); + ContentPreviewViewer.this.setFocusable(getReactionsWindow() != null); + } + }; + reactionsLayout.skipEnterAnimation = true; + reactionsLayout.setPadding(0, dp(22), 0, dp(22)); + reactionsLayout.setClipChildren(false); + reactionsLayout.setClipToPadding(false); + reactionsLayout.setVisibility(View.VISIBLE); + reactionsLayout.setHint(LocaleController.getString(R.string.StickersSetEmojiForSticker)); + reactionsLayout.setBubbleOffset(-dp(105)); + reactionsLayout.setMiniBubblesOffset(-dp(14)); + reactionsLayoutContainer = new FrameLayout(containerView.getContext()); + reactionsLayoutContainer.addView(reactionsLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 72 + 22 + 22, Gravity.CENTER_HORIZONTAL, 0, 0, 0, 0)); + containerView.addView(reactionsLayoutContainer, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 0, 100, 0, 0)); + reactionsLayout.setMessage(null, null); + } + reactionsLayout.setDelegate((view, visibleReaction, longpress, addToRecent) -> { + CustomEmojiReactionsWindow reactionsWindow = reactionsLayout.getReactionsWindow(); + if (reactionsWindow != null && reactionsWindow.isShowing()) { + reactionsLayout.setSelectedReactionInclusive(visibleReaction); + reactionsWindow.getSelectAnimatedEmojiDialog().setSelectedReaction(visibleReaction); + AndroidUtilities.runOnUIThread(reactionsWindow::dismiss, 200); + } else { + reactionsLayout.setSelectedReactionInclusive(visibleReaction); + } + }); + if (!reactionsLayout.getVisibleReactionsList().isEmpty()) { + reactionsLayout.setSelectedReaction(reactionsLayout.getVisibleReactionsList().get(0)); + } + reactionsLayoutContainer.setScaleY(0.6f); + reactionsLayoutContainer.setScaleX(0.6f); + reactionsLayoutContainer.setAlpha(0f); + AndroidUtilities.runOnUIThread(() -> reactionsLayoutContainer.animate().alpha(1f).scaleX(1f).scaleY(1f).setDuration(150).setInterpolator(CubicBezierInterpolator.DEFAULT).start(), 10); + } + private void showUnlockPremiumView() { if (unlockPremiumView == null) { unlockPremiumView = new UnlockPremiumView(containerView.getContext(), UnlockPremiumView.TYPE_STICKERS, resourcesProvider); @@ -714,6 +1018,7 @@ public class ContentPreviewViewer { delegate = contentPreviewViewerDelegate; if (delegate != null) { isPhotoEditor = delegate.isPhotoEditor(); + isStickerEditor = delegate.isStickerEditor(); } if (delegate != null && !delegate.can()) { return false; @@ -920,6 +1225,7 @@ public class ContentPreviewViewer { delegate = contentPreviewViewerDelegate; if (delegate != null) { isPhotoEditor = delegate.isPhotoEditor(); + isStickerEditor = delegate.isStickerEditor(); } if (delegate != null && !delegate.can()) { return false; @@ -1066,6 +1372,7 @@ public class ContentPreviewViewer { delegate = contentPreviewViewerDelegate; if (delegate != null) { isPhotoEditor = delegate.isPhotoEditor(); + isStickerEditor = delegate.isStickerEditor(); } } @@ -1112,7 +1419,11 @@ public class ContentPreviewViewer { windowView.addView(containerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT)); containerView.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_POINTER_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { - close(); + if (isStickerEditor) { + closeWithMenu(); + } else { + close(); + } } return true; }); @@ -1128,9 +1439,7 @@ public class ContentPreviewViewer { windowLayoutParams.gravity = Gravity.TOP; windowLayoutParams.type = WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; if (Build.VERSION.SDK_INT >= 21) { - windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; - } else { - windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; } centerImage.setAspectFit(true); centerImage.setInvalidateAll(true); @@ -1141,6 +1450,21 @@ public class ContentPreviewViewer { effectImage.setParentView(containerView); } + public void setFocusable(boolean focusable) { + if (focusable) { + windowLayoutParams.flags &=~ WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + windowLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + } else { + windowLayoutParams.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + } + WindowManager wm1 = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); + try { + wm1.updateViewLayout(windowView, windowLayoutParams); + } catch (Exception e) { + FileLog.e(e); + } + } + public void setKeyboardHeight(int height) { keyboardHeight = height; } @@ -1156,7 +1480,7 @@ public class ContentPreviewViewer { backgroundDrawable.setColor(isDark ? 0x71000000 : 0x64E6E6E6); drawEffect = false; centerImage.setColorFilter(null); - if (contentType == CONTENT_TYPE_STICKER || contentType == CONTENT_TYPE_EMOJI) { + if (contentType == CONTENT_TYPE_STICKER || contentType == CONTENT_TYPE_EMOJI || contentType == CONTENT_TYPE_CUSTOM_STIKER) { if (document == null && sticker == null) { return; } @@ -1212,6 +1536,13 @@ public class ContentPreviewViewer { } } else if (sticker != null) { centerImage.setImage(sticker.path, null, null, sticker.animated ? "tgs" : null, 0); + if (sticker.videoEditedInfo != null) { + if (paintingOverlay == null) { + paintingOverlay = new PaintingOverlay(containerView.getContext()); + containerView.addView(paintingOverlay, new FrameLayout.LayoutParams(512, 512)); + } + paintingOverlay.setEntities(sticker.videoEditedInfo.mediaEntities, true, true, false); + } if (emojiPath != null) { CharSequence emoji = Emoji.replaceEmoji(emojiPath, textPaint.getFontMetricsInt(), AndroidUtilities.dp(24), false); stickerEmojiLayout = new StaticLayout(emoji, textPaint, AndroidUtilities.dp(500), Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); @@ -1293,6 +1624,13 @@ public class ContentPreviewViewer { } public void closeWithMenu() { + if (reactionsLayout != null) { + CustomEmojiReactionsWindow customEmojiReactionsWindow = reactionsLayout.getReactionsWindow(); + if (customEmojiReactionsWindow != null && customEmojiReactionsWindow.isShowing()) { + customEmojiReactionsWindow.dismiss(); + return; + } + } menuVisible = false; if (popupWindow != null) { popupWindow.dismiss(); @@ -1314,10 +1652,13 @@ public class ContentPreviewViewer { currentQuery = null; delegate = null; isVisible = false; - resourcesProvider = null; + AndroidUtilities.runOnUIThread(() -> resourcesProvider = null, 200); if (unlockPremiumView != null) { unlockPremiumView.animate().alpha(0).translationY(AndroidUtilities.dp(56)).setDuration(150).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); } + if (reactionsLayoutContainer != null) { + reactionsLayoutContainer.animate().alpha(0).setDuration(150).scaleX(0.6f).scaleY(0.6f).setInterpolator(CubicBezierInterpolator.DEFAULT).start(); + } NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.startAllHeavyOperations, 8); } @@ -1432,6 +1773,10 @@ public class ContentPreviewViewer { float scale = 0.8f * showProgress / 0.8f; size = (int) (size * scale); + if (currentContentType == CONTENT_TYPE_CUSTOM_STIKER) { + canvas.translate(0, dp(70)); + } + if (drawEffect) { float smallImageSize = size * 0.6669f; float padding = size * 0.0546875f; @@ -1448,6 +1793,22 @@ public class ContentPreviewViewer { centerImage.draw(canvas); } + if (paintingOverlay != null) { + canvas.save(); + canvas.translate(-size / 2f, -size / 2f); + canvas.scale((float) size / paintingOverlay.getWidth(), (float) size / paintingOverlay.getHeight()); + paintingOverlay.setAlpha(showProgress); + if (paintingOverlayClipPath == null) { + paintingOverlayClipPath = new Path(); + } + paintingOverlayClipPath.rewind(); + AndroidUtilities.rectTmp.set(0, 0, paintingOverlay.getWidth(), paintingOverlay.getHeight()); + paintingOverlayClipPath.addRoundRect(AndroidUtilities.rectTmp, size / 8f, size / 8f, Path.Direction.CW); + canvas.clipPath(paintingOverlayClipPath); + paintingOverlay.draw(canvas); + canvas.restore(); + } + if (currentContentType == CONTENT_TYPE_GIF && !isPhotoEditor && slideUpDrawable != null) { int w = slideUpDrawable.getIntrinsicWidth(); int h = slideUpDrawable.getIntrinsicHeight(); @@ -1489,7 +1850,14 @@ public class ContentPreviewViewer { if (showProgress == 0) { centerImage.setImageBitmap((Drawable) null); AndroidUtilities.unlockOrientation(parentActivity); - AndroidUtilities.runOnUIThread(() -> centerImage.setImageBitmap((Bitmap) null)); + AndroidUtilities.runOnUIThread(() -> { + centerImage.setImageBitmap((Bitmap) null); + if (paintingOverlay != null) { + paintingOverlay.reset(); + containerView.removeView(paintingOverlay); + paintingOverlay = null; + } + }); if (blurrBitmap != null) { blurrBitmap.recycle(); blurrBitmap = null; @@ -1513,6 +1881,7 @@ public class ContentPreviewViewer { } private boolean preparingBitmap; + private void prepareBlurBitmap() { if (parentActivity == null || preparingBitmap) { return; @@ -1535,6 +1904,14 @@ public class ContentPreviewViewer { } setParentActivity(activity); StickerEmojiCell stickerEmojiCell = (StickerEmojiCell) view; + if (currentPreviewCell instanceof StickerEmojiCell) { + ((StickerEmojiCell) currentPreviewCell).setScaled(false); + } else if (currentPreviewCell instanceof StickerCell) { + ((StickerCell) currentPreviewCell).setScaled(false); + } else if (currentPreviewCell instanceof ContextLinkCell) { + ((ContextLinkCell) currentPreviewCell).setScaled(false); + } + currentPreviewCell = stickerEmojiCell; open(stickerEmojiCell.getSticker(), stickerEmojiCell.getStickerPath(), MessageObject.findAnimatedEmojiEmoticon(stickerEmojiCell.getSticker(), null, currentAccount), delegate != null ? delegate.getQuery(false) : null, null, CONTENT_TYPE_STICKER, stickerEmojiCell.isRecent(), stickerEmojiCell.getParentObject(), resourcesProvider); AndroidUtilities.cancelRunOnUIThread(showSheetRunnable); AndroidUtilities.runOnUIThread(showSheetRunnable, 16); @@ -1543,4 +1920,149 @@ public class ContentPreviewViewer { } return false; } + + public void showCustomStickerActions(String path, VideoEditedInfo videoEditedInfo, View view, ContentPreviewViewerDelegate delegate) { + Activity activity = AndroidUtilities.findActivity(view.getContext()); + if (activity == null) { + return; + } + setParentActivity(activity); + setDelegate(delegate); + SendMessagesHelper.ImportingSticker sticker = new SendMessagesHelper.ImportingSticker(); + sticker.path = path; + sticker.videoEditedInfo = videoEditedInfo; + open(null, sticker, null, null, null, CONTENT_TYPE_CUSTOM_STIKER, false, null, new DarkThemeResourceProvider()); + AndroidUtilities.cancelRunOnUIThread(showSheetRunnable); + AndroidUtilities.runOnUIThread(showSheetRunnable, 16); + } + + private void getMyStickersRemote(TLRPC.TL_messages_getMyStickers request, List resultList) { + ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(request, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (error != null) { + return; + } + if (response instanceof TLRPC.TL_messages_myStickers) { + TLRPC.TL_messages_myStickers myStickers = (TLRPC.TL_messages_myStickers) response; + for (TLRPC.StickerSetCovered set : myStickers.sets) { + if (!set.set.emojis && !set.set.masks) { + resultList.add(set); + } + } + if (myStickers.sets.size() == request.limit) { + request.offset_id = myStickers.sets.get(myStickers.sets.size() - 1).set.id; + getMyStickersRemote(request, resultList); + } + } + })); + } + + public RecyclerListView createMyStickerPacksListView() { + if (parentActivity == null) { + return null; + } + + final List stickerSetCoveredList = new ArrayList<>(); + stickerSetCoveredList.add(new TLRPC.TL_stickerSetNoCovered()); + + final TLRPC.TL_messages_getMyStickers request = new TLRPC.TL_messages_getMyStickers(); + request.limit = 100; + getMyStickersRemote(request, stickerSetCoveredList); + + RecyclerListView listView = new RecyclerListView(parentActivity) { + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + int height = MeasureSpec.getSize(heightSpec); + int listViewTotalHeight = AndroidUtilities.dp(4) + AndroidUtilities.dp(50) * getAdapter().getItemCount(); + if (listViewTotalHeight > height) { + listViewTotalHeight = height; + } + super.onMeasure(widthSpec, MeasureSpec.makeMeasureSpec(listViewTotalHeight, MeasureSpec.EXACTLY)); + } + }; + listView.setLayoutManager(new LinearLayoutManager(parentActivity)); + listView.addItemDecoration(new RecyclerView.ItemDecoration() { + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + int p = parent.getChildAdapterPosition(view); + if (p == stickerSetCoveredList.size() - 1) { + outRect.bottom = AndroidUtilities.dp(4); + } + } + }); + listView.setAdapter(new RecyclerListView.SelectionAdapter() { + + @Override + public boolean isEnabled(RecyclerView.ViewHolder holder) { + return true; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + StickerPackNameView stickerPackNameView = new StickerPackNameView(parent.getContext(), resourcesProvider); + stickerPackNameView.setLayoutParams(new RecyclerView.LayoutParams(LayoutHelper.WRAP_CONTENT, AndroidUtilities.dp(48))); + return new RecyclerListView.Holder(stickerPackNameView); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + StickerPackNameView cell = (StickerPackNameView) holder.itemView; + cell.bind(stickerSetCoveredList.get(position)); + } + + @Override + public int getItemCount() { + return stickerSetCoveredList.size(); + } + }); + return listView; + } + + private static class StickerPackNameView extends LinearLayout { + private final BackupImageView imageView; + private final SimpleTextView textView; + private final Theme.ResourcesProvider resourcesProvider; + private TLRPC.StickerSetCovered cover; + + public StickerPackNameView(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + this.resourcesProvider = resourcesProvider; + imageView = new BackupImageView(context); + textView = new SimpleTextView(context); + textView.setTextSize(16); + textView.setTextColor(Color.WHITE); + setOrientation(LinearLayout.HORIZONTAL); + addView(imageView, LayoutHelper.createLinear(24, 24, Gravity.CENTER, 17, 0, 17, 0)); + addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 0, 0, 12, 0)); + } + + public TLRPC.StickerSetCovered getCover() { + return cover; + } + + public void bind(TLRPC.StickerSetCovered cover) { + this.cover = cover; + if (cover instanceof TLRPC.TL_stickerSetNoCovered) { + textView.setText(LocaleController.getString(R.string.NewStickerPack)); + imageView.setImageResource(R.drawable.msg_addbot); + return; + } + textView.setText(cover.set.title); + if (cover.cover != null) { + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(cover.cover.thumbs, 90); + SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(cover.cover, Theme.key_windowBackgroundGray, 1.0f, 1f, resourcesProvider); + if (svgThumb != null) { + if (thumb != null) { + imageView.setImage(ImageLocation.getForDocument(thumb, cover.cover), null, "webp", svgThumb, cover); + } else { + imageView.setImage(ImageLocation.getForDocument(cover.cover), null, "webp", svgThumb, cover); + } + } else { + imageView.setImage(ImageLocation.getForDocument(thumb, cover.cover), null, "webp", null, cover); + } + } else { + imageView.setImage(null, null, null, null, null, 0); + } + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java index 96bcf834d..d0cf93ebe 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java @@ -9,6 +9,7 @@ package org.telegram.ui; import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.getString; import android.Manifest; import android.animation.Animator; @@ -45,6 +46,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.text.SpannableStringBuilder; import android.text.TextPaint; import android.text.TextUtils; import android.transition.ChangeBounds; @@ -92,6 +94,7 @@ import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.AnimationNotificationsLocker; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.BirthdayController; import org.telegram.messenger.BotWebViewVibrationEffect; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; @@ -169,7 +172,7 @@ import org.telegram.ui.Components.ArchiveHelp; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.BlurredRecyclerView; -import org.telegram.ui.Components.BotWebViewSheet; +import org.telegram.ui.bots.BotWebViewSheet; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.ChatActivityEnterView; @@ -185,6 +188,7 @@ import org.telegram.ui.Components.FloatingDebug.FloatingDebugController; import org.telegram.ui.Components.FloatingDebug.FloatingDebugProvider; import org.telegram.ui.Components.FolderBottomSheet; import org.telegram.ui.Components.FolderDrawable; +import org.telegram.ui.Components.ForegroundColorSpanThemable; import org.telegram.ui.Components.Forum.ForumUtilities; import org.telegram.ui.Components.FragmentContextView; import org.telegram.ui.Components.ItemOptions; @@ -2729,6 +2733,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. getMessagesController().getSavedMessagesController().preloadDialogs(true); } + BirthdayController.getInstance(currentAccount).check(); + return true; } @@ -5696,6 +5702,10 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (dialogsHintCell == null || fragmentView == null || getContext() == null) { return; } + if (dialogsHintCell != null) { + dialogsHintCell.setCompact(false); + dialogsHintCell.setAvatars(currentAccount, null); + } if (isInPreviewMode()) { dialogsHintCellVisible = false; dialogsHintCell.setVisibility(View.GONE); @@ -5709,9 +5719,120 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } authHintCell.set(DialogsActivity.this, currentAccount); updateAuthHintCellVisibility(true); + } else if (folderId == 0 && !getMessagesController().premiumPurchaseBlocked() && BirthdayController.getInstance(currentAccount).contains()) { + BirthdayController.BirthdayState state = BirthdayController.getInstance(currentAccount).getState(); + ArrayList users = state.today; + dialogsHintCellVisible = true; + dialogsHintCell.setVisibility(View.VISIBLE); + dialogsHintCell.setCompact(true); + dialogsHintCell.setOnClickListener(v -> UserSelectorBottomSheet.open(0, state)); + dialogsHintCell.setAvatars(currentAccount, users); + dialogsHintCell.setText(Emoji.replaceWithRestrictedEmoji(AndroidUtilities.replaceSingleTag( + users.size() == 1 ? + LocaleController.formatString(R.string.BirthdayTodaySingleTitle, UserObject.getForcedFirstName(users.get(0))) : + LocaleController.formatPluralString("BirthdayTodayMultipleTitle", users.size()), + Theme.key_windowBackgroundWhiteValueText, + AndroidUtilities.REPLACING_TAG_TYPE_LINKBOLD, + null + ), dialogsHintCell.titleView, this::updateDialogsHint), + LocaleController.formatString(users.size() == 1 ? R.string.BirthdayTodaySingleMessage : R.string.BirthdayTodayMultipleMessage) + ); + dialogsHintCell.setOnCloseListener(v -> { + BirthdayController.getInstance(currentAccount).hide(); + ChangeBounds transition = new ChangeBounds(); + transition.setDuration(200); + TransitionManager.beginDelayedTransition((ViewGroup) dialogsHintCell.getParent(), transition); + updateDialogsHint(); + BulletinFactory.of(this) + .createSimpleBulletin(R.raw.chats_infotip, LocaleController.getString("BoostingPremiumChristmasToast", R.string.BoostingPremiumChristmasToast), 4) + .setDuration(Bulletin.DURATION_PROLONG) + .show(); + }); + updateAuthHintCellVisibility(false); + } else if ( + folderId == 0 && + MessagesController.getInstance(currentAccount).pendingSuggestions.contains("BIRTHDAY_SETUP") && + getMessagesController().getUserFull(getUserConfig().getClientUserId()) != null && + getMessagesController().getUserFull(getUserConfig().getClientUserId()).birthday == null + ) { + ContactsController.getInstance(currentAccount).loadPrivacySettings(); + dialogsHintCellVisible = true; + dialogsHintCell.setVisibility(View.VISIBLE); + dialogsHintCell.setCompact(true); + dialogsHintCell.setOnClickListener(v -> { + showDialog(AlertsCreator.createBirthdayPickerDialog(getContext(), getString(R.string.EditProfileBirthdayTitle), getString(R.string.EditProfileBirthdayButton), null, birthday -> { + TLRPC.TL_account_updateBirthday req = new TLRPC.TL_account_updateBirthday(); + req.flags |= 1; + req.birthday = birthday; + TLRPC.UserFull userFull = getMessagesController().getUserFull(getUserConfig().getClientUserId()); + TLRPC.TL_birthday oldBirthday = userFull != null ? userFull.birthday : null; + if (userFull != null) { + userFull.flags2 |= 32; + userFull.birthday = birthday; + } + getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_boolTrue) { + BulletinFactory.of(DialogsActivity.this) + .createSimpleBulletin(R.raw.contact_check, LocaleController.getString(R.string.PrivacyBirthdaySetDone)) + .setDuration(Bulletin.DURATION_PROLONG).show(); + } else { + if (userFull != null) { + if (oldBirthday == null) { + userFull.flags2 &=~ 32; + } else { + userFull.flags2 |= 32; + } + userFull.birthday = oldBirthday; + getMessagesStorage().updateUserInfo(userFull, false); + } + if (err != null && err.text != null && err.text.startsWith("FLOOD_WAIT_")) { + if (getContext() != null) { + showDialog( + new AlertDialog.Builder(getContext(), resourceProvider) + .setTitle(getString(R.string.PrivacyBirthdayTooOftenTitle)) + .setMessage(getString(R.string.PrivacyBirthdayTooOftenMessage)) + .setPositiveButton(getString(R.string.OK), null) + .create() + ); + } + } else { + BulletinFactory.of(DialogsActivity.this) + .createSimpleBulletin(R.raw.error, LocaleController.getString(R.string.UnknownError)) + .show(); + } + } + }), ConnectionsManager.RequestFlagDoNotWaitFloodWait); + + MessagesController.getInstance(currentAccount).removeSuggestion(0, "BIRTHDAY_SETUP"); + + updateDialogsHint(); + }, () -> { + BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams(); + params.transitionFromLeft = true; + params.allowNestedScroll = false; + showAsSheet(new PrivacyControlActivity(PrivacyControlActivity.PRIVACY_RULES_TYPE_BIRTHDAY), params); + }, getResourceProvider()).create()); + }); + dialogsHintCell.setText(Emoji.replaceWithRestrictedEmoji(LocaleController.getString(R.string.BirthdaySetupTitle), dialogsHintCell.titleView, this::updateDialogsHint), LocaleController.formatString(R.string.BirthdaySetupMessage)); + dialogsHintCell.setOnCloseListener(v -> { + MessagesController.getInstance(currentAccount).removeSuggestion(0, "BIRTHDAY_SETUP"); + ChangeBounds transition = new ChangeBounds(); + transition.setDuration(200); + TransitionManager.beginDelayedTransition((ViewGroup) dialogsHintCell.getParent(), transition); + updateDialogsHint(); + + BulletinFactory.of(this) + .createSimpleBulletin(R.raw.chats_infotip, LocaleController.getString(R.string.BirthdaySetupLater), LocaleController.getString(R.string.Settings), () -> { + presentFragment(new UserInfoActivity()); + }) + .setDuration(Bulletin.DURATION_PROLONG) + .show(); + }); + updateAuthHintCellVisibility(false); } else if (isPremiumChristmasHintVisible()) { dialogsHintCellVisible = true; dialogsHintCell.setVisibility(View.VISIBLE); + dialogsHintCell.setCompact(false); dialogsHintCell.setOnClickListener(v -> UserSelectorBottomSheet.open()); dialogsHintCell.setText(Emoji.replaceEmoji(AndroidUtilities.replaceSingleTag( LocaleController.getString("GiftPremiumEventAdsTitle", R.string.GiftPremiumEventAdsTitle), @@ -5734,6 +5855,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } else if (isPremiumRestoreHintVisible()) { dialogsHintCellVisible = true; dialogsHintCell.setVisibility(View.VISIBLE); + dialogsHintCell.setCompact(false); dialogsHintCell.setOnClickListener(v -> { presentFragment(new PremiumPreviewFragment("dialogs_hint").setSelectAnnualByDefault()); AndroidUtilities.runOnUIThread(() -> { @@ -5754,6 +5876,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } else if (isPremiumHintVisible()) { dialogsHintCellVisible = true; dialogsHintCell.setVisibility(View.VISIBLE); + dialogsHintCell.setCompact(false); dialogsHintCell.setOnClickListener(v -> { presentFragment(new PremiumPreviewFragment("dialogs_hint").setSelectAnnualByDefault()); AndroidUtilities.runOnUIThread(() -> { @@ -5774,6 +5897,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } else if (isCacheHintVisible()) { dialogsHintCellVisible = true; dialogsHintCell.setVisibility(View.VISIBLE); + dialogsHintCell.setCompact(false); dialogsHintCell.setOnClickListener(v -> { presentFragment(new CacheControlActivity()); AndroidUtilities.runOnUIThread(() -> { @@ -5813,6 +5937,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. final String finalSuggestion = foundSuggestion; dialogsHintCellVisible = true; dialogsHintCell.setVisibility(View.VISIBLE); + dialogsHintCell.setCompact(false); dialogsHintCell.setOnClickListener(v -> { if (ApplicationLoader.applicationLoaderInstance != null) { ApplicationLoader.applicationLoaderInstance.onSuggestionClick(finalSuggestion); @@ -7713,6 +7838,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. long dialogId = 0; long topicId = 0; int message_id = 0; + MessageObject msg = null; boolean isGlobalSearch = false; int folderId = 0; int filterId = 0; @@ -7800,7 +7926,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. searchObject = (TLRPC.EncryptedChat) obj; } } else if (obj instanceof MessageObject) { - MessageObject messageObject = (MessageObject) obj; + MessageObject messageObject = msg = (MessageObject) obj; dialogId = messageObject.getDialogId(); message_id = messageObject.getId(); TLRPC.Chat chat = getMessagesController().getChat(-dialogId); @@ -7934,7 +8060,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } else if (searchString != null) { if (getMessagesController().checkCanOpenChat(args, DialogsActivity.this)) { getNotificationCenter().postNotificationName(NotificationCenter.closeChats); - presentFragment(new ChatActivity(args)); + presentFragment(highlightFoundQuote(new ChatActivity(args), msg)); } } else { slowedReloadAfterDialogClick = true; @@ -7945,20 +8071,20 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (chat != null && chat.forum && topicId == 0) { if (!LiteMode.isEnabled(LiteMode.FLAG_CHAT_FORUM_TWOCOLUMN)) { if (needOpenChatActivity) { - presentFragment(new ChatActivity(args)); + presentFragment(highlightFoundQuote(new ChatActivity(args), msg)); } else { presentFragment(new TopicsFragment(args)); } } else { if (!canOpenInRightSlidingView) { if (needOpenChatActivity) { - presentFragment(new ChatActivity(args)); + presentFragment(highlightFoundQuote(new ChatActivity(args), msg)); } else { presentFragment(new TopicsFragment(args)); } } else if (!searching) { if (needOpenChatActivity) { - presentFragment(new ChatActivity(args)); + presentFragment(highlightFoundQuote(new ChatActivity(args), msg)); } else { if (rightSlidingDialogContainer.currentFragment != null && ((TopicsFragment) rightSlidingDialogContainer.currentFragment).getDialogId() == dialogId) { rightSlidingDialogContainer.finishPreview(); @@ -7988,13 +8114,57 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. rightSlidingDialogContainer.finishPreview(); } } - presentFragment(chatActivity); + presentFragment(highlightFoundQuote(chatActivity, msg)); } } } } } + public ChatActivity highlightFoundQuote(ChatActivity chatActivity, MessageObject message) { + if (message != null && message.hasHighlightedWords()) { + try { + CharSequence text = null; + if (!TextUtils.isEmpty(message.caption)) { + text = message.caption; + } else { + text = message.messageText; + } + CharSequence highlighted = AndroidUtilities.highlightText(text, message.highlightedWords, null); + if (highlighted instanceof SpannableStringBuilder) { + SpannableStringBuilder spannedHighlighted = (SpannableStringBuilder) highlighted; + ForegroundColorSpanThemable[] spans = spannedHighlighted.getSpans(0, spannedHighlighted.length(), ForegroundColorSpanThemable.class); + if (spans.length > 0) { + int start = spannedHighlighted.getSpanStart(spans[0]); + int end = spannedHighlighted.getSpanEnd(spans[0]); + for (int i = 1; i < spans.length; ++i) { + int sstart = spannedHighlighted.getSpanStart(spans[i]); + int send = spannedHighlighted.getSpanStart(spans[i]); + if (sstart == end) { + end = send; + } else if (sstart > end) { + boolean whitespace = true; + for (int j = end; j <= sstart; ++j) { + if (!Character.isWhitespace(spannedHighlighted.charAt(j))) { + whitespace = false; + break; + } + } + if (whitespace) { + end = send; + } + } + } + chatActivity.setHighlightQuote(message.getId(), text.subSequence(start, end).toString(), start); + } + } + } catch (Exception e) { + FileLog.e(e); + } + } + return chatActivity; + } + public void setOpenedDialogId(long dialogId, long topicId) { openedDialogId.dialogId = dialogId; openedDialogId.topicId = topicId; @@ -12325,7 +12495,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (dialogStoriesCell == null || storiesVisibilityAnimator != null || rightSlidingDialogContainer != null && rightSlidingDialogContainer.hasFragment() || searchIsShowed || actionBar.isActionModeShowed() || onlySelect) { return; } - if (StoryRecorder.isVisible() || (storyViewer != null && storyViewer.isFullyVisible())) { + if (StoryRecorder.isVisible() || (getLastStoryViewer() != null && getLastStoryViewer().isFullyVisible())) { animated = false; } boolean onlySelfStories = !isArchive() && getStoriesController().hasOnlySelfStories(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DilogCacheBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/DilogCacheBottomSheet.java index 516048177..05e23a71d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DilogCacheBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DilogCacheBottomSheet.java @@ -47,7 +47,7 @@ public class DilogCacheBottomSheet extends BottomSheetWithRecyclerListView { } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return new RecyclerListView.SelectionAdapter() { @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java b/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java index 2256116a4..8fa6eb180 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/EmojiAnimationsOverlay.java @@ -2,7 +2,6 @@ package org.telegram.ui; import android.graphics.Canvas; import android.text.TextUtils; -import android.util.Log; import android.view.HapticFeedbackConstants; import android.view.View; import android.widget.FrameLayout; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FilterCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FilterCreateActivity.java index 80fc5beed..f9890ae9d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FilterCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FilterCreateActivity.java @@ -28,7 +28,6 @@ import android.text.TextWatcher; import android.text.style.DynamicDrawableSpan; import android.text.style.ImageSpan; import android.text.style.ReplacementSpan; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.View; @@ -2256,7 +2255,7 @@ public class FilterCreateActivity extends BaseFragment { } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return adapter = new AdapterWithDiffUtils() { private RecyclerListView.Adapter realAdapter() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java index d9f045425..b15d79e96 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FiltersSetupActivity.java @@ -11,7 +11,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.text.TextUtils; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.HapticFeedbackConstants; @@ -31,7 +30,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.BotWebViewVibrationEffect; import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; @@ -51,7 +49,6 @@ import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.ShadowSectionCell; import org.telegram.ui.Cells.TextCheckCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; -import org.telegram.ui.Components.BotWebViewContainer; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.CombinedDrawable; @@ -82,7 +79,6 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe private boolean ignoreUpdates; private boolean highlightTags; - private boolean scrollingToBottom; public FiltersSetupActivity highlightTags() { this.highlightTags = true; return this; @@ -580,9 +576,6 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe presentFragment(new PremiumPreviewFragment("settings")); }) : LocaleController.getString(R.string.FolderShowTagsInfo))); - if (scrollingToBottom) { - animated = false; - } if (adapter != null) { if (animated) { adapter.setItems(oldItems, items); @@ -612,20 +605,6 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe super.onFragmentDestroy(); } - @Override - public void onBecomeFullyVisible() { - super.onBecomeFullyVisible(); - if (highlightTags) { - highlightTags = false; - scrollingToBottom = true; - listView.smoothScrollToPosition(adapter.getItemCount() - 1); - AndroidUtilities.runOnUIThread(() -> { - scrollingToBottom = false; - listView.highlightRow(() -> folderTagsPosition); - }, 200); - } - } - @Override public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); @@ -722,6 +701,15 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe } }); + if (highlightTags) { + updateRows(false); + highlightTags = false; + listView.scrollToPosition(adapter.getItemCount() - 1); + AndroidUtilities.runOnUIThread(() -> { + listView.highlightRow(() -> folderTagsPosition); + }, 200); + } + return fragmentView; } @@ -754,11 +742,7 @@ public class FiltersSetupActivity extends BaseFragment implements NotificationCe } updateRows(true); } else if (id == NotificationCenter.suggestedFiltersLoaded) { - if (scrollingToBottom) { - AndroidUtilities.runOnUIThread(() -> updateRows(true), 900); - } else { - updateRows(true); - } + updateRows(true); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FragmentUsernameBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/FragmentUsernameBottomSheet.java new file mode 100644 index 000000000..76907e2e5 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/FragmentUsernameBottomSheet.java @@ -0,0 +1,177 @@ +package org.telegram.ui; + +import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.getString; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.telegram.PhoneFormat.PhoneFormat; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BillingController; +import org.telegram.messenger.ChatObject; +import org.telegram.messenger.DialogObject; +import org.telegram.messenger.Emoji; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.UserObject; +import org.telegram.messenger.browser.Browser; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; +import org.telegram.tgnet.tl.TL_fragment; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.ColoredImageSpan; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LinkSpanDrawable; +import org.telegram.ui.Components.Premium.PremiumButtonView; +import org.telegram.ui.Components.RLottieImageView; +import org.telegram.ui.Stories.recorder.ButtonWithCounterView; + +public class FragmentUsernameBottomSheet { + + public static final int TYPE_USERNAME = 0; + public static final int TYPE_PHONE = 1; + + public static void open( + Context context, + int type, + String name, + TLObject owner, + TL_fragment.TL_collectibleInfo info, + Theme.ResourcesProvider resourcesProvider + ) { + BottomSheet sheet = new BottomSheet(context, false, resourcesProvider); + sheet.fixNavigationBar(Theme.getColor(Theme.key_dialogBackground, resourcesProvider)); + + LinearLayout layout = new LinearLayout(context); + layout.setOrientation(LinearLayout.VERTICAL); + layout.setPadding(dp(16), 0, dp(16), 0); + + RLottieImageView imageView = new RLottieImageView(context); + imageView.setScaleType(ImageView.ScaleType.CENTER); + int sz = type == TYPE_USERNAME ? 70 : 78; + imageView.setAnimation(type == TYPE_USERNAME ? R.raw.fragment_username : R.raw.fragment_phone, sz, sz); + imageView.playAnimation(); + imageView.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)); + imageView.setBackground(Theme.createCircleDrawable(dp(80), Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider))); + layout.addView(imageView, LayoutHelper.createLinear(80, 80, Gravity.CENTER_HORIZONTAL, 0, 16, 0, 16)); + + final String ownerName; + if (owner instanceof TLRPC.User) { + ownerName = UserObject.getUserName((TLRPC.User) owner); + } else if (owner instanceof TLRPC.Chat) { + ownerName = ((TLRPC.Chat) owner).title; + } else { + ownerName = ""; + } + + final String money = BillingController.getInstance().formatCurrency(info.amount, info.currency); + final String crypto_money = BillingController.getInstance().formatCurrency(info.crypto_amount, info.crypto_currency); + + String title; + String message; + String link; + if (type == TYPE_USERNAME) { + title = LocaleController.formatString(R.string.FragmentUsernameTitle, "@" + name); + message = LocaleController.formatString(R.string.FragmentUsernameMessage, LocaleController.formatShortDateTime(info.purchase_date), crypto_money, TextUtils.isEmpty(money) ? "" : "(" + money + ")"); + link = MessagesController.getInstance(UserConfig.selectedAccount).linkPrefix + "/" + name; + } else if (type == TYPE_PHONE) { + title = LocaleController.formatString(R.string.FragmentPhoneTitle, PhoneFormat.getInstance().format("+" + name)); + message = LocaleController.formatString(R.string.FragmentPhoneMessage, LocaleController.formatShortDateTime(info.purchase_date), crypto_money, TextUtils.isEmpty(money) ? "" : "(" + money + ")"); + link = PhoneFormat.getInstance().format("+" + name); + } else { + return; + } + + Runnable copy = link != null ? () -> { + AndroidUtilities.addToClipboard(link); + if (type == TYPE_PHONE) { + BulletinFactory.of(sheet.getContainer(), resourcesProvider).createCopyBulletin(getString(R.string.PhoneCopied)).show(); + } else { + BulletinFactory.of(sheet.getContainer(), resourcesProvider).createCopyLinkBulletin().show(); + } + } : null; + + CharSequence titleSpanned = AndroidUtilities.replaceSingleTag(title, copy); + + final SpannableString tonIcon = new SpannableString("TON"); + ColoredImageSpan span = new ColoredImageSpan(R.drawable.mini_ton); + span.setWidth(dp(13)); + tonIcon.setSpan(span, 0, tonIcon.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + CharSequence messageSpanned = AndroidUtilities.replaceCharSequence("TON", AndroidUtilities.replaceTags(message), tonIcon); + + TextView headerView = new LinkSpanDrawable.LinksTextView(context); + headerView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + headerView.setGravity(Gravity.CENTER); + headerView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack, resourcesProvider)); + headerView.setLinkTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2, resourcesProvider)); + headerView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + headerView.setText(titleSpanned); + layout.addView(headerView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 42, 0, 42, 0)); + + FrameLayout chipLayout = new FrameLayout(context); + chipLayout.setBackground(Theme.createRoundRectDrawable(dp(28), dp(28), Theme.getColor(Theme.key_groupcreate_spanBackground, resourcesProvider))); + + BackupImageView chipAvatar = new BackupImageView(context); + chipAvatar.setRoundRadius(dp(28)); + AvatarDrawable avatarDrawable = new AvatarDrawable(); + avatarDrawable.setInfo(owner); + chipAvatar.setForUserOrChat(owner, avatarDrawable); + chipLayout.addView(chipAvatar, LayoutHelper.createFrame(28, 28, Gravity.LEFT | Gravity.TOP)); + + TextView chipText = new TextView(context); + chipText.setTextColor(Theme.getColor(Theme.key_dialogTextBlack, resourcesProvider)); + chipText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + chipText.setSingleLine(); + chipText.setText(Emoji.replaceEmoji(ownerName, chipText.getPaint().getFontMetricsInt(), false)); + chipLayout.addView(chipText, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL | Gravity.LEFT, 37, 0, 10, 0)); + + layout.addView(chipLayout, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, 28, Gravity.CENTER_HORIZONTAL, 42, 10, 42, 18)); + + TextView descriptionView = new TextView(context); + descriptionView.setGravity(Gravity.CENTER); + descriptionView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack, resourcesProvider)); + descriptionView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + descriptionView.setText(messageSpanned); + layout.addView(descriptionView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 32, 0, 32, 19)); + + ButtonWithCounterView button = new ButtonWithCounterView(context, resourcesProvider); + button.setText(getString(R.string.FragmentUsernameOpen), false); + button.setOnClickListener(v -> { + Browser.openUrl(context, info.url); + }); + layout.addView(button, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, 6, 0, 6, 0)); + + if (copy != null) { + ButtonWithCounterView button2 = new ButtonWithCounterView(context, false, resourcesProvider); + button2.setText(getString(type == TYPE_USERNAME ? R.string.FragmentUsernameCopy : R.string.FragmentPhoneCopy), false); + button2.setOnClickListener(v -> { + copy.run(); + sheet.dismiss(); + }); + layout.addView(button2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, 6, 6, 6, 0)); + } + + sheet.setCustomView(layout); + sheet.show(); + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java index e1f9f09f3..d3580e991 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -73,6 +73,7 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Adapters.SearchAdapterHelper; import org.telegram.ui.Cells.CheckBoxCell; +import org.telegram.ui.Cells.GraySectionCell; import org.telegram.ui.Cells.GroupCreateSectionCell; import org.telegram.ui.Cells.GroupCreateUserCell; import org.telegram.ui.Cells.TextCell; @@ -128,6 +129,8 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen private boolean searchWas; private boolean searching; private int chatAddType; + private boolean allowPremium; + private GroupCreateSpan selectedPremium; private LongSparseArray selectedContacts = new LongSparseArray<>(); private ArrayList allSpans = new ArrayList<>(); private GroupCreateSpan currentDeletingSpan; @@ -141,7 +144,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen private PermanentLinkBottomSheet sharedLinkBottomSheet; public interface GroupCreateActivityDelegate { - void didSelectUsers(ArrayList ids); + void didSelectUsers(boolean withPremium, ArrayList ids); } public interface GroupCreateActivityImportDelegate { @@ -156,12 +159,44 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } } + private ArrayList toSelectIds; + private boolean toSelectPremium; + public void select(ArrayList ids, boolean premium) { + if (spansContainer == null) { + toSelectIds = ids; + toSelectPremium = premium; + return; + } + if (premium && selectedPremium == null) { + selectedPremium = new GroupCreateSpan(getContext(), "premium"); + spansContainer.addSpan(selectedPremium); + selectedPremium.setOnClickListener(GroupCreateActivity.this); + } else if (!premium && selectedPremium != null) { + spansContainer.removeSpan(selectedPremium); + selectedPremium = null; + } + for (long id : ids) { + TLObject obj; + if (id < 0) { + obj = getMessagesController().getChat(-id); + } else { + obj = getMessagesController().getUser(id); + } + if (obj == null) continue; + GroupCreateSpan span = new GroupCreateSpan(getContext(), obj); + spansContainer.addSpan(span); + span.setOnClickListener(this); + } + spansContainer.endAnimation(); + AndroidUtilities.updateVisibleRows(listView); + } + private class SpansContainer extends ViewGroup { private boolean animationStarted; private ArrayList animators = new ArrayList<>(); private View addingSpan; - private View removingSpan; + private final ArrayList removingSpans = new ArrayList<>(); private int animationIndex = -1; public SpansContainer(Context context) { @@ -184,7 +219,8 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen continue; } child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(32), MeasureSpec.EXACTLY)); - if (child != removingSpan && currentLineWidth + child.getMeasuredWidth() > maxWidth) { + boolean isRemoving = removingSpans.contains(child); + if (!isRemoving && currentLineWidth + child.getMeasuredWidth() > maxWidth) { y += child.getMeasuredHeight() + AndroidUtilities.dp(8); currentLineWidth = 0; } @@ -194,10 +230,10 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } x = AndroidUtilities.dp(13) + currentLineWidth; if (!animationStarted) { - if (child == removingSpan) { + if (isRemoving) { child.setTranslationX(AndroidUtilities.dp(13) + allCurrentLineWidth); child.setTranslationY(allY); - } else if (removingSpan != null) { + } else if (!removingSpans.isEmpty()) { if (child.getTranslationX() != x) { animators.add(ObjectAnimator.ofFloat(child, "translationX", x)); } @@ -209,7 +245,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen child.setTranslationY(y); } } - if (child != removingSpan) { + if (!isRemoving) { currentLineWidth += child.getMeasuredWidth() + AndroidUtilities.dp(9); } allCurrentLineWidth += child.getMeasuredWidth() + AndroidUtilities.dp(9); @@ -262,7 +298,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen editText.setTranslationY(fieldY); } } else if (currentAnimation != null) { - if (!ignoreScrollEvent && removingSpan == null) { + if (!ignoreScrollEvent && removingSpans.isEmpty()) { editText.bringPointIntoView(editText.getSelectionStart()); } } @@ -281,7 +317,9 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen public void addSpan(final GroupCreateSpan span) { allSpans.add(span); - selectedContacts.put(span.getUid(), span); + if (!span.isFlag) { + selectedContacts.put(span.getUid(), span); + } editText.setHintVisible(false, TextUtils.isEmpty(editText.getText())); if (currentAnimation != null && currentAnimation.isRunning()) { @@ -308,9 +346,21 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen addView(span); } + public void endAnimation() { + if (currentAnimation != null && currentAnimation.isRunning()) { + currentAnimation.setupEndValues(); + currentAnimation.cancel(); + } + } + public void removeSpan(final GroupCreateSpan span) { ignoreScrollEvent = true; - selectedContacts.remove(span.getUid()); + if (!span.isFlag) { + selectedContacts.remove(span.getUid()); + } + if (span == selectedPremium) { + selectedPremium = null; + } allSpans.remove(span); span.setOnClickListener(null); @@ -324,7 +374,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen @Override public void onAnimationEnd(Animator animator) { removeView(span); - removingSpan = null; + removingSpans.clear(); currentAnimation = null; animationStarted = false; editText.setAllowDrawCursor(true); @@ -334,11 +384,66 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } }); currentAnimation.setDuration(150); - removingSpan = span; + removingSpans.clear(); + removingSpans.add(span); animators.clear(); - animators.add(ObjectAnimator.ofFloat(removingSpan, View.SCALE_X, 1.0f, 0.01f)); - animators.add(ObjectAnimator.ofFloat(removingSpan, View.SCALE_Y, 1.0f, 0.01f)); - animators.add(ObjectAnimator.ofFloat(removingSpan, View.ALPHA, 1.0f, 0.0f)); + animators.add(ObjectAnimator.ofFloat(span, View.SCALE_X, 1.0f, 0.01f)); + animators.add(ObjectAnimator.ofFloat(span, View.SCALE_Y, 1.0f, 0.01f)); + animators.add(ObjectAnimator.ofFloat(span, View.ALPHA, 1.0f, 0.0f)); + requestLayout(); + } + + public void removeAllSpans(boolean animated) { + ignoreScrollEvent = true; + + ArrayList spans = new ArrayList<>(allSpans); + allSpans.clear(); + + removingSpans.clear(); + removingSpans.addAll(spans); + + for (int i = 0; i < spans.size(); ++i) { + spans.get(i).setOnClickListener(null); + } + + endAnimation(); + if (animated) { + animationStarted = false; + currentAnimation = new AnimatorSet(); + currentAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animator) { + for (int i = 0; i < spans.size(); ++i) { + removeView(spans.get(i)); + } + removingSpans.clear(); + currentAnimation = null; + animationStarted = false; + editText.setAllowDrawCursor(true); + if (allSpans.isEmpty()) { + editText.setHintVisible(true, true); + } + } + }); + animators.clear(); + for (int i = 0; i < spans.size(); ++i) { + GroupCreateSpan span = spans.get(i); + animators.add(ObjectAnimator.ofFloat(span, View.SCALE_X, 1.0f, 0.01f)); + animators.add(ObjectAnimator.ofFloat(span, View.SCALE_Y, 1.0f, 0.01f)); + animators.add(ObjectAnimator.ofFloat(span, View.ALPHA, 1.0f, 0.0f)); + } + } else { + for (int i = 0; i < spans.size(); ++i) { + removeView(spans.get(i)); + } + removingSpans.clear(); + currentAnimation = null; + animationStarted = false; + editText.setAllowDrawCursor(true); + if (allSpans.isEmpty()) { + editText.setHintVisible(true, true); + } + } requestLayout(); } } @@ -355,6 +460,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen isNeverShare = args.getBoolean("isNeverShare", false); addToGroup = args.getBoolean("addToGroup", false); chatAddType = args.getInt("chatAddType", 0); + allowPremium = args.getBoolean("allowPremium", false); chatId = args.getLong("chatId"); channelId = args.getLong("channelId"); if (isAlwaysShare || isNeverShare || addToGroup) { @@ -662,6 +768,10 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } }); + if (toSelectIds != null) { + select(toSelectIds, toSelectPremium); + } + FlickerLoadingView flickerLoadingView = new FlickerLoadingView(context); flickerLoadingView.setViewType(FlickerLoadingView.USERS_TYPE); flickerLoadingView.showDate(false); @@ -690,6 +800,18 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen showDialog(sharedLinkBottomSheet); } else if (view instanceof GroupCreateUserCell) { GroupCreateUserCell cell = (GroupCreateUserCell) view; + if (cell.currentPremium) { + if (selectedPremium == null) { + selectedPremium = new GroupCreateSpan(editText.getContext(), "premium"); + spansContainer.addSpan(selectedPremium); + selectedPremium.setOnClickListener(GroupCreateActivity.this); + } else { + spansContainer.removeSpan(selectedPremium); + selectedPremium = null; + } + checkVisibleRows(); + return; + } Object object = cell.getObject(); long id; if (object instanceof TLRPC.User) { @@ -755,7 +877,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } } getMessagesController().putUser(user, !searching); - } else { + } else if (object instanceof TLRPC.Chat) { TLRPC.Chat chat = (TLRPC.Chat) object; getMessagesController().putChat(chat, !searching); } @@ -767,7 +889,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen if (searching || searchWas) { AndroidUtilities.showKeyboard(editText); } else { - cell.setChecked(!exists, true); + checkVisibleRows(); } if (editText.length() > 0) { editText.setText(null); @@ -963,6 +1085,10 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen id = ((TLRPC.User) object).id; } else if (object instanceof TLRPC.Chat) { id = -((TLRPC.Chat) object).id; + } else if (object instanceof String && "premium".equalsIgnoreCase((String) object)) { + cell.setChecked(selectedPremium != null, true); + cell.setCheckBoxEnabled(true); + continue; } else { id = 0; } @@ -975,6 +1101,18 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen cell.setCheckBoxEnabled(true); } } + } else if (child instanceof GraySectionCell) { + int position = listView.getChildAdapterPosition(child); + if (position == adapter.firstSectionRow) { + GraySectionCell cell = (GraySectionCell) child; + cell.setRightText(selectedPremium != null || !selectedContacts.isEmpty() ? LocaleController.getString(R.string.DeselectAll) : "", true, v -> { + selectedPremium = null; + selectedContacts.clear(); + spansContainer.removeAllSpans(true); + checkVisibleRows(); + updateEditTextHint(); + }); + } } } } @@ -1029,14 +1167,14 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen if (!ChatObject.isChannel(chat)) { LinearLayout linearLayout = new LinearLayout(getParentActivity()); linearLayout.setOrientation(LinearLayout.VERTICAL); - cells[0] = new CheckBoxCell(getParentActivity(), 1); + cells[0] = new CheckBoxCell(getParentActivity(), 1, resourceProvider); cells[0].setBackgroundDrawable(Theme.getSelectorDrawable(false)); cells[0].setMultiline(true); if (selectedContacts.size() == 1) { TLRPC.User user = getMessagesController().getUser(selectedContacts.keyAt(0)); - cells[0].setText(AndroidUtilities.replaceTags(LocaleController.formatString("AddOneMemberForwardMessages", R.string.AddOneMemberForwardMessages, UserObject.getFirstName(user))), "", true, false); + cells[0].setText(AndroidUtilities.replaceTags(LocaleController.formatString(R.string.AddOneMemberForwardMessages, UserObject.getFirstName(user))), "", true, false); } else { - cells[0].setText(LocaleController.getString("AddMembersForwardMessages", R.string.AddMembersForwardMessages), "", true, false); + cells[0].setText(LocaleController.getString(R.string.AddMembersForwardMessages), "", true, false); } cells[0].setPadding(LocaleController.isRTL ? AndroidUtilities.dp(16) : AndroidUtilities.dp(8), 0, LocaleController.isRTL ? AndroidUtilities.dp(8) : AndroidUtilities.dp(16), 0); linearLayout.addView(cells[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); @@ -1075,7 +1213,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } if (isAlwaysShare || isNeverShare) { if (delegate != null) { - delegate.didSelectUsers(result); + delegate.didSelectUsers(selectedPremium != null, result); } finishFragment(); } else { @@ -1158,10 +1296,27 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen delegate = groupCreateActivityDelegate; } - public void setDelegate(ContactsAddActivityDelegate contactsAddActivityDelegate) { + public void setDelegate2(ContactsAddActivityDelegate contactsAddActivityDelegate) { delegate2 = contactsAddActivityDelegate; } + public static class Comparator implements java.util.Comparator { + private static String getName(TLObject object) { + if (object instanceof TLRPC.User) { + TLRPC.User user = (TLRPC.User) object; + return ContactsController.formatName(user.first_name, user.last_name); + } else if (object instanceof TLRPC.Chat) { + TLRPC.Chat chat = (TLRPC.Chat) object; + return chat.title; + } + return ""; + } + @Override + public int compare(TLObject o1, TLObject o2) { + return getName(o1).compareTo(getName(o2)); + } + } + public class GroupCreateAdapter extends RecyclerListView.FastScrollAdapter { private Context context; @@ -1171,6 +1326,9 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen private Runnable searchRunnable; private boolean searching; private ArrayList contacts = new ArrayList<>(); + private int userTypesHeaderRow; + private int firstSectionRow; + private int premiumRow; private int usersStartRow; private int inviteViaLink; private int noContactsStubRow; @@ -1206,22 +1364,15 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } contacts.add(chat); } - Collections.sort(contacts, new Comparator() { - private String getName(TLObject object) { - if (object instanceof TLRPC.User) { - TLRPC.User user = (TLRPC.User) object; - return ContactsController.formatName(user.first_name, user.last_name); - } else { - TLRPC.Chat chat = (TLRPC.Chat) object; - return chat.title; - } + Collections.sort(contacts, new Comparator()); + TLObject lastContact = null; + for (int i = 0; i < contacts.size(); ++i) { + TLObject contact = contacts.get(i); + if (lastContact == null || !firstLetter(Comparator.getName(lastContact)).equals(firstLetter(Comparator.getName(contact)))) { + contacts.add(i, new Letter(firstLetter(Comparator.getName(contact)))); } - - @Override - public int compare(TLObject o1, TLObject o2) { - return getName(o1).compareTo(getName(o2)); - } - }); + lastContact = contact; + } } searchAdapterHelper = new SearchAdapterHelper(false); @@ -1234,6 +1385,11 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen }); } + private String firstLetter(String string) { + if (TextUtils.isEmpty(string)) return ""; + return string.substring(0, 1); + } + public void setSearching(boolean value) { if (searching == value) { return; @@ -1250,7 +1406,9 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen TLObject object = contacts.get(position - usersStartRow); String firstName; String lastName; - if (object instanceof TLRPC.User) { + if (object instanceof Letter) { + return ((Letter) object).letter; + } else if (object instanceof TLRPC.User) { TLRPC.User user = (TLRPC.User) object; firstName = user.first_name; lastName = user.last_name; @@ -1279,6 +1437,9 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen public int getItemCount() { int count; noContactsStubRow = -1; + userTypesHeaderRow = -1; + firstSectionRow = -1; + premiumRow = -1; if (searching) { count = searchResult.size(); int localServerCount = searchAdapterHelper.getLocalServerSearch().size(); @@ -1290,7 +1451,15 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen currentItemsCount = count; return count; } else { - count = contacts.size(); + count = 0; + if (allowPremium) { + userTypesHeaderRow = firstSectionRow = count++; + premiumRow = count++; + } else { + firstSectionRow = count; + } + usersStartRow = count; + count += contacts.size(); if (addToGroup) { if (chatId != 0) { TLRPC.Chat chat = getMessagesController().getChat(chatId); @@ -1302,7 +1471,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen inviteViaLink = 0; } if (inviteViaLink != 0) { - usersStartRow = 1; + usersStartRow++; count++; } } @@ -1320,10 +1489,10 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen View view; switch (viewType) { case 0: - view = new GroupCreateSectionCell(context); + view = new GraySectionCell(context); break; case 1: - view = new GroupCreateUserCell(context, 1, 0, false).showPremiumBlocked(); + view = new GroupCreateUserCell(context, 1, 0, false);//.showPremiumBlocked(); break; case 3: StickerEmptyView stickerEmptyView = new StickerEmptyView(context, null, StickerEmptyView.STICKER_TYPE_NO_CONTACTS) { @@ -1351,9 +1520,25 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (holder.getItemViewType()) { case 0: { - GroupCreateSectionCell cell = (GroupCreateSectionCell) holder.itemView; + GraySectionCell cell = (GraySectionCell) holder.itemView; if (searching) { cell.setText(LocaleController.getString("GlobalSearch", R.string.GlobalSearch)); + } else if (position == userTypesHeaderRow) { + cell.setText(LocaleController.getString(R.string.PrivacyUserTypes)); + } else if (position - usersStartRow >= 0 && position - usersStartRow < contacts.size()) { + TLObject object = contacts.get(position - usersStartRow); + if (object instanceof Letter) { + cell.setText(((Letter) object).letter.toUpperCase()); + } + } + if (position == firstSectionRow) { + cell.setRightText(selectedPremium != null || !selectedContacts.isEmpty() ? LocaleController.getString(R.string.DeselectAll) : "", true, v -> { + selectedPremium = null; + selectedContacts.clear(); + spansContainer.removeAllSpans(true); + checkVisibleRows(); + updateEditTextHint(); + }); } break; } @@ -1380,8 +1565,10 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen String objectUserName; if (object instanceof TLRPC.User) { objectUserName = ((TLRPC.User) object).username; - } else { + } else if (object instanceof TLRPC.Chat) { objectUserName = ChatObject.getPublicUsername((TLRPC.Chat) object); + } else { + return; } if (position < localCount) { name = searchResultNames.get(position); @@ -1417,6 +1604,11 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } } } else { + if (position == premiumRow) { + cell.setPremium(); + cell.setChecked(selectedPremium != null, false); + return; + } object = contacts.get(position - usersStartRow); } cell.setObject(object, name, username); @@ -1459,12 +1651,22 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } return 1; } else { + if (position == userTypesHeaderRow) { + return 0; + } + if (position == premiumRow) { + return 1; + } if (inviteViaLink != 0 && position == 0) { return 2; } if (noContactsStubRow == position) { return 3; } + if (position - usersStartRow >= 0 && position - usersStartRow < contacts.size()) { + if (contacts.get(position - usersStartRow) instanceof Letter) + return 0; + } return 1; } } @@ -1484,6 +1686,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { + if (holder.getItemViewType() == 0) return false; if (ignoreUsers != null && holder.itemView instanceof GroupCreateUserCell) { GroupCreateUserCell cell = (GroupCreateUserCell) holder.itemView; Object object = cell.getObject(); @@ -1539,10 +1742,12 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen TLRPC.User user = (TLRPC.User) object; name = ContactsController.formatName(user.first_name, user.last_name).toLowerCase(); username = UserObject.getPublicUsername(user); - } else { + } else if (object instanceof TLRPC.Chat) { TLRPC.Chat chat = (TLRPC.Chat) object; name = chat.title; username = ChatObject.getPublicUsername(chat); + } else { + continue; } String tName = LocaleController.getInstance().getTranslitString(name); if (name.equals(tName)) { @@ -1562,7 +1767,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen if (object instanceof TLRPC.User) { TLRPC.User user = (TLRPC.User) object; resultArrayNames.add(AndroidUtilities.generateSearchName(user.first_name, user.last_name, q)); - } else { + } else if (object instanceof TLRPC.Chat) { TLRPC.Chat chat = (TLRPC.Chat) object; resultArrayNames.add(AndroidUtilities.generateSearchName(chat.title, null, q)); } @@ -1672,4 +1877,11 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen return themeDescriptions; } + + private static class Letter extends TLRPC.TL_contact { + public final String letter; + public Letter(String letter) { + this.letter = letter; + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/IntroActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/IntroActivity.java index ce928b123..84bb839d6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/IntroActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/IntroActivity.java @@ -192,7 +192,7 @@ public class IntroActivity extends BaseFragment implements NotificationCenter.No darkThemeDrawable.setCustomEndFrame(Theme.getCurrentTheme().isDark() ? darkThemeDrawable.getFramesCount() - 1 : 0); darkThemeDrawable.setCurrentFrame(Theme.getCurrentTheme().isDark() ? darkThemeDrawable.getFramesCount() - 1 : 0, false); - themeIconView.setContentDescription(LocaleController.getString(Theme.getCurrentTheme().isDark() ? R.string.AccDescrSwitchToDayTheme : R.string.AccDescrSwitchToDayTheme)); + themeIconView.setContentDescription(LocaleController.getString(Theme.getCurrentTheme().isDark() ? R.string.AccDescrSwitchToDayTheme : R.string.AccDescrSwitchToNightTheme)); themeIconView.setAnimation(darkThemeDrawable); themeFrameLayout.setOnClickListener(v -> { @@ -223,7 +223,7 @@ public class IntroActivity extends BaseFragment implements NotificationCenter.No pos[0] += themeIconView.getMeasuredWidth() / 2; pos[1] += themeIconView.getMeasuredHeight() / 2; NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needSetDayNightTheme, themeInfo, false, pos, -1, toDark, themeIconView); - themeIconView.setContentDescription(LocaleController.getString(toDark ? R.string.AccDescrSwitchToDayTheme : R.string.AccDescrSwitchToDayTheme)); + themeIconView.setContentDescription(LocaleController.getString(toDark ? R.string.AccDescrSwitchToDayTheme : R.string.AccDescrSwitchToNightTheme)); }); frameLayout2 = new FrameLayout(context); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 0cba380ec..cbd4b651c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -127,8 +127,8 @@ import org.telegram.messenger.voip.VoIPService; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; -import org.telegram.tgnet.tl.TL_stories; import org.telegram.tgnet.tl.TL_chatlists; +import org.telegram.tgnet.tl.TL_stories; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.DrawerLayoutContainer; @@ -148,7 +148,6 @@ import org.telegram.ui.Components.AttachBotIntroTopView; import org.telegram.ui.Components.AudioPlayerAlert; import org.telegram.ui.Components.BatteryDrawable; import org.telegram.ui.Components.BlockingUpdateView; -import org.telegram.ui.Components.BotWebViewSheet; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.CubicBezierInterpolator; @@ -188,6 +187,7 @@ import org.telegram.ui.Stories.StoriesController; import org.telegram.ui.Stories.StoriesListPlaceProvider; import org.telegram.ui.Stories.StoryViewer; import org.telegram.ui.Stories.recorder.StoryRecorder; +import org.telegram.ui.bots.BotWebViewSheet; import org.webrtc.voiceengine.WebRtcAudioTrack; import java.io.BufferedReader; @@ -774,8 +774,8 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati actionBarLayout.setFragmentStack(mainFragmentsStack); actionBarLayout.setFragmentStackChangedListener(() -> { checkSystemBarColors(true, false); - if (getLastFragment() != null && getLastFragment().storyViewer != null && getLastFragment().storyViewer.isShown()) { - getLastFragment().storyViewer.updatePlayingMode(); + if (getLastFragment() != null && getLastFragment().getLastStoryViewer() != null) { + getLastFragment().getLastStoryViewer().updatePlayingMode(); } }); actionBarLayout.setDelegate(this); @@ -2053,11 +2053,13 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati String code = null; String contactToken = null; String folderSlug = null; + String chatLinkSlug = null; TLRPC.TL_wallPaper wallPaper = null; String inputInvoiceSlug = null; Integer messageId = null; Long channelId = null; Long threadId = null; + String text = null; boolean isBoost = false; Integer commentId = null; int videoTimestamp = -1; @@ -2184,6 +2186,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati username = group; group = null; } + text = data.getQueryParameter("text"); } else if (path.startsWith("addstickers/")) { sticker = path.replace("addstickers/", ""); } else if (path.startsWith("addemoji/")) { @@ -2256,6 +2259,8 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati folderSlug = path.substring(7); } else if (path.startsWith("addlist/")) { folderSlug = path.substring(8); + } else if (path.startsWith("m/")) { + chatLinkSlug = path.substring(2); } else if (path.length() >= 1) { botAppMaybe = null; ArrayList segments = new ArrayList<>(data.getPathSegments()); @@ -2297,6 +2302,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati attachMenuBotChoose = data.getQueryParameter("choose"); attachMenuBotToOpen = data.getQueryParameter("attach"); threadId = Utilities.parseLong(data.getQueryParameter("thread")); + text = data.getQueryParameter("text"); if (data.getQuery() != null) { isBoost = data.getQuery().equals("boost"); } @@ -2384,6 +2390,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati threadId = null; } } + text = data.getQueryParameter("text"); commentId = Utilities.parseInt(data.getQueryParameter("comment")); if (commentId == 0) { commentId = null; @@ -2687,6 +2694,10 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati url = url.replace("tg:addlist", "tg://telegram.org").replace("tg://addlist", "tg://telegram.org"); data = Uri.parse(url); folderSlug = data.getQueryParameter("slug"); + } else if (url.startsWith("tg:message") || url.startsWith("tg://message")) { + url = url.replace("tg:message", "tg://telegram.org").replace("tg://message", "tg://telegram.org"); + data = Uri.parse(url); + chatLinkSlug = data.getQueryParameter("slug"); } else { unsupportedUrl = url.replace("tg://", "").replace("tg:", ""); int index; @@ -2737,11 +2748,11 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati AlertsCreator.processError(currentAccount, error, getActionBarLayout().getLastFragment(), req); } }), ConnectionsManager.RequestFlagFailOnServerErrors); - } else if (username != null || group != null || sticker != null || emoji != null || contactToken != null || folderSlug != null || message != null || game != null || voicechat != null || auth != null || unsupportedUrl != null || lang != null || code != null || wallPaper != null || inputInvoiceSlug != null || channelId != null || theme != null || login != null) { + } else if (username != null || group != null || sticker != null || emoji != null || contactToken != null || folderSlug != null || message != null || game != null || voicechat != null || auth != null || unsupportedUrl != null || lang != null || code != null || wallPaper != null || inputInvoiceSlug != null || channelId != null || theme != null || login != null || chatLinkSlug != null) { if (message != null && message.startsWith("@")) { message = " " + message; } - runLinkRequest(intentAccount[0], username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, login, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 0, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, startApp, progress, forceNotInternalForApps, storyId, isBoost); + runLinkRequest(intentAccount[0], username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, text, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, login, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 0, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, startApp, progress, forceNotInternalForApps, storyId, isBoost, chatLinkSlug); } else { try (Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null)) { if (cursor != null) { @@ -3662,7 +3673,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati final String message, final String contactToken, final String folderSlug, - final boolean hasUrl, + String text, final boolean hasUrl, final Integer messageId, final Long channelId, final Long threadId, @@ -3688,9 +3699,10 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati final Browser.Progress progress, final boolean forceNotInternalForApps, final int storyId, - final boolean isBoost) { + final boolean isBoost, + final String chatLinkSlug) { if (state == 0 && ChatActivity.SCROLL_DEBUG_DELAY && progress != null) { - Runnable runnable = () -> runLinkRequest(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 1, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost); + Runnable runnable = () -> runLinkRequest(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, text, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 1, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, chatLinkSlug); progress.init(); progress.onCancel(() -> AndroidUtilities.cancelRunOnUIThread(runnable)); AndroidUtilities.runOnUIThread(runnable, 7500); @@ -3700,7 +3712,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati if (account != intentAccount) { switchToAccount(account, true); } - runLinkRequest(account, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 1, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost); + runLinkRequest(account, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, text, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, 1, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, chatLinkSlug); }).show(); return; } else if (code != null) { @@ -3862,14 +3874,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } if (baseFragment != null) { storyItem.dialogId = peerId; - StoryViewer storyViewer = baseFragment.getOrCreateStoryViewer(); - if (storyViewer.isShown() && storyViewer.attachedToParent()) { - StoryViewer overlayStoryViewer = baseFragment.getOrCreateOverlayStoryViewer(); - final StoryViewer storyViewer1 = storyViewer; - overlayStoryViewer.setOnCloseListener(() -> storyViewer1.setOverlayVisible(false)); - storyViewer.setOverlayVisible(true); - storyViewer = overlayStoryViewer; - } + StoryViewer storyViewer = baseFragment.createOverlayStoryViewer(); storyViewer.instantClose(); storyViewer.open(this, storyItem, null); } @@ -3883,7 +3888,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati getAttachMenuBot.bot = MessagesController.getInstance(intentAccount).getInputUser(peerId); ConnectionsManager.getInstance(intentAccount).sendRequest(getAttachMenuBot, (response1, error1) -> AndroidUtilities.runOnUIThread(() -> { if (error1 != null) { - AndroidUtilities.runOnUIThread(() -> runLinkRequest(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, null, null, progress, forceNotInternalForApps, storyId, isBoost)); + AndroidUtilities.runOnUIThread(() -> runLinkRequest(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, text, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, null, null, progress, forceNotInternalForApps, storyId, isBoost, chatLinkSlug)); } else if (response1 instanceof TLRPC.TL_attachMenuBotsBot) { TLRPC.TL_attachMenuBotsBot bot = (TLRPC.TL_attachMenuBotsBot) response1; TLRPC.TL_attachMenuBot attachBot = bot.bot; @@ -3904,7 +3909,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } }), ConnectionsManager.RequestFlagInvokeAfter | ConnectionsManager.RequestFlagFailOnServerErrors); - processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, user, dismissLoading, botAttachable, true); + processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, text, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, chatLinkSlug, user, dismissLoading, botAttachable, true); }, null); } else if (attachBot.request_write_access || forceNotInternalForApps) { AtomicBoolean allowWrite = new AtomicBoolean(true); @@ -3922,15 +3927,15 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } }), ConnectionsManager.RequestFlagInvokeAfter | ConnectionsManager.RequestFlagFailOnServerErrors); - processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, user, dismissLoading, false, false); + processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, text, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, chatLinkSlug, user, dismissLoading, false, false); }); } else { - processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, user, dismissLoading, false, false); + processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, text, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, chatLinkSlug, user, dismissLoading, false, false); } } })); } else { - processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, user, dismissLoading, false, false); + processWebAppBot(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, text, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, botAppMaybe, botAppStartParam, progress, forceNotInternalForApps, storyId, isBoost, chatLinkSlug, user, dismissLoading, false, false); } return; } @@ -4204,6 +4209,9 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati if (setAsAttachBot != null) { args.putString("attach_bot_start_command", setAsAttachBot); } + if (text != null) { + args.putString("start_text", text); + } BaseFragment lastFragment = !mainFragmentsStack.isEmpty() && voicechat == null ? mainFragmentsStack.get(mainFragmentsStack.size() - 1) : null; if (lastFragment == null || MessagesController.getInstance(intentAccount).checkCanOpenChat(args, lastFragment)) { final boolean sameDialogId = lastFragment instanceof ChatActivity && ((ChatActivity) lastFragment).getDialogId() == dialog_id; @@ -4840,6 +4848,31 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } } } + } else if (chatLinkSlug != null) { + TLRPC.TL_account_resolveBusinessChatLink req = new TLRPC.TL_account_resolveBusinessChatLink(); + req.slug = chatLinkSlug; + + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_account_resolvedBusinessChatLinks) { + TLRPC.TL_account_resolvedBusinessChatLinks resolvedLink = (TLRPC.TL_account_resolvedBusinessChatLinks) res; + + MessagesController.getInstance(currentAccount).putUsers(resolvedLink.users, false); + MessagesController.getInstance(currentAccount).putChats(resolvedLink.chats, false); + MessagesStorage.getInstance(currentAccount).putUsersAndChats(resolvedLink.users, resolvedLink.chats, true, true); + + Bundle args = new Bundle(); + if (resolvedLink.peer instanceof TLRPC.TL_peerUser) { + args.putLong("user_id", resolvedLink.peer.user_id); + } else if (resolvedLink.peer instanceof TLRPC.TL_peerChat || resolvedLink.peer instanceof TLRPC.TL_peerChannel) { + args.putLong("chat_id", resolvedLink.peer.channel_id); + } + ChatActivity chatActivity = new ChatActivity(args); + chatActivity.setResolvedChatLink(resolvedLink); + presentFragment(chatActivity, false, true); + } else { + showAlertDialog(AlertsCreator.createSimpleAlert(LaunchActivity.this, LocaleController.getString(R.string.BusinessLink), LocaleController.getString(R.string.BusinessLinkInvalid))); + } + })); } if (requestId[0] != 0) { @@ -4880,6 +4913,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati final String message, final String contactToken, final String folderSlug, + final String text, final boolean hasUrl, final Integer messageId, final Long channelId, @@ -4907,6 +4941,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati final boolean forceNotInternalForApps, final int storyId, final boolean isBoost, + final String chatLinkSlug, TLRPC.User user, Runnable dismissLoading, boolean botAttachable, boolean ignoreInactive) { @@ -4920,7 +4955,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati progress.end(); } if (error1 != null) { - AndroidUtilities.runOnUIThread(() -> runLinkRequest(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, null, null, progress, forceNotInternalForApps, storyId, isBoost)); + AndroidUtilities.runOnUIThread(() -> runLinkRequest(intentAccount, username, group, sticker, emoji, botUser, botChat, botChannel, botChatAdminParams, message, contactToken, folderSlug, text, hasUrl, messageId, channelId, threadId, commentId, game, auth, lang, unsupportedUrl, code, loginToken, wallPaper, inputInvoiceSlug, theme, voicechat, livestream, state, videoTimestamp, setAsAttachBot, attachMenuBotToOpen, attachMenuBotChoose, null, null, progress, forceNotInternalForApps, storyId, isBoost, chatLinkSlug)); } else { TLRPC.TL_messages_botApp botApp = (TLRPC.TL_messages_botApp) response1; AndroidUtilities.runOnUIThread(() -> { @@ -5025,8 +5060,8 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati return; } Theme.ResourcesProvider resourcesProvider = lastFragment.getResourceProvider(); - if (lastFragment.storyViewer != null && lastFragment.storyViewer.isFullyVisible()) { - resourcesProvider = lastFragment.storyViewer.getResourceProvider(); + if (lastFragment.getLastStoryViewer() != null && lastFragment.getLastStoryViewer().isFullyVisible()) { + resourcesProvider = lastFragment.getLastStoryViewer().getResourceProvider(); } LimitReachedBottomSheet limitReachedBottomSheet = new LimitReachedBottomSheet(lastFragment, this, TYPE_BOOSTS_FOR_USERS, currentAccount, resourcesProvider); limitReachedBottomSheet.setCanApplyBoost(canApplyBoost); @@ -5723,6 +5758,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati finished = true; if (currentAccount != -1) { NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.appDidLogout); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.openBoostForUsersDialog); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.mainUserInfoChanged); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.attachMenuBotsDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.didUpdateConnectionState); @@ -5849,8 +5885,8 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati if (actionBarLayout.getFragmentStack().size() != 0) { BaseFragment fragment = actionBarLayout.getFragmentStack().get(actionBarLayout.getFragmentStack().size() - 1); fragment.onActivityResultFragment(requestCode, resultCode, data); - if (fragment.storyViewer != null && fragment.storyViewer.isShown()) { - fragment.storyViewer.onActivityResult(requestCode, resultCode, data); + if (fragment.getLastStoryViewer() != null) { + fragment.getLastStoryViewer().onActivityResult(requestCode, resultCode, data); } } if (AndroidUtilities.isTablet()) { @@ -6211,6 +6247,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati public void onMultiWindowModeChanged(boolean isInMultiWindowMode) { AndroidUtilities.isInMultiwindow = isInMultiWindowMode; checkLayout(); + super.onMultiWindowModeChanged(isInMultiWindowMode); } @Override @@ -6466,6 +6503,12 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati themeSwitchSunView.setVisibility(View.VISIBLE); themeSwitchSunView.invalidate(); } + if (sideMenu != null && sideMenu.getChildCount() > 0) { + View firstChild = sideMenu.getChildAt(0); + if (firstChild instanceof DrawerProfileCell) { + ((DrawerProfileCell) firstChild).updateSunDrawable(toDark); + } + } themeSwitchImageView.setImageBitmap(bitmap); themeSwitchImageView.setVisibility(View.VISIBLE); themeSwitchSunDrawable = darkThemeView.getAnimatedDrawable(); @@ -7427,12 +7470,8 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati int keyCode = event.getKeyCode(); if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) { BaseFragment baseFragment = getLastFragment(); - if (baseFragment != null && baseFragment.overlayStoryViewer != null && baseFragment.overlayStoryViewer.isShown()) { - baseFragment.overlayStoryViewer.dispatchKeyEvent(event); - return true; - } - if (baseFragment != null && baseFragment.storyViewer != null && baseFragment.storyViewer.isShown()) { - baseFragment.storyViewer.dispatchKeyEvent(event); + if (baseFragment != null && baseFragment.getLastStoryViewer() != null) { + baseFragment.getLastStoryViewer().dispatchKeyEvent(event); return true; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java index 2bb63ff02..f3dac656c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java @@ -575,7 +575,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter if (messageObject.isLiveLocation()) { actionBar.setTitle(LocaleController.getString("AttachLiveLocation", R.string.AttachLiveLocation)); otherItem = menu.addItem(0, R.drawable.ic_ab_other, getResourceProvider()); - otherItem.addSubItem(get_directions, R.drawable.navigate, LocaleController.getString("GetDirections", R.string.GetDirections)); + otherItem.addSubItem(get_directions, R.drawable.filled_directions, LocaleController.getString("GetDirections", R.string.GetDirections)); } else { if (messageObject.messageOwner.media.title != null && messageObject.messageOwner.media.title.length() > 0) { actionBar.setTitle(LocaleController.getString("SharedPlace", R.string.SharedPlace)); @@ -1060,7 +1060,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter ActionBarPopupWindow.ActionBarPopupWindowLayout popupLayout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(context); ActionBarMenuSubItem cell = new ActionBarMenuSubItem(getParentActivity(), true, true, getResourceProvider()); cell.setMinimumWidth(AndroidUtilities.dp(200)); - cell.setTextAndIcon(LocaleController.getString("GetDirections", R.string.GetDirections), R.drawable.navigate); + cell.setTextAndIcon(LocaleController.getString("GetDirections", R.string.GetDirections), R.drawable.filled_directions); cell.setOnClickListener(e -> { openDirections(location); if (popupWindow != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 0b5ae53b7..8c8316391 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -125,6 +125,7 @@ import org.telegram.tgnet.RequestDelegate; import org.telegram.tgnet.SerializedData; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; +import org.telegram.tgnet.tl.TL_stats; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; @@ -195,7 +196,8 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No private final static int MODE_LOGIN = 0, MODE_CANCEL_ACCOUNT_DELETION = 1, MODE_CHANGE_PHONE_NUMBER = 2, - MODE_CHANGE_LOGIN_EMAIL = 3; + MODE_CHANGE_LOGIN_EMAIL = 3, + MODE_BALANCE_PASSWORD = 4; private final static int VIEW_PHONE_INPUT = 0, VIEW_CODE_MESSAGE = 1, @@ -234,7 +236,8 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No MODE_LOGIN, MODE_CANCEL_ACCOUNT_DELETION, MODE_CHANGE_PHONE_NUMBER, - MODE_CHANGE_LOGIN_EMAIL + MODE_CHANGE_LOGIN_EMAIL, + MODE_BALANCE_PASSWORD }) public @interface ActivityMode {} @@ -432,6 +435,19 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No return this; } + private TLRPC.InputChannel channel; + private TLRPC.TL_account_password currentPassword; + private Utilities.Callback2 passwordFinishCallback; + + public LoginActivity promptPassword(TLRPC.TL_account_password currentPassword, TLRPC.InputChannel channel, Utilities.Callback2 callback) { + activityMode = MODE_BALANCE_PASSWORD; + currentViewNum = VIEW_PASSWORD; + this.channel = channel; + this.currentPassword = currentPassword; + passwordFinishCallback = callback; + return this; + } + public LoginActivity changePhoneNumber() { activityMode = MODE_CHANGE_PHONE_NUMBER; return this; @@ -996,7 +1012,7 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No @Override public boolean onBackPressed() { - if (currentViewNum == VIEW_PHONE_INPUT || activityMode == MODE_CHANGE_LOGIN_EMAIL && currentViewNum == VIEW_ADD_EMAIL) { + if (currentViewNum == VIEW_PHONE_INPUT || activityMode == MODE_CHANGE_LOGIN_EMAIL && currentViewNum == VIEW_ADD_EMAIL || activityMode == MODE_BALANCE_PASSWORD && currentViewNum == VIEW_PASSWORD) { for (int a = 0; a < views.length; a++) { if (views[a] != null) { views[a].onDestroyActivity(); @@ -4815,7 +4831,7 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No titleView = new TextView(context); titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - titleView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + titleView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); titleView.setText(LocaleController.getString(R.string.YourPasswordHeader)); titleView.setGravity(Gravity.CENTER); titleView.setLineSpacing(AndroidUtilities.dp(2), 1.0f); @@ -4857,7 +4873,7 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No cancelButton = new TextView(context); cancelButton.setGravity(Gravity.CENTER | Gravity.LEFT); - cancelButton.setText(LocaleController.getString("ForgotPassword", R.string.ForgotPassword)); + cancelButton.setText(LocaleController.getString(R.string.ForgotPassword)); cancelButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); cancelButton.setLineSpacing(AndroidUtilities.dp(2), 1.0f); cancelButton.setPadding(AndroidUtilities.dp(16), 0, AndroidUtilities.dp(16), 0); @@ -4867,73 +4883,83 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No addView(bottomContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.BOTTOM)); VerticalPositionAutoAnimator.attach(cancelButton); - cancelButton.setOnClickListener(view -> { - if (radialProgressView.getTag() != null) { - return; - } - if (currentPassword.has_recovery) { - needShowProgress(0); - TLRPC.TL_auth_requestPasswordRecovery req = new TLRPC.TL_auth_requestPasswordRecovery(); - ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { - needHideProgress(false); - if (error == null) { - final TLRPC.TL_auth_passwordRecovery res = (TLRPC.TL_auth_passwordRecovery) response; - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - - String rawPattern = res.email_pattern; - SpannableStringBuilder emailPattern = SpannableStringBuilder.valueOf(rawPattern); - int startIndex = rawPattern.indexOf('*'), endIndex = rawPattern.lastIndexOf('*'); - if (startIndex != endIndex && startIndex != -1 && endIndex != -1) { - TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); - run.flags |= TextStyleSpan.FLAG_STYLE_SPOILER; - run.start = startIndex; - run.end = endIndex + 1; - emailPattern.setSpan(new TextStyleSpan(run), startIndex, endIndex + 1, 0); - } - builder.setMessage(AndroidUtilities.formatSpannable(LocaleController.getString(R.string.RestoreEmailSent), emailPattern)); - builder.setTitle(LocaleController.getString("RestoreEmailSentTitle", R.string.RestoreEmailSentTitle)); - builder.setPositiveButton(LocaleController.getString(R.string.Continue), (dialogInterface, i) -> { - Bundle bundle = new Bundle(); - bundle.putString("email_unconfirmed_pattern", res.email_pattern); - bundle.putString("password", passwordString); - bundle.putString("requestPhone", requestPhone); - bundle.putString("phoneHash", phoneHash); - bundle.putString("phoneCode", phoneCode); - setPage(VIEW_RECOVER, true, bundle, false); - }); - Dialog dialog = showDialog(builder.create()); - if (dialog != null) { - dialog.setCanceledOnTouchOutside(false); - dialog.setCancelable(false); - } - } else { - if (error.text.startsWith("FLOOD_WAIT")) { - int time = Utilities.parseInt(error.text); - String timeString; - if (time < 60) { - timeString = LocaleController.formatPluralString("Seconds", time); - } else { - timeString = LocaleController.formatPluralString("Minutes", time / 60); - } - needShowAlert(LocaleController.getString(R.string.WrongCodeTitle), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); - } else { - needShowAlert(LocaleController.getString(R.string.RestorePasswordNoEmailTitle), error.text); - } - } - }), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); + if (activityMode == MODE_BALANCE_PASSWORD) { + cancelButton.setVisibility(View.GONE); + currentPassword = LoginActivity.this.currentPassword; + if (currentPassword != null && !TextUtils.isEmpty(currentPassword.hint)) { + codeField.setHint(currentPassword.hint); } else { - AndroidUtilities.hideKeyboard(codeField); - new AlertDialog.Builder(context) - .setTitle(LocaleController.getString(R.string.RestorePasswordNoEmailTitle)) - .setMessage(LocaleController.getString(R.string.RestorePasswordNoEmailText)) - .setPositiveButton(LocaleController.getString(R.string.Close), null) - .setNegativeButton(LocaleController.getString(R.string.ResetAccount), (dialog, which) -> tryResetAccount(requestPhone, phoneHash, phoneCode)) - .show(); + codeField.setHint(null); } - }); + } else { + cancelButton.setOnClickListener(view -> { + if (radialProgressView.getTag() != null) { + return; + } + if (currentPassword.has_recovery) { + needShowProgress(0); + TLRPC.TL_auth_requestPasswordRecovery req = new TLRPC.TL_auth_requestPasswordRecovery(); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + needHideProgress(false); + if (error == null) { + final TLRPC.TL_auth_passwordRecovery res = (TLRPC.TL_auth_passwordRecovery) response; + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + + String rawPattern = res.email_pattern; + SpannableStringBuilder emailPattern = SpannableStringBuilder.valueOf(rawPattern); + int startIndex = rawPattern.indexOf('*'), endIndex = rawPattern.lastIndexOf('*'); + if (startIndex != endIndex && startIndex != -1 && endIndex != -1) { + TextStyleSpan.TextStyleRun run = new TextStyleSpan.TextStyleRun(); + run.flags |= TextStyleSpan.FLAG_STYLE_SPOILER; + run.start = startIndex; + run.end = endIndex + 1; + emailPattern.setSpan(new TextStyleSpan(run), startIndex, endIndex + 1, 0); + } + builder.setMessage(AndroidUtilities.formatSpannable(LocaleController.getString(R.string.RestoreEmailSent), emailPattern)); + builder.setTitle(LocaleController.getString("RestoreEmailSentTitle", R.string.RestoreEmailSentTitle)); + builder.setPositiveButton(LocaleController.getString(R.string.Continue), (dialogInterface, i) -> { + Bundle bundle = new Bundle(); + bundle.putString("email_unconfirmed_pattern", res.email_pattern); + bundle.putString("password", passwordString); + bundle.putString("requestPhone", requestPhone); + bundle.putString("phoneHash", phoneHash); + bundle.putString("phoneCode", phoneCode); + setPage(VIEW_RECOVER, true, bundle, false); + }); + Dialog dialog = showDialog(builder.create()); + if (dialog != null) { + dialog.setCanceledOnTouchOutside(false); + dialog.setCancelable(false); + } + } else { + if (error.text.startsWith("FLOOD_WAIT")) { + int time = Utilities.parseInt(error.text); + String timeString; + if (time < 60) { + timeString = LocaleController.formatPluralString("Seconds", time); + } else { + timeString = LocaleController.formatPluralString("Minutes", time / 60); + } + needShowAlert(LocaleController.getString(R.string.WrongCodeTitle), LocaleController.formatString("FloodWaitTime", R.string.FloodWaitTime, timeString)); + } else { + needShowAlert(LocaleController.getString(R.string.RestorePasswordNoEmailTitle), error.text); + } + } + }), ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); + } else { + AndroidUtilities.hideKeyboard(codeField); + new AlertDialog.Builder(context) + .setTitle(LocaleController.getString(R.string.RestorePasswordNoEmailTitle)) + .setMessage(LocaleController.getString(R.string.RestorePasswordNoEmailText)) + .setPositiveButton(LocaleController.getString(R.string.Close), null) + .setNegativeButton(LocaleController.getString(R.string.ResetAccount), (dialog, which) -> tryResetAccount(requestPhone, phoneHash, phoneCode)) + .show(); + } + }); + } } @Override @@ -5001,6 +5027,10 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No return; } + if (currentPassword == null) { + return; + } + String oldPassword = codeField.getText().toString(); if (oldPassword.length() == 0) { onPasscodeError(false); @@ -5022,8 +5052,6 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No } - final TLRPC.TL_auth_checkPassword req = new TLRPC.TL_auth_checkPassword(); - RequestDelegate requestDelegate = (response, error) -> AndroidUtilities.runOnUIThread(() -> { nextPressed = false; if (error != null && "SRP_ID_INVALID".equals(error.text)) { @@ -5037,7 +5065,10 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No return; } - if (response instanceof TLRPC.TL_auth_authorization) { + if (response instanceof TL_stats.TL_broadcastRevenueWithdrawalUrl) { + passwordFinishCallback.run((TL_stats.TL_broadcastRevenueWithdrawalUrl) response, null); + finishFragment(); + } else if (response instanceof TLRPC.TL_auth_authorization) { showDoneButton(false, true); postDelayed(() -> { needHideProgress(false, false); @@ -5064,14 +5095,23 @@ public class LoginActivity extends BaseFragment implements NotificationCenter.No }); if (current_algo instanceof TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) { - req.password = SRPHelper.startCheck(x_bytes, currentPassword.srp_id, currentPassword.srp_B, (TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) current_algo); - if (req.password == null) { + TLRPC.TL_inputCheckPasswordSRP password = SRPHelper.startCheck(x_bytes, currentPassword.srp_id, currentPassword.srp_B, (TLRPC.TL_passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow) current_algo); + if (password == null) { TLRPC.TL_error error = new TLRPC.TL_error(); error.text = "PASSWORD_HASH_INVALID"; requestDelegate.run(null, error); return; } - ConnectionsManager.getInstance(currentAccount).sendRequest(req, requestDelegate, ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); + if (activityMode == MODE_BALANCE_PASSWORD) { + final TL_stats.TL_getBroadcastRevenueWithdrawalUrl req = new TL_stats.TL_getBroadcastRevenueWithdrawalUrl(); + req.channel = channel; + req.password = password; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, requestDelegate, ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); + } else { + final TLRPC.TL_auth_checkPassword req = new TLRPC.TL_auth_checkPassword(); + req.password = password; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, requestDelegate, ConnectionsManager.RequestFlagFailOnServerErrors | ConnectionsManager.RequestFlagWithoutLogin); + } } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessageStatisticActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessageStatisticActivity.java index 441004399..32a3f7b8f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessageStatisticActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessageStatisticActivity.java @@ -55,6 +55,7 @@ import org.telegram.messenger.R; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; +import org.telegram.tgnet.tl.TL_stats; import org.telegram.tgnet.tl.TL_stories; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; @@ -606,14 +607,14 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati listViewAdapter.notifyDataSetChanged(); } if (messageObject.isStory()) { - TLRPC.TL_stats_getStoryPublicForwards req = new TLRPC.TL_stats_getStoryPublicForwards(); + TL_stats.TL_getStoryPublicForwards req = new TL_stats.TL_getStoryPublicForwards(); req.limit = count; req.id = messageObject.storyItem.id; req.peer = getMessagesController().getInputPeer(-chatId); req.offset = nextOffset == null ? "" : nextOffset; int reqId = getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (error == null) { - TLRPC.TL_stats_publicForwards res = (TLRPC.TL_stats_publicForwards) response; + TL_stats.TL_publicForwards res = (TL_stats.TL_publicForwards) response; if ((res.flags & 1) != 0) { nextOffset = res.next_offset; } else { @@ -628,7 +629,7 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati getMessagesController().putChats(res.chats, false); getMessagesController().putUsers(res.users, false); - for (TLRPC.PublicForward forward : res.forwards) { + for (TL_stats.PublicForward forward : res.forwards) { if (forward instanceof TL_stories.TL_publicForwardStory) { TL_stories.TL_publicForwardStory forwardStory = (TL_stories.TL_publicForwardStory) forward; forwardStory.story.dialogId = DialogObject.getPeerDialogId(forwardStory.peer); @@ -636,8 +637,8 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati MessageObject msg = new MessageObject(currentAccount, forwardStory.story); msg.generateThumbs(false); messages.add(msg); - } else if (forward instanceof TLRPC.TL_publicForwardMessage) { - TLRPC.TL_publicForwardMessage forwardMessage = (TLRPC.TL_publicForwardMessage) forward; + } else if (forward instanceof TL_stats.TL_publicForwardMessage) { + TL_stats.TL_publicForwardMessage forwardMessage = (TL_stats.TL_publicForwardMessage) forward; messages.add(new MessageObject(currentAccount, forwardMessage.message, false, true)); } } @@ -653,7 +654,7 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati getConnectionsManager().bindRequestToGuid(reqId, classGuid); return; } - TLRPC.TL_stats_getMessagePublicForwards req = new TLRPC.TL_stats_getMessagePublicForwards(); + TL_stats.TL_getMessagePublicForwards req = new TL_stats.TL_getMessagePublicForwards(); req.limit = count; if (messageObject.messageOwner.fwd_from != null) { req.msg_id = messageObject.messageOwner.fwd_from.saved_from_msg_id; @@ -665,7 +666,7 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati req.offset = nextOffset == null ? "" : nextOffset; int reqId = getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (error == null) { - TLRPC.TL_stats_publicForwards res = (TLRPC.TL_stats_publicForwards) response; + TL_stats.TL_publicForwards res = (TL_stats.TL_publicForwards) response; if ((res.flags & 1) != 0) { nextOffset = res.next_offset; } else { @@ -680,7 +681,7 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati getMessagesController().putChats(res.chats, false); getMessagesController().putUsers(res.users, false); - for (TLRPC.PublicForward forward : res.forwards) { + for (TL_stats.PublicForward forward : res.forwards) { if (forward instanceof TL_stories.TL_publicForwardStory) { TL_stories.TL_publicForwardStory forwardStory = (TL_stories.TL_publicForwardStory) forward; forwardStory.story.dialogId = DialogObject.getPeerDialogId(forwardStory.peer); @@ -688,8 +689,8 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati MessageObject msg = new MessageObject(currentAccount, forwardStory.story); msg.generateThumbs(false); messages.add(msg); - } else if (forward instanceof TLRPC.TL_publicForwardMessage) { - TLRPC.TL_publicForwardMessage forwardMessage = (TLRPC.TL_publicForwardMessage) forward; + } else if (forward instanceof TL_stats.TL_publicForwardMessage) { + TL_stats.TL_publicForwardMessage forwardMessage = (TL_stats.TL_publicForwardMessage) forward; messages.add(new MessageObject(currentAccount, forwardMessage.message, false, true)); } } @@ -713,7 +714,7 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati req.peer = getMessagesController().getInputPeer(-chatId); reqObject = req; } else { - TLRPC.TL_stats_getMessageStats req = new TLRPC.TL_stats_getMessageStats(); + TL_stats.TL_getMessageStats req = new TL_stats.TL_getMessageStats(); if (messageObject.messageOwner.fwd_from != null) { req.msg_id = messageObject.messageOwner.fwd_from.saved_from_msg_id; req.channel = getMessagesController().getInputChannel(-messageObject.getFromChatId()); @@ -731,14 +732,14 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati return; } - TLRPC.StatsGraph views_graph; - TLRPC.StatsGraph reactions_by_emotion_graph; + TL_stats.StatsGraph views_graph; + TL_stats.StatsGraph reactions_by_emotion_graph; if (response instanceof TL_stories.TL_stats_storyStats) { TL_stories.TL_stats_storyStats res = (TL_stories.TL_stats_storyStats) response; views_graph = res.views_graph; reactions_by_emotion_graph = res.reactions_by_emotion_graph; } else { - TLRPC.TL_stats_messageStats res = (TLRPC.TL_stats_messageStats) response; + TL_stats.TL_messageStats res = (TL_stats.TL_messageStats) response; views_graph = res.views_graph; reactions_by_emotion_graph = res.reactions_by_emotion_graph; } @@ -747,7 +748,7 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati reactionsByEmotionData = StatisticActivity.createViewData(reactions_by_emotion_graph, LocaleController.getString("ReactionsByEmotionChartTitle", R.string.ReactionsByEmotionChartTitle), 2, false); if (interactionsViewData != null && interactionsViewData.chartData.x.length <= 5) { statsLoaded = false; - TLRPC.TL_stats_loadAsyncGraph request = new TLRPC.TL_stats_loadAsyncGraph(); + TL_stats.TL_loadAsyncGraph request = new TL_stats.TL_loadAsyncGraph(); request.token = interactionsViewData.zoomToken; request.x = interactionsViewData.chartData.x[interactionsViewData.chartData.x.length - 1]; request.flags |= 1; @@ -755,17 +756,17 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati final String cacheKey = interactionsViewData.zoomToken + "_" + request.x; int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(request, (response1, error1) -> { ChartData childData = null; - if (response1 instanceof TLRPC.TL_statsGraph) { - String json = ((TLRPC.TL_statsGraph) response1).json.data; + if (response1 instanceof TL_stats.TL_statsGraph) { + String json = ((TL_stats.TL_statsGraph) response1).json.data; try { childData = StatisticActivity.createChartData(new JSONObject(json), 1, false); } catch (JSONException e) { e.printStackTrace(); } - } else if (response1 instanceof TLRPC.TL_statsGraphError) { + } else if (response1 instanceof TL_stats.TL_statsGraphError) { AndroidUtilities.runOnUIThread(() -> { if (getParentActivity() != null) { - Toast.makeText(getParentActivity(), ((TLRPC.TL_statsGraphError) response1).error, Toast.LENGTH_LONG).show(); + Toast.makeText(getParentActivity(), ((TL_stats.TL_statsGraphError) response1).error, Toast.LENGTH_LONG).show(); } }); } @@ -874,7 +875,7 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati return; } - TLRPC.TL_stats_loadAsyncGraph request = new TLRPC.TL_stats_loadAsyncGraph(); + TL_stats.TL_loadAsyncGraph request = new TL_stats.TL_loadAsyncGraph(); request.token = data.zoomToken; if (x != 0) { request.x = x; @@ -888,15 +889,15 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(request, (response, error) -> { ChartData childData = null; - if (response instanceof TLRPC.TL_statsGraph) { - String json = ((TLRPC.TL_statsGraph) response).json.data; + if (response instanceof TL_stats.TL_statsGraph) { + String json = ((TL_stats.TL_statsGraph) response).json.data; try { childData = StatisticActivity.createChartData(new JSONObject(json), data.graphType, false); } catch (JSONException e) { e.printStackTrace(); } - } else if (response instanceof TLRPC.TL_statsGraphError) { - Toast.makeText(getContext(), ((TLRPC.TL_statsGraphError) response).error, Toast.LENGTH_LONG).show(); + } else if (response instanceof TL_stats.TL_statsGraphError) { + Toast.makeText(getContext(), ((TL_stats.TL_statsGraphError) response).error, Toast.LENGTH_LONG).show(); } ChartData finalChildData = childData; @@ -933,7 +934,7 @@ public class MessageStatisticActivity extends BaseFragment implements Notificati } @Override - void loadData(StatisticActivity.ChartViewData viewData) { + protected void loadData(StatisticActivity.ChartViewData viewData) { // viewData.load(currentAccount, classGuid, ); } }; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MultiContactsSelectorBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/MultiContactsSelectorBottomSheet.java index 9bcf57872..763db02bb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MultiContactsSelectorBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MultiContactsSelectorBottomSheet.java @@ -483,7 +483,7 @@ public class MultiContactsSelectorBottomSheet extends BottomSheetWithRecyclerLis } @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { selectorAdapter = new SelectorAdapter(getContext(), resourcesProvider); selectorAdapter.setGreenSelector(true); return selectorAdapter; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java index 318085e19..6c88f9b91 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java @@ -47,6 +47,7 @@ import android.widget.Toast; import androidx.annotation.IntDef; import androidx.annotation.NonNull; +import androidx.biometric.BiometricManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -59,7 +60,6 @@ import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; -import org.telegram.messenger.support.fingerprint.FingerprintManagerCompat; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; @@ -876,8 +876,10 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter changePasscodeRow = rowCount++; try { if (Build.VERSION.SDK_INT >= 23) { - FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(ApplicationLoader.applicationContext); - if (fingerprintManager.isHardwareDetected() && AndroidUtilities.isKeyguardSecure()) { + if ( + BiometricManager.from(getContext()).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG) == BiometricManager.BIOMETRIC_SUCCESS && + AndroidUtilities.isKeyguardSecure() + ) { fingerprintRow = rowCount++; } else { fingerprintRow = -1; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PaymentFormActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PaymentFormActivity.java index 335c555ff..29e7544ac 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PaymentFormActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PaymentFormActivity.java @@ -539,10 +539,12 @@ public class PaymentFormActivity extends BaseFragment implements NotificationCen actionBar.setTitle(LocaleController.getString("PaymentShippingMethod", R.string.PaymentShippingMethod)); break; case STEP_PAYMENT_INFO: - actionBar.setTitle(LocaleController.getString("PaymentCardInfo", R.string.PaymentCardInfo)); - break; case STEP_CONFIRM_PASSWORD: - actionBar.setTitle(LocaleController.getString("PaymentCardInfo", R.string.PaymentCardInfo)); + if (paymentFormMethod != null && !TextUtils.isEmpty(paymentFormMethod.title)) { + actionBar.setTitle(paymentFormMethod.title); + } else { + actionBar.setTitle(LocaleController.getString("PaymentCardInfo", R.string.PaymentCardInfo)); + } break; case STEP_CHECKOUT: if (paymentForm.invoice.test) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PeerColorActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PeerColorActivity.java index 2dd4f57a4..69fd28e50 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PeerColorActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PeerColorActivity.java @@ -28,8 +28,12 @@ import android.graphics.RectF; import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.os.Build; +import android.text.Spannable; +import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; +import android.text.style.DynamicDrawableSpan; +import android.text.style.ImageSpan; import android.text.style.ReplacementSpan; import android.util.SparseIntArray; import android.util.TypedValue; @@ -1334,6 +1338,18 @@ public class PeerColorActivity extends BaseFragment implements NotificationCente } } + public static CharSequence withLevelLock(CharSequence text, int lvl) { + if (lvl <= 0) return text; + final Context context = ApplicationLoader.applicationContext; + SpannableStringBuilder ssb = new SpannableStringBuilder(text); + ssb.append(" L"); + LevelLock drawable = new LevelLock(context, lvl, null); + ColoredImageSpan span = new ColoredImageSpan(drawable); + span.setTranslateY(dp(1)); + ssb.setSpan(span, ssb.length() - 1, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + return ssb; + } + public static class ChangeNameColorCell extends View { private final int currentAccount; private final boolean isChannelOrGroup; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index 1fc2fa576..1bd7692f3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -40,6 +40,7 @@ import android.graphics.Outline; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PixelFormat; +import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.PorterDuffXfermode; @@ -178,6 +179,7 @@ import org.telegram.messenger.VideoEditedInfo; import org.telegram.messenger.WebFile; import org.telegram.messenger.browser.Browser; import org.telegram.messenger.camera.Size; +import org.telegram.messenger.video.MediaCodecVideoConvertor; import org.telegram.messenger.video.VideoPlayerRewinder; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; @@ -230,6 +232,9 @@ import org.telegram.ui.Components.MediaActivity; import org.telegram.ui.Components.OptionsSpeedIconDrawable; import org.telegram.ui.Components.OtherDocumentPlaceholderDrawable; import org.telegram.ui.Components.Paint.Views.LPhotoPaintView; +import org.telegram.ui.Components.Paint.Views.StickerCutOutBtn; +import org.telegram.ui.Components.Paint.Views.StickerMakerView; +import org.telegram.ui.Components.Paint.Views.StickerMakerBackgroundView; import org.telegram.ui.Components.PaintingOverlay; import org.telegram.ui.Components.PhotoCropView; import org.telegram.ui.Components.PhotoFilterView; @@ -249,6 +254,7 @@ import org.telegram.ui.Components.SizeNotifierFrameLayoutPhoto; import org.telegram.ui.Components.SpeedIconDrawable; import org.telegram.ui.Components.StickersAlert; import org.telegram.ui.Components.TextViewSwitcher; +import org.telegram.ui.Components.ThanosEffect; import org.telegram.ui.Components.Tooltip; import org.telegram.ui.Components.TranslateAlert2; import org.telegram.ui.Components.URLSpanReplacement; @@ -264,6 +270,7 @@ import org.telegram.ui.Components.ViewHelper; import org.telegram.ui.Components.spoilers.SpoilersTextView; import org.telegram.ui.Stories.DarkThemeResourceProvider; import org.telegram.ui.Stories.recorder.KeyboardNotifier; +import org.telegram.ui.Stories.recorder.StoryEntry; import java.io.ByteArrayInputStream; import java.io.File; @@ -1007,6 +1014,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat public final static int SELECT_TYPE_AVATAR = 1; public final static int SELECT_TYPE_WALLPAPER = 3; public final static int SELECT_TYPE_QR = 10; + public final static int SELECT_TYPE_STICKER = 11; VideoPlayerRewinder videoPlayerRewinder = new VideoPlayerRewinder() { @Override @@ -1798,7 +1806,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private PaintingOverlay leftPaintingOverlay; private PaintingOverlay rightPaintingOverlay; private ImageReceiver leftImage = new ImageReceiver(); - private ImageReceiver centerImage = new ImageReceiver(); + private ImageReceiver centerImage = new ImageReceiver() { + @Override + protected boolean setImageBitmapByKey(Drawable drawable, String key, int type, boolean memCache, int guid) { + boolean result = super.setImageBitmapByKey(drawable, key, type, memCache, guid); + prepareSegmentImage(); + return result; + } + }; private ImageReceiver rightImage = new ImageReceiver(); private BlurringShader.ThumbBlurer leftBlur = new BlurringShader.ThumbBlurer(1, this::invalidateBlur); private BlurringShader.ThumbBlurer centerBlur = new BlurringShader.ThumbBlurer(1, this::invalidateBlur); @@ -1806,6 +1821,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private boolean leftImageIsVideo; private boolean centerImageIsVideo; private boolean rightImageIsVideo; + private boolean centerImageTransformLocked = false; + private Matrix centerImageTransform = new Matrix(); private Paint videoFrameBitmapPaint = new Paint(); private Bitmap videoFrameBitmap = null; private int currentIndex; @@ -1831,6 +1848,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat boolean fromCamera; private boolean captionTranslated; private String captionDetectedLanguage; + private StickerMakerView stickerMakerView; + private StickerMakerBackgroundView stickerMakerBackgroundView; + private StickerCutOutBtn cutOutBtn; private long avatarsDialogId; private boolean canEditAvatar; @@ -2741,6 +2761,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat super(context, activity, false); setWillNotDraw(false); paint.setColor(0x33000000); + setLayerType(LAYER_TYPE_HARDWARE, null); } @Override @@ -3764,6 +3785,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat break; } } + } else if (id == NotificationCenter.customStickerCreated) { + closePhoto(false, false); } else if (id == NotificationCenter.fileLoaded) { String location = (String) args[0]; for (int a = 0; a < 3; a++) { @@ -4396,7 +4419,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat wasLayout = true; if (changed) { if (!dontResetZoomOnFirstLayout) { - scale = 1; + scale = scale1(); translationX = 0; translationY = 0; updateMinMax(scale); @@ -4457,6 +4480,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat closeCaptionEnter(true); return false; } + if (ContentPreviewViewer.getInstance().isVisible()) { + ContentPreviewViewer.getInstance().closeWithMenu(); + return false; + } PhotoViewer.getInstance().closePhoto(true, false); return true; } @@ -4465,6 +4492,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat @Override protected void onDraw(Canvas canvas) { + if (stickerMakerBackgroundView != null) { + View parent = (View) stickerMakerBackgroundView.getParent(); + float alpha = Math.min(stickerMakerBackgroundView.getAlpha(), parent != null ? parent.getAlpha() : 1f); + if (alpha > 0) { + canvas.saveLayerAlpha(0, 0, getWidth(), getHeight(), (int) alpha * 255, Canvas.ALL_SAVE_FLAG); + stickerMakerBackgroundView.draw(canvas); + canvas.restore(); + } + } if (Build.VERSION.SDK_INT >= 21 && isVisible) { blackPaint.setAlpha(backgroundDrawable.getAlpha()); canvas.drawRect(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight() + insets.bottom, blackPaint); @@ -4516,7 +4552,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { View overlay = textSelectionHelper.getOverlayView(windowView.getContext()); - if (child == overlay) { + if (child == overlay || child == stickerMakerBackgroundView) { return false; } return super.drawChild(canvas, child, drawingTime); @@ -5471,7 +5507,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat containerView.addView(bottomLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM | Gravity.LEFT)); navigationBar = new View(activityContext); - navigationBar.setBackgroundColor(0x7f000000); + navigationBar.setBackgroundColor((sendPhotoType == SELECT_TYPE_STICKER ? 0xFF000000 : 0x7f000000)); windowView.addView(navigationBar, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, navigationBarHeight / AndroidUtilities.density, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL)); pressedDrawable[0] = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, new int[] {0x32000000, 0}); @@ -5751,6 +5787,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (captionEdit != null && captionEdit.getVisibility() != GONE) { captionEdit.setAlpha(alpha); } + if (cutOutBtn != null && cutOutBtn.getVisibility() != GONE) { + cutOutBtn.setAlpha(alpha); + } + if (stickerMakerView != null && stickerMakerView.getVisibility() != GONE) { + stickerMakerView.setAlpha(alpha); + } + if (stickerMakerBackgroundView != null && stickerMakerBackgroundView.getVisibility() != GONE) { + stickerMakerBackgroundView.setAlpha(alpha); + } } @Override @@ -6070,7 +6115,131 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat placeProvider.needAddMorePhotos(); closePhoto(true, false); }); + + stickerMakerBackgroundView = new StickerMakerBackgroundView(activityContext) { + @Override + public void setAlpha(float alpha) { + super.setAlpha(alpha); + windowView.invalidate(); + } + }; + containerView.addView(stickerMakerBackgroundView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 0, 0, 0, 0)); + stickerMakerView = new StickerMakerView(activityContext, resourcesProvider); + + stickerMakerView.setCurrentAccount(currentAccount); + containerView.addView(stickerMakerView, containerView.indexOfChild(actionBar) - 1, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 0, 0, 0, 0)); + cutOutBtn = new StickerCutOutBtn(stickerMakerView, activityContext, resourcesProvider, blurManager) { + private final Path path = new Path(); + + @Override + protected void onDraw(Canvas canvas) { + canvas.save(); + path.rewind(); + path.addRoundRect(bounds, dp(8), dp(8), Path.Direction.CW); + canvas.clipPath(path); + canvas.translate(-getX(), -getY()); + drawCaptionBlur(canvas, blurDrawer, 0xFF2b2b2b, 0x33000000, false, true, false); + canvas.restore(); + super.onDraw(canvas); + } + }; + stickerMakerView.setStickerCutOutBtn(cutOutBtn); + cutOutBtn.setOnClickListener(v -> { + if (cutOutBtn.isLoading()) { + return; + } + if (currentIndex < 0 || currentIndex >= imagesArrLocals.size() || stickerMakerView.isThanosInProgress) { + return; + } + MediaController.MediaEditState entry = (MediaController.MediaEditState) imagesArrLocals.get(currentIndex); + boolean hasFilters = !TextUtils.isEmpty(entry.filterPath); + if (cutOutBtn.isCutOutState()) { + cutOutBtn.setCancelState(true); + stickerMakerView.enableClippingMode(segmentedObject -> { + if (stickerMakerView.hasSegmentedBitmap()) { + ThanosEffect thanosEffect = stickerMakerView.getThanosEffect(); + stickerMakerView.setSegmentedState(true, segmentedObject); + Bitmap segmentedImage = stickerMakerView.getSegmentedImage(centerImage.getBitmap(), hasFilters, centerImage.getOrientation()); + + Object object = imagesArrLocals.get(currentIndex); + MediaController.PhotoEntry photoEntry = ((MediaController.PhotoEntry) object); + + if (thanosEffect == null/* || photoEntry.isCropped || centerImage.getOrientation() == 180*/) { + centerImage.setImageBitmap(segmentedImage); + cutOutBtn.setUndoCutState(true); + cutOutBtn.postDelayed(this::applyCurrentEditMode, 250); + return; + } + + Bitmap bitmap = stickerMakerView.getThanosImage(photoEntry, centerImage.getOrientation()); + if (bitmap == null) { + centerImage.setImageBitmap(segmentedImage); + cutOutBtn.setUndoCutState(true); + cutOutBtn.postDelayed(this::applyCurrentEditMode, 250); + return; + } + if (entry.cropState != null) { + bitmap = createCroppedBitmap(bitmap, entry.cropState, new int[]{centerImage.getOrientation(), centerImage.getInvert()}, true); + } + + Matrix matrix = new Matrix(); + float w = getContainerViewWidth(), h = stickerMakerView.getSegmentBorderImageHeight(); + float tx = 0, ty = 0; + if (centerImage.getOrientation() != 0 && !photoEntry.isCropped) { + final float bw = bitmap.getWidth(); + final float bh = bitmap.getHeight(); + final float r = (float) Math.sqrt((bw / 2f) * (bw / 2f) + (bh / 2f) * (bh / 2f)); + final float d = 2 * r; + Bitmap newBitmap = Bitmap.createBitmap((int) d, (int) d, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(newBitmap); + canvas.save(); + canvas.rotate(centerImage.getOrientation(), r, r); + canvas.drawBitmap(bitmap, (d - bw) / 2, (d - bh) / 2, null); + bitmap.recycle(); + bitmap = newBitmap; + + final float pd = 2 * (float) Math.sqrt((w / 2f) * (w / 2f) + (h / 2f) * (h / 2f)); + tx = -(pd - w) / 2; + ty = -(pd - h) / 2; + w = pd; + h = pd; + } + matrix.postScale(w, h); + matrix.postScale(scale, scale, w / 2f, h / 2f); + int marginTop = (int) ((getContainerViewHeight() - stickerMakerView.getSegmentBorderImageHeight()) / 2f); + matrix.postTranslate(translationX + tx, translationY + ty + marginTop); + stickerMakerView.isThanosInProgress = true; + thanosEffect.animate(matrix, bitmap, () -> { + centerImage.setImageBitmap(segmentedImage); + cutOutBtn.setUndoCutState(true); + cutOutBtn.postDelayed(() -> { + applyCurrentEditMode(); + stickerMakerView.isThanosInProgress = false; + }, 1000); + }, () -> {}); + } else { + cutOutBtn.setCutOutState(true); + } + stickerMakerView.disableClippingMode(); + containerView.invalidate(); + }); + containerView.invalidate(); + } else if (cutOutBtn.isCancelState()) { + cutOutBtn.setCutOutState(true); + stickerMakerView.disableClippingMode(); + containerView.invalidate(); + } else { + stickerMakerView.setSegmentedState(false, null); + centerImage.setImageBitmap(stickerMakerView.getSourceBitmap(hasFilters)); + cutOutBtn.setCutOutState(true); + cutOutBtn.postDelayed(this::applyCurrentEditMode, 250); + } + }); + cutOutBtn.setCutOutState(false); + containerView.addView(cutOutBtn, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM | Gravity.LEFT, 10, 0, 10, 48 + 24)); + showEditCaption(false, false); + showStickerMode(false, false); captionEditContainer = new FrameLayout(parentActivity) { @Override @@ -6119,7 +6288,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (placeProvider != null && !placeProvider.allowSendingSubmenu()) { return false; } - boolean isStoryViewer = parentFragment != null && parentFragment.storyViewer != null && parentFragment.storyViewer.isShown(); + boolean isStoryViewer = parentFragment != null && parentFragment.getLastStoryViewer() != null; if (!isStoryViewer && (parentChatActivity == null || parentChatActivity.isInScheduleMode())) { return false; } @@ -6308,6 +6477,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat cropItem.setBackgroundDrawable(Theme.createSelectorDrawable(Theme.ACTION_BAR_WHITE_SELECTOR_COLOR)); itemsLayout.addView(cropItem, LayoutHelper.createLinear(48, 48)); cropItem.setOnClickListener(v -> { + cancelStickerClippingMode(); if (isCaptionOpen()) { return; } @@ -6350,6 +6520,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat paintItem.setBackgroundDrawable(Theme.createSelectorDrawable(Theme.ACTION_BAR_WHITE_SELECTOR_COLOR)); itemsLayout.addView(paintItem, LayoutHelper.createLinear(48, 48)); paintItem.setOnClickListener(v -> { + cancelStickerClippingMode(); if (isCaptionOpen()) { return; } @@ -6423,6 +6594,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat tuneItem.setBackgroundDrawable(Theme.createSelectorDrawable(Theme.ACTION_BAR_WHITE_SELECTOR_COLOR)); itemsLayout.addView(tuneItem, LayoutHelper.createLinear(48, 48)); tuneItem.setOnClickListener(v -> { + cancelStickerClippingMode(); if (isCaptionOpen()) { return; } @@ -6515,10 +6687,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat ImageReceiver.ImageReceiverDelegate imageReceiverDelegate = (imageReceiver, set, thumb, memCache) -> { if (imageReceiver == centerImage && set && !thumb) { - if (!isCurrentVideo && (currentEditMode == EDIT_MODE_CROP || sendPhotoType == SELECT_TYPE_AVATAR) && photoCropView != null) { + if (!isCurrentVideo && (currentEditMode == EDIT_MODE_CROP || sendPhotoType == SELECT_TYPE_AVATAR || sendPhotoType == SELECT_TYPE_STICKER) && photoCropView != null) { Bitmap bitmap = imageReceiver.getBitmap(); if (bitmap != null) { - photoCropView.setBitmap(bitmap, imageReceiver.getOrientation(), sendPhotoType != SELECT_TYPE_AVATAR, true, paintingOverlay, cropTransform, null, null); + photoCropView.setBitmap(bitmap, imageReceiver.getOrientation(), sendPhotoType != SELECT_TYPE_AVATAR && sendPhotoType != SELECT_TYPE_STICKER, true, paintingOverlay, cropTransform, null, null); } } if (paintingOverlay.getVisibility() == View.VISIBLE) { @@ -6526,7 +6698,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } detectFaces(); } - if (imageReceiver == centerImage && set && placeProvider != null && placeProvider.scaleToFill() && !ignoreDidSetImage && sendPhotoType != SELECT_TYPE_AVATAR) { + if (imageReceiver == centerImage && set && placeProvider != null && placeProvider.scaleToFill() && !ignoreDidSetImage && sendPhotoType != SELECT_TYPE_AVATAR && sendPhotoType != SELECT_TYPE_STICKER) { if (!wasLayout) { dontResetZoomOnFirstLayout = true; } else { @@ -6848,6 +7020,146 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } if (!replace) { + if (sendPhotoType == SELECT_TYPE_STICKER) { + Object object = imagesArrLocals.get(currentIndex); + if (object instanceof MediaController.PhotoEntry) { + int stickerMaxSize = 512; + MediaController.PhotoEntry photoEntry = ((MediaController.PhotoEntry) object); + String path = photoEntry.imagePath != null ? photoEntry.imagePath : photoEntry.path; + Bitmap paintBitmap = BitmapFactory.decodeFile(path); + Bitmap canvasBitmap = Bitmap.createBitmap(stickerMaxSize, stickerMaxSize, Bitmap.Config.ARGB_8888); + + float scaleImage = Math.min( + (float) getContainerViewWidth() / paintBitmap.getWidth(), + (float) getContainerViewHeight() / paintBitmap.getHeight() + ) / (getContainerViewWidth() - dp(20)) * canvasBitmap.getWidth() * scale; + float scaleContainer = (float) canvasBitmap.getWidth() / (getContainerViewWidth() - dp(20)); + + Canvas canvas = new Canvas(canvasBitmap); + Matrix matrix = new Matrix(); + + if (centerImage.getOrientation() != 0 && !(photoEntry.isPainted || photoEntry.isCropped)) { + float cx = paintBitmap.getWidth() / 2f; + float cy = paintBitmap.getHeight() / 2f; + matrix.postRotate(centerImage.getOrientation(), cx, cy); + float scaleFactor = paintBitmap.getWidth() / (float) paintBitmap.getHeight(); + matrix.postScale(scaleFactor, scaleFactor, cx, cy); + } + + matrix.postScale(scaleImage, scaleImage); + float newSrcImgWidth = paintBitmap.getWidth() * scaleImage; + float newSrcImgHeight = paintBitmap.getHeight() * scaleImage; + float dyToCenter = -(newSrcImgHeight - canvasBitmap.getHeight()) / 2; + float dxToCenter = -(newSrcImgWidth - canvasBitmap.getWidth()) / 2; + matrix.postTranslate(dxToCenter, dyToCenter); + + matrix.postTranslate(translationX * scaleContainer, translationY * scaleContainer); + Path clipPath = new Path(); + RectF clipRect = new RectF(); + clipRect.set(0, 0, canvasBitmap.getWidth(), canvasBitmap.getHeight()); + int r = canvasBitmap.getWidth() / 8; + clipPath.addRoundRect(clipRect, r, r, Path.Direction.CW); + canvas.clipPath(clipPath); + canvas.drawBitmap(paintBitmap, matrix, new Paint(Paint.FILTER_BITMAP_FLAG)); + + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(canvasBitmap, Bitmap.CompressFormat.WEBP, stickerMaxSize, stickerMaxSize, 100, false, 101, 101); + final String fullStickerPath = FileLoader.getInstance(UserConfig.selectedAccount).getPathToAttach(size, "webp", true).toString(); + + VideoEditedInfo videoEditedInfo1 = null; + if (hasAnimatedMediaEntities()) { + ArrayList entities = new ArrayList<>(); + for (VideoEditedInfo.MediaEntity entity : photoEntry.mediaEntities) { + VideoEditedInfo.MediaEntity e = entity.copy(); + AndroidUtilities.rectTmp.set( + e.x * paintBitmap.getWidth(), + e.y * paintBitmap.getHeight(), + (e.x + e.width) * paintBitmap.getWidth(), + (e.y + e.height) * paintBitmap.getHeight() + ); + matrix.mapRect(AndroidUtilities.rectTmp); + e.x = AndroidUtilities.rectTmp.left / canvasBitmap.getWidth(); + e.y = AndroidUtilities.rectTmp.top / canvasBitmap.getHeight(); + e.width = AndroidUtilities.rectTmp.width() / canvasBitmap.getWidth(); + e.height = AndroidUtilities.rectTmp.height() / canvasBitmap.getHeight(); + e.scale *= scaleImage; + entities.add(e); + } + videoEditedInfo1 = new VideoEditedInfo(); + videoEditedInfo1.originalPath = fullStickerPath; + videoEditedInfo1.isPhoto = true; + videoEditedInfo1.originalWidth = videoEditedInfo1.resultWidth = stickerMaxSize; + videoEditedInfo1.originalHeight = videoEditedInfo1.resultHeight = stickerMaxSize; + videoEditedInfo1.mediaEntities = entities; + videoEditedInfo1.originalDuration = videoEditedInfo1.estimatedDuration = Utilities.clamp(photoEntry.averageDuration, 2800L, 800L); + videoEditedInfo1.bitrate = (int) (255 * 1024 * 8 / (videoEditedInfo1.originalDuration / 1000.0) * 0.24); + videoEditedInfo1.framerate = 30; + videoEditedInfo1.isSticker = true; + videoEditedInfo1.estimatedSize = 256 * 1024 * 8; + } + if (photoEntry.thumbPath != null) { + try { + new File(photoEntry.thumbPath).delete(); + } catch (Exception e) { + FileLog.e(e); + } + photoEntry.thumbPath = null; + } + if (photoEntry.fullPaintPath != null) { + try { + Bitmap paintBitmap2 = BitmapFactory.decodeFile(photoEntry.fullPaintPath); + canvas.drawBitmap(paintBitmap2, matrix, new Paint(Paint.FILTER_BITMAP_FLAG)); + paintBitmap2.recycle(); + } catch (Exception e) { + FileLog.e(e); + } + } + size = ImageLoader.scaleAndSaveImage(canvasBitmap, getCompressFormat(), thumbSize, thumbSize, 83, false, 101, 101); + + photoEntry.thumbPath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); + VideoEditedInfo finalVideoEditedInfo = videoEditedInfo1; + + doneButtonPressed = false; + ContentPreviewViewer.getInstance().showCustomStickerActions(fullStickerPath, videoEditedInfo1, stickerMakerView, new ContentPreviewViewer.ContentPreviewViewerDelegate() { + @Override + public void sendSticker() { + photoEntry.imagePath = fullStickerPath; + placeProvider.sendButtonPressed(currentIndex, finalVideoEditedInfo, notify, scheduleDate, forceDocument); + NotificationCenter.getInstance(UserConfig.selectedAccount).postNotificationNameOnUIThread(NotificationCenter.customStickerCreated, true); + } + + @Override + public void addToFavoriteSelected(String emoji) { + stickerMakerView.uploadStickerFile(fullStickerPath, finalVideoEditedInfo, emoji, null, true, null, null); + } + + @Override + public void stickerSetSelected(TLRPC.StickerSet stickerSet, String emoji) { + stickerMakerView.uploadStickerFile(fullStickerPath, finalVideoEditedInfo, emoji, null, false, stickerSet, replacedSticker); + } + + @Override + public void newStickerPackSelected(CharSequence name, String emoji) { + stickerMakerView.uploadStickerFile(fullStickerPath, finalVideoEditedInfo, emoji, name, false, null, null); + } + + @Override + public boolean isReplacedSticker() { + return replacedSticker != null; + } + + @Override + public long getDialogId() { + return currentDialogId; + } + + @Override + public boolean isStickerEditor() { + return true; + } + }); + return; + } + } placeProvider.sendButtonPressed(currentIndex, videoEditedInfo, notify, scheduleDate, forceDocument); } else { placeProvider.replaceButtonPressed(currentIndex, videoEditedInfo); @@ -6858,6 +7170,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } + private String getTempFileAbsolutePath() { + File file = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), SharedConfig.getLastLocalId() + "_temp.jpg"); + return file.getAbsolutePath(); + } + + private Bitmap.CompressFormat getCompressFormat() { + return sendPhotoType == SELECT_TYPE_STICKER ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG; + } + private boolean isCaptionOpen() { return ( captionEdit != null && @@ -7503,6 +7824,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat return cropRotate(diff, false, null); } + private float scale1() { + if (sendPhotoType == SELECT_TYPE_STICKER) { + int width = getContainerViewWidth(); + if (width == 0) width = AndroidUtilities.displaySize.x; + return (width - dp(20) + 1) / (float) width; + } + return 1f; + } + private boolean cropRotate(final float diff, boolean restoreMirror, Runnable onEnd) { if (imageMoveAnimation != null) { return false; @@ -7520,7 +7850,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat animationStartTime = System.currentTimeMillis(); imageMoveAnimation = new AnimatorSet(); if (sendPhotoType == SELECT_TYPE_AVATAR) { - animateToScale = 1; + scale = animateToScale = 1f; } else if (centerImage != null) { int bitmapWidth = centerImage.getBitmapWidth(), bitmapHeight = centerImage.getBitmapHeight(); if (Math.abs((int) photoCropView.cropView.getStateOrientation() / 90 % 2) == 1) { @@ -7539,6 +7869,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } animateToScale = newScale / oldScale; } + if (sendPhotoType == SELECT_TYPE_STICKER) { + scale *= scale1(); + animateToScale *= scale1(); + } ValueAnimator areaRotateAnimator = ValueAnimator.ofFloat(0, 1f); final float wasRotation = photoCropView.wheelView.getRotation(); areaRotateAnimator.addUpdateListener(a -> { @@ -7557,9 +7891,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat imageMoveAnimation = null; rotate = animateToRotate = 0; mirror = animateToMirror = 0; - scale = animateToScale = 1; + scale = animateToScale = scale1(); containerView.invalidate(); - photoCropView.cropView.areaView.setRotationScaleTranslation(0, 1, 0, 0); + photoCropView.cropView.areaView.setRotationScaleTranslation(0, scale1(), 0, 0); photoCropView.wheelView.setRotated(false); if (Math.abs(diff) > 0) { if (photoCropView.rotate(diff)) { @@ -7940,7 +8274,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private VideoEditedInfo getCurrentVideoEditedInfo() { if (!isCurrentVideo && hasAnimatedMediaEntities() && centerImage.getBitmapWidth() > 0) { - float maxSize = sendPhotoType == SELECT_TYPE_AVATAR ? 800 : 854; + float maxSize = 854; + if (sendPhotoType == SELECT_TYPE_AVATAR) { + maxSize = 800; + } else if (sendPhotoType == SELECT_TYPE_STICKER) { + maxSize = 500; + } VideoEditedInfo videoEditedInfo = new VideoEditedInfo(); videoEditedInfo.start = videoEditedInfo.startTime = 0; videoEditedInfo.endTime = Math.min(3000, editState.averageDuration); @@ -7975,7 +8314,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat width *= editState.cropState.cropPw; height *= editState.cropState.cropPh; } - if (sendPhotoType == SELECT_TYPE_AVATAR) { + if (sendPhotoType == SELECT_TYPE_AVATAR || sendPhotoType == SELECT_TYPE_STICKER) { width = height; } float scale = Math.max(width / maxSize, height / maxSize); @@ -8105,23 +8444,23 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat Object object = imagesArrLocals.get(currentIndex); CharSequence caption = captionEdit.getText(); -// CharSequence[] result = new CharSequence[] { caption }; + CharSequence[] result = new CharSequence[] { caption }; if (hasCaptionForAllMedia && !TextUtils.equals(captionForAllMedia, caption) && placeProvider.getPhotoIndex(currentIndex) != 0 && placeProvider.getSelectedCount() > 0) { hasCaptionForAllMedia = false; } -// ArrayList entities = MediaDataController.getInstance(currentAccount).getEntities(result, supportsSendingNewEntities()); - captionForAllMedia = caption; + ArrayList entities = MediaDataController.getInstance(currentAccount).getEntities(result, supportsSendingNewEntities()); + captionForAllMedia = result[0]; if (object instanceof MediaController.PhotoEntry) { MediaController.PhotoEntry photoEntry = (MediaController.PhotoEntry) object; - photoEntry.caption = caption; -// photoEntry.entities = entities; + photoEntry.caption = result[0]; + photoEntry.entities = entities; } else if (object instanceof MediaController.SearchImage) { MediaController.SearchImage photoEntry = (MediaController.SearchImage) object; - photoEntry.caption = caption; -// photoEntry.entities = entities; + photoEntry.caption = result[0]; + photoEntry.entities = entities; } if (caption.length() != 0 && !placeProvider.isPhotoChecked(currentIndex)) { @@ -8722,6 +9061,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat aspectRatioFrameLayout.setAspectRatio(height == 0 ? 1 : (width * pixelWidthHeightRatio) / height, unappliedRotationDegrees); if (videoTextureView instanceof VideoEditTextureView) { + StoryEntry.HDRInfo hdrInfo = videoPlayer.getHDRStaticInfo(null); + ((VideoEditTextureView) videoTextureView).setHDRInfo(hdrInfo); ((VideoEditTextureView) videoTextureView).setVideoSize((int) (width * pixelWidthHeightRatio), height); if (sendPhotoType == SELECT_TYPE_AVATAR) { setCropBitmap(); @@ -9227,7 +9568,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat canvas.drawBitmap(bitmap, null, dstRect, bitmapPaint); } FileOutputStream stream = new FileOutputStream(new File(finalPath)); - dst.compress(Bitmap.CompressFormat.JPEG, size == thumbSize ? 83 : 87, stream); + dst.compress(getCompressFormat(), size == thumbSize ? 83 : 87, stream); try { stream.close(); } catch (Exception e) { @@ -9357,7 +9698,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat int[] orientation = null; boolean hasChanged = false; MediaController.MediaEditState entry = (MediaController.MediaEditState) imagesArrLocals.get(currentIndex); - if (currentEditMode == EDIT_MODE_CROP || currentEditMode == EDIT_MODE_NONE && sendPhotoType == SELECT_TYPE_AVATAR) { + if (currentEditMode == EDIT_MODE_NONE && sendPhotoType == SELECT_TYPE_STICKER) { + bitmap = centerImage.getBitmap(); + orientation = new int[]{centerImage.getOrientation(), centerImage.getInvert()}; + } else if (currentEditMode == EDIT_MODE_CROP || currentEditMode == EDIT_MODE_NONE && sendPhotoType == SELECT_TYPE_AVATAR) { photoCropView.makeCrop(entry); if (entry.cropState == null && currentEditMode != EDIT_MODE_CROP) { return; @@ -9379,9 +9723,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } else if (currentEditMode == EDIT_MODE_FILTER) { bitmap = photoFilterView.getBitmap(); + bitmap = stickerMakerView.cutSegmentInFilteredBitmap(bitmap, centerImage.getOrientation()); savedFilterState = photoFilterView.getSavedFilterState(); } else if (currentEditMode == EDIT_MODE_PAINT) { - if (Build.VERSION.SDK_INT >= 18 && (sendPhotoType == 0 || sendPhotoType == SELECT_TYPE_AVATAR || sendPhotoType == 2)) { + if (sendPhotoType == 0 || sendPhotoType == SELECT_TYPE_AVATAR || sendPhotoType == SELECT_TYPE_STICKER || sendPhotoType == 2) { entities = new ArrayList<>(); } hasChanged = photoPaintView.hasChanges(); @@ -9403,7 +9748,49 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat entry.imagePath = null; } - if (currentEditMode == EDIT_MODE_CROP || currentEditMode == EDIT_MODE_NONE && sendPhotoType == SELECT_TYPE_AVATAR) { + if (currentEditMode == EDIT_MODE_NONE && sendPhotoType == SELECT_TYPE_STICKER) { + if (entry.cropState != null) { + Bitmap croppedBitmap = createCroppedBitmap(bitmap, entry.cropState, orientation, true); + if (entry.paintPath != null) { + Bitmap paintBitmap = BitmapFactory.decodeFile(entry.fullPaintPath); + Bitmap croppedPaintBitmap = createCroppedBitmap(paintBitmap, entry.cropState, null, false); + if (!isCurrentVideo) { + if (hasAnimatedMediaEntities()) { + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(croppedBitmap, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + entry.imagePath = currentImagePath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); + } else { + mergeImages(entry.imagePath = getTempFileAbsolutePath(), null, croppedPaintBitmap, croppedBitmap, AndroidUtilities.getPhotoSize(), true); + } + } + mergeImages(entry.thumbPath = getTempFileAbsolutePath(), null, croppedPaintBitmap, croppedBitmap, thumbSize, true); + } else { + if (!isCurrentVideo) { + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(croppedBitmap, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + entry.imagePath = currentImagePath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); + } + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(croppedBitmap, thumbSize, thumbSize, 70, false, 101, 101); + entry.thumbPath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); + } + } else if (entry.paintPath != null) { + Bitmap paintBitmap = BitmapFactory.decodeFile(entry.fullPaintPath); + if (!isCurrentVideo) { + if (hasAnimatedMediaEntities()) { + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + entry.imagePath = currentImagePath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); + } else { + mergeImages(entry.imagePath = getTempFileAbsolutePath(), null, paintBitmap, bitmap, AndroidUtilities.getPhotoSize(), true); + } + } + mergeImages(entry.thumbPath = getTempFileAbsolutePath(), null, paintBitmap, bitmap, thumbSize, true); + } else { + if (!isCurrentVideo) { + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + entry.imagePath = currentImagePath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); + } + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, thumbSize, thumbSize, 70, false, 101, 101); + entry.thumbPath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); + } + } else if (currentEditMode == EDIT_MODE_CROP || currentEditMode == EDIT_MODE_NONE && sendPhotoType == SELECT_TYPE_AVATAR) { editState.cropState = entry.cropState; editState.croppedPaintPath = entry.croppedPaintPath; editState.croppedMediaEntities = entry.croppedMediaEntities; @@ -9416,15 +9803,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (!isCurrentVideo) { if (hasAnimatedMediaEntities()) { - TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(croppedBitmap, Bitmap.CompressFormat.JPEG, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(croppedBitmap, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); entry.imagePath = currentImagePath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); } else { - File f = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), SharedConfig.getLastLocalId() + "_temp.jpg"); - mergeImages(entry.imagePath = f.getAbsolutePath(), null, croppedPaintBitmap, croppedBitmap, AndroidUtilities.getPhotoSize(), true); + mergeImages(entry.imagePath = getTempFileAbsolutePath(), null, croppedPaintBitmap, croppedBitmap, AndroidUtilities.getPhotoSize(), true); } } - File f = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), SharedConfig.getLastLocalId() + "_temp.jpg"); - mergeImages(entry.thumbPath = f.getAbsolutePath(), null, croppedPaintBitmap, croppedBitmap, thumbSize, true); + mergeImages(entry.thumbPath = getTempFileAbsolutePath(), null, croppedPaintBitmap, croppedBitmap, thumbSize, true); if (croppedPaintBitmap != null) { croppedPaintBitmap.recycle(); } @@ -9433,7 +9818,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } else { if (!isCurrentVideo) { - TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(croppedBitmap, Bitmap.CompressFormat.JPEG, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(croppedBitmap, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); entry.imagePath = currentImagePath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); } TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(croppedBitmap, thumbSize, thumbSize, 70, false, 101, 101); @@ -9448,15 +9833,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (entry.filterPath != null) { new File(entry.filterPath).delete(); } - TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, Bitmap.CompressFormat.JPEG, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); entry.filterPath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); Bitmap b = entry.cropState != null ? createCroppedBitmap(bitmap, entry.cropState, null, true) : bitmap; if (entry.paintPath == null) { if (!isCurrentVideo) { - size = ImageLoader.scaleAndSaveImage(b, Bitmap.CompressFormat.JPEG, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + size = ImageLoader.scaleAndSaveImage(b, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); entry.imagePath = currentImagePath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); } - size = ImageLoader.scaleAndSaveImage(b, Bitmap.CompressFormat.JPEG, thumbSize, thumbSize, 83, false, 101, 101); + size = ImageLoader.scaleAndSaveImage(b, getCompressFormat(), thumbSize, thumbSize, 83, false, 101, 101); entry.thumbPath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); } else { String path = entry.fullPaintPath; @@ -9478,15 +9863,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } if (!isCurrentVideo) { if (hasAnimatedMediaEntities()) { - size = ImageLoader.scaleAndSaveImage(b, Bitmap.CompressFormat.JPEG, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + size = ImageLoader.scaleAndSaveImage(b, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); entry.imagePath = currentImagePath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); } else { - File f = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), SharedConfig.getLastLocalId() + "_temp.jpg"); - mergeImages(entry.imagePath = f.getAbsolutePath(), path, paintBitmap, b, AndroidUtilities.getPhotoSize(), true); + mergeImages(entry.imagePath = getTempFileAbsolutePath(), path, paintBitmap, b, AndroidUtilities.getPhotoSize(), true); } } - File f = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), SharedConfig.getLastLocalId() + "_temp.jpg"); - mergeImages(entry.thumbPath = f.getAbsolutePath(), path, paintBitmap, b, thumbSize, true); + mergeImages(entry.thumbPath = getTempFileAbsolutePath(), path, paintBitmap, b, thumbSize, true); if (recyclePaint) { paintBitmap.recycle(); } @@ -9505,7 +9888,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat entry.stickers = stickers != null ? new ArrayList<>(stickers) : null; entry.paintPath = editState.paintPath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); - paintingOverlay.setEntities(entry.mediaEntities = editState.mediaEntities = entities == null || entities.isEmpty() ? null : entities, isCurrentVideo, true); + paintingOverlay.setEntities(entry.mediaEntities = editState.mediaEntities = entities == null || entities.isEmpty() ? null : entities, isCurrentVideo, true, sendPhotoType != SELECT_TYPE_STICKER); entry.averageDuration = editState.averageDuration = photoPaintView.getLcm(); if (entry.mediaEntities != null && paintThumbBitmap[0] != null) { size = ImageLoader.scaleAndSaveImage(paintThumbBitmap[0], Bitmap.CompressFormat.PNG, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); @@ -9594,15 +9977,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } if (!isCurrentVideo) { if (hasAnimatedMediaEntities()) { - size = ImageLoader.scaleAndSaveImage(croppedBitmap, Bitmap.CompressFormat.JPEG, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); + size = ImageLoader.scaleAndSaveImage(croppedBitmap, getCompressFormat(), AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 87, false, 101, 101); entry.imagePath = currentImagePath = FileLoader.getInstance(currentAccount).getPathToAttach(size, true).toString(); } else { - File f = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), SharedConfig.getLastLocalId() + "_temp.jpg"); - mergeImages(entry.imagePath = f.getAbsolutePath(), null, croppedBitmap, paintBitmap, AndroidUtilities.getPhotoSize(), false); + mergeImages(entry.imagePath = getTempFileAbsolutePath(), null, croppedBitmap, paintBitmap, AndroidUtilities.getPhotoSize(), false); } } - File f = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_CACHE), SharedConfig.getLastLocalId() + "_temp.jpg"); - mergeImages(entry.thumbPath = f.getAbsolutePath(), null, croppedBitmap, paintBitmap, thumbSize, false); + mergeImages(entry.thumbPath = getTempFileAbsolutePath(), null, croppedBitmap, paintBitmap, thumbSize, false); if (recycle && paintBitmap != null) { paintBitmap.recycle(); @@ -9880,6 +10261,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat navigationBarColorTo = 0x7f000000; } showEditCaption(editing && savedState == null && mode == EDIT_MODE_NONE, true); + showStickerMode(mode == EDIT_MODE_NONE && sendPhotoType == SELECT_TYPE_STICKER, true); navigationBar.setVisibility(mode != EDIT_MODE_FILTER ? View.VISIBLE : View.INVISIBLE); switchingToMode = mode; if (currentEditMode == EDIT_MODE_NONE) { @@ -9954,7 +10336,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat newScale = Math.min(getContainerViewWidth(0) / (float) bitmapWidth, getContainerViewHeight(0) / (float) bitmapHeight); } } - animateToScale = newScale / oldScale; + animateToScale = newScale / oldScale * scale1(); animateToX = 0; translationX = getLeftInset() / 2 - getRightInset() / 2; if (sendPhotoType == SELECT_TYPE_AVATAR) { @@ -10065,10 +10447,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (sendPhotoType == SELECT_TYPE_AVATAR) { photoCropView.setVisibility(View.VISIBLE); } - animateToScale = 1; + scale = animateToScale = scale1(); animateToX = 0; animateToY = 0; - scale = 1; updateMinMax(scale); containerView.invalidate(); @@ -10267,10 +10648,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat translateY = 0; } switchingToMode = -1; - animateToScale = 1; + scale = animateToScale = 1f; animateToX = 0; animateToY = 0; - scale = 1; updateMinMax(scale); padImageForHorizontalInsets = true; containerView.invalidate(); @@ -10301,7 +10681,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat bitmap = null; } else { if (state == null) { - bitmap = centerImage.getBitmap(); + bitmap = stickerMakerView.isSegmentedState() ? stickerMakerView.getSourceBitmap() : centerImage.getBitmap(); orientation = centerImage.getOrientation(); } else { bitmap = BitmapFactory.decodeFile(originalPath); @@ -10316,7 +10696,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } else { hasFaces = currentImageHasFace == 1 ? 1 : 0; } - photoFilterView = new PhotoFilterView(parentActivity, videoTextureView != null ? (VideoEditTextureView) videoTextureView : null, bitmap, orientation, state, isCurrentVideo ? null : paintingOverlay, hasFaces, videoTextureView == null && (editState.cropState != null && editState.cropState.mirrored || cropTransform.isMirrored()), true, null, resourcesProvider); + Bitmap bitmapMask = stickerMakerView.getSegmentedDarkMaskImage(); + photoFilterView = new PhotoFilterView(parentActivity, videoTextureView != null ? (VideoEditTextureView) videoTextureView : null, bitmap, bitmapMask, orientation, state, isCurrentVideo ? null : paintingOverlay, hasFaces, videoTextureView == null && (editState.cropState != null && editState.cropState.mirrored || cropTransform.isMirrored()), true, null, resourcesProvider); containerView.addView(photoFilterView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); photoFilterView.getDoneTextView().setOnClickListener(v -> { applyCurrentEditMode(); @@ -10438,10 +10819,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat translateY = 0; } switchingToMode = -1; - animateToScale = 1; + scale = animateToScale = 1f; animateToX = 0; animateToY = 0; - scale = 1; updateMinMax(scale); padImageForHorizontalInsets = true; containerView.invalidate(); @@ -10612,6 +10992,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat photoPaintView.setOffsetTranslationY(dp(126), 0, 0, false); photoPaintView.setOffsetTranslationX(-dp(12)); } + if (photoPaintView != null) { + photoPaintView.entitiesView.setClipChildren(sendPhotoType != SELECT_TYPE_STICKER); + photoPaintView.setClipChildren(sendPhotoType != SELECT_TYPE_STICKER); + } } private ValueAnimator translateYAnimator; @@ -10664,6 +11048,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat updateActionBarTitlePadding(); } showEditCaption(false, true); + showStickerMode(false, true); Bitmap bitmap = centerImage.getBitmap(); final float finalScale = scale; @@ -10701,7 +11086,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } oldScale = Math.min(getContainerViewWidth() / (float) bitmapWidth, getContainerViewHeight() / (float) bitmapHeight); newScale = Math.min(getContainerViewWidth(3) / (float) bitmapWidth, getContainerViewHeight(3) / (float) bitmapHeight); - animateToScale = newScale / oldScale; // * finalScale; + animateToScale = newScale / oldScale * scale1(); // * finalScale; animateToX = getLeftInset() / 2 - getRightInset() / 2; animationStartTime = System.currentTimeMillis(); zoomAnimation = true; @@ -10736,7 +11121,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } translateY = 0; switchingToMode = -1; - animateToScale = scale = 1; + animateToScale = scale = scale1(); animateToX = 0; animateToY = 0; updateMinMax(scale); @@ -11536,6 +11921,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat docNameTextView.setVisibility(View.GONE); showVideoTimeline(false, false); showEditCaption(false, false); + showStickerMode(false, false); videoAvatarTooltip.setVisibility(View.GONE); compressItem.setVisibility(View.GONE); // captionEditText.setVisibility(View.GONE); @@ -12566,7 +12952,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat actionBarContainer.setTextShadows(fancyShadows); navigationBar.setVisibility(fancyShadows ? View.GONE : View.VISIBLE); if (currentEditMode == EDIT_MODE_NONE) { - navigationBar.setBackgroundColor(fancyShadows ? 0 : 0x7f000000); + navigationBar.setBackgroundColor(fancyShadows ? 0 : (sendPhotoType == SELECT_TYPE_STICKER ? 0xFF000000 : 0x7f000000)); } if (title != null) { if (animated) { @@ -12623,6 +13009,61 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat return message; } + public TLRPC.Document replacedSticker; + + public void enableStickerMode(TLRPC.Document document) { + replacedSticker = document; + if (stickerMakerView != null) { + stickerMakerView.clean(); + } + if (cutOutBtn != null) { + cutOutBtn.clean(); + } + showStickerMode(true, false); + } + + public void prepareSegmentImage() { + if (stickerMakerView != null && sendPhotoType == SELECT_TYPE_STICKER) { + stickerMakerView.segmentImage(centerImage.getBitmap(), centerImage.getOrientation(), getContainerViewWidth(), getContainerViewHeight()); + } + } + + private void showStickerMode(boolean show, boolean animated) { + if (!animated) { + stickerMakerView.animate().setListener(null).cancel(); + stickerMakerView.setVisibility(show ? View.VISIBLE : View.GONE); + stickerMakerView.setAlpha(pickerView.getAlpha()); + stickerMakerBackgroundView.animate().setListener(null).cancel(); + stickerMakerBackgroundView.setVisibility(show ? View.VISIBLE : View.GONE); + stickerMakerBackgroundView.setAlpha(show ? pickerView.getAlpha() : 0f); + cutOutBtn.animate().setListener(null).cancel(); + cutOutBtn.setVisibility(show ? View.VISIBLE : View.GONE); + cutOutBtn.setAlpha(pickerView.getAlpha()); + } else { + if (show && cutOutBtn.getTag() == null) { + stickerMakerView.animate().setListener(null).cancel(); + cutOutBtn.animate().setListener(null).cancel(); + stickerMakerBackgroundView.animate().setListener(null).cancel(); + if (cutOutBtn.getVisibility() != View.VISIBLE) { + cutOutBtn.setVisibility(View.VISIBLE); + cutOutBtn.animate().alpha(pickerView.getAlpha()).start(); + stickerMakerView.setVisibility(View.VISIBLE); + stickerMakerView.animate().alpha(pickerView.getAlpha()).start(); + stickerMakerBackgroundView.setVisibility(View.VISIBLE); + stickerMakerBackgroundView.animate().alpha(pickerView.getAlpha()).start(); + } + } else if (!show && cutOutBtn.getTag() != null) { + stickerMakerView.animate().setListener(null).cancel(); + cutOutBtn.animate().setListener(null).cancel(); + stickerMakerBackgroundView.animate().setListener(null).cancel(); + cutOutBtn.animate().alpha(0f).setListener(new HideViewAfterAnimation(cutOutBtn)).start(); + stickerMakerView.animate().alpha(0f).setListener(new HideViewAfterAnimation(stickerMakerView)).start(); + stickerMakerBackgroundView.animate().alpha(0f).setListener(new HideViewAfterAnimation(stickerMakerBackgroundView)).start(); + } + } + cutOutBtn.setTag(show ? 1 : null); + } + private ObjectAnimator captionAnimator; private void showEditCaption(boolean show, boolean animated) { if (!animated) { @@ -12931,10 +13372,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat draggingDown = false; translationX = 0; translationY = 0; - scale = 1; animateToX = 0; animateToY = 0; - animateToScale = 1; + scale = animateToScale = scale1(); animateToRotate = 0; animationStartTime = 0; zoomAnimation = false; @@ -13605,7 +14045,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat mediaEntities = photoEntry.mediaEntities; } paintingOverlay.setVisibility(View.VISIBLE); - paintingOverlay.setData(paintPath, mediaEntities, isVideo, false); + paintingOverlay.setData(paintPath, mediaEntities, isVideo, false, sendPhotoType != SELECT_TYPE_STICKER); } } @@ -14075,7 +14515,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (type == 4 || type == 5) { pickerViewSendButton.setImageResource(R.drawable.msg_input_send_mini); layoutParams2.bottomMargin = dp(7.33f); - } else if (type == SELECT_TYPE_AVATAR || type == SELECT_TYPE_WALLPAPER || type == SELECT_TYPE_QR) { + } else if (type == SELECT_TYPE_AVATAR || type == SELECT_TYPE_WALLPAPER || type == SELECT_TYPE_QR || type == SELECT_TYPE_STICKER) { pickerViewSendButton.setImageResource(R.drawable.floating_check); pickerViewSendButton.setPadding(0, dp(1), 0, 0); layoutParams2.bottomMargin = dp(7.33f); @@ -14085,6 +14525,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } pickerViewSendButton.setLayoutParams(layoutParams2); } + if (type != SELECT_TYPE_STICKER && stickerMakerView != null) { + stickerMakerView.clean(); + } if (sendPhotoType != SELECT_TYPE_AVATAR && type == SELECT_TYPE_AVATAR && isVisible) { sendPhotoType = type; doneButtonPressed = false; @@ -14391,6 +14834,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileLoadFailed); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileLoaded); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.customStickerCreated); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileLoadProgressChanged); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.mediaCountDidLoad); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.mediaDidLoad); @@ -14549,9 +14993,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat yPos = top + (bottom - top - layoutParams.height * scale) / 2; xPos = (windowView.getMeasuredWidth() - getLeftInset() - getRightInset() - layoutParams.width * scale) / 2.0f + getLeftInset(); } else { - scaleX = (float) windowView.getMeasuredWidth() / layoutParams.width; + scaleX = (float) (windowView.getMeasuredWidth()) / layoutParams.width; scaleY = (float) (AndroidUtilities.displaySize.y + (isStatusBarVisible() ? AndroidUtilities.statusBarHeight : 0)) / layoutParams.height; scale = Math.min(scaleX, scaleY); + if (sendPhotoType == SELECT_TYPE_STICKER) { + scale *= scale1(); + } yPos = ((AndroidUtilities.displaySize.y + (isStatusBarVisible() ? AndroidUtilities.statusBarHeight : 0)) - (layoutParams.height * scale)) / 2.0f; xPos = (windowView.getMeasuredWidth() - layoutParams.width * scale) / 2.0f; } @@ -14618,9 +15065,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (containerView == null || windowView == null) { return; } - if (Build.VERSION.SDK_INT >= 18) { - containerView.setLayerType(View.LAYER_TYPE_NONE, null); - } + containerView.setLayerType(View.LAYER_TYPE_NONE, null); animationInProgress = 0; invalidateBlur(); transitionAnimationStartTime = 0; @@ -15000,6 +15445,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat Object entry = imagesArrLocals.get(currentIndex); if (entry instanceof MediaController.MediaEditState) { ((MediaController.MediaEditState) entry).editedInfo = getCurrentVideoEditedInfo(); + if (sendPhotoType == SELECT_TYPE_STICKER) { + ((MediaController.MediaEditState) entry).reset(); + } } } float wasScaleX = 1f, wasScaleY = 1f, wasScaleAlertX = 1f, wasScaleAlertY = 1f; @@ -15364,6 +15812,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private void removeObservers() { NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileLoadFailed); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileLoaded); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.customStickerCreated); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileLoadProgressChanged); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.mediaCountDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.mediaDidLoad); @@ -15555,9 +16004,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat w *= editState.cropState.cropPw; h *= editState.cropState.cropPh; } - int maxW = (int) (w * scale - getContainerViewWidth()) / 2; - int maxH = (int) (h * scale - getContainerViewHeight()) / 2; - + int maxW = sendPhotoType == SELECT_TYPE_STICKER ? (int) (scale * w) : (int) (w * scale - getContainerViewWidth()) / 2; + int maxH = sendPhotoType == SELECT_TYPE_STICKER ? (int) (scale * h) : (int) (h * scale - getContainerViewHeight()) / 2; if (maxW > 0) { minX = -maxW; maxX = maxW; @@ -15663,7 +16111,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (currentEditMode == EDIT_MODE_FILTER) { photoFilterView.onTouch(ev); return true; - } else if (currentEditMode == EDIT_MODE_CROP || currentEditMode != EDIT_MODE_PAINT && sendPhotoType == SELECT_TYPE_AVATAR) { + } else if (currentEditMode == EDIT_MODE_CROP || currentEditMode != EDIT_MODE_PAINT && (sendPhotoType == SELECT_TYPE_AVATAR)) { return true; } @@ -15709,7 +16157,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat pinchStartY = translationY; zooming = true; moving = false; - if (currentEditMode == EDIT_MODE_PAINT) { + if (currentEditMode == EDIT_MODE_PAINT || sendPhotoType == SELECT_TYPE_STICKER) { moveStartX = pinchCenterX; moveStartY = pinchCenterY; draggingDown = false; @@ -15753,7 +16201,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (canZoom && ev.getPointerCount() == 2 && !draggingDown && zooming && !changingPage) { discardTap = true; - if (currentEditMode == EDIT_MODE_PAINT) { + if (currentEditMode == EDIT_MODE_PAINT || sendPhotoType == SELECT_TYPE_STICKER) { float newPinchCenterX = (ev.getX(0) + ev.getX(1)) / 2.0f; float newPinchCenterY = (ev.getY(0) + ev.getY(1)) / 2.0f; float moveDx = moveStartX - newPinchCenterX; @@ -15799,7 +16247,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat return true; } } - if (placeProvider.canScrollAway() && currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR && canDragDown && !draggingDown && scale == 1 && dy >= dp(30) && dy / 2 > dx) { + if (placeProvider.canScrollAway() && currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR && sendPhotoType != SELECT_TYPE_STICKER && canDragDown && !draggingDown && scale == 1 && dy >= dp(30) && dy / 2 > dx) { draggingDown = true; hidePressedDrawables(); moving = false; @@ -15818,7 +16266,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } else if (!invalidCoords && animationStartTime == 0) { float moveDx = moveStartX - ev.getX(); float moveDy = moveStartY - ev.getY(); - if (moving || currentEditMode != EDIT_MODE_NONE || scale == 1 && Math.abs(moveDy) + dp(12) < Math.abs(moveDx) || scale != 1) { + if (moving || currentEditMode != EDIT_MODE_NONE || sendPhotoType == SELECT_TYPE_STICKER || scale == 1 && Math.abs(moveDy) + dp(12) < Math.abs(moveDx) || scale != 1) { if (!moving) { moveDx = 0; moveDy = 0; @@ -15833,7 +16281,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (translationX < minX && (currentEditMode != EDIT_MODE_NONE || !rightImage.hasImageSet()) || translationX > maxX && (currentEditMode != EDIT_MODE_NONE || !leftImage.hasImageSet())) { moveDx /= 3.0f; } - if (maxY == 0 && minY == 0 && currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR) { + if (maxY == 0 && minY == 0 && currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR && sendPhotoType != SELECT_TYPE_STICKER) { if (translationY - moveDy < minY) { translationY = minY; moveDy = 0; @@ -15848,7 +16296,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } translationX -= moveDx; - if (scale != 1 || currentEditMode != EDIT_MODE_NONE) { + if (scale != 1 || currentEditMode != EDIT_MODE_NONE || sendPhotoType == SELECT_TYPE_STICKER) { translationY -= moveDy; } invalidateBlur(); @@ -15877,9 +16325,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat paintViewTouched = 0; if (zooming) { invalidCoords = true; - if (scale < 1.0f) { - updateMinMax(1.0f); - animateTo(1.0f, 0, 0, true); + float maxScale = sendPhotoType == SELECT_TYPE_STICKER ? 0.33f : 1f; + if (scale < maxScale) { + updateMinMax(maxScale); + animateTo(maxScale, 0, 0, true); } else if (scale > 3.0f) { float atx = (pinchCenterX - getContainerViewWidth() / 2) - ((pinchCenterX - getContainerViewWidth() / 2) - pinchStartX) * (3.0f / pinchStartScale); float aty = (pinchCenterY - getContainerViewHeight() / 2) - ((pinchCenterY - getContainerViewHeight() / 2) - pinchStartY) * (3.0f / pinchStartScale); @@ -15943,7 +16392,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat velocity = velocityTracker.getXVelocity(); } - if (currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR) { + if (currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR && sendPhotoType != SELECT_TYPE_STICKER) { if ((translationX < minX - getContainerViewWidth() / 3 || velocity < -dp(650)) && rightImage.hasImageSet()) { goToNext(); return true; @@ -16329,7 +16778,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat int containerWidth = getContainerViewWidth(); int containerHeight = getContainerViewHeight(); if (animationInProgress != 2 && animationInProgress != 4 && !pipAnimationInProgress && !isInline) { - if (currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR && scale == 1 && aty != -1 && !zoomAnimation) { + if (currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR && sendPhotoType != SELECT_TYPE_STICKER && scale == 1 && aty != -1 && !zoomAnimation) { float maxValue = containerWidth / 4.0f; backgroundDrawable.setAlpha((int) Math.max(127, 255 * (1.0f - (Math.min(Math.abs(aty), maxValue) / maxValue)))); } else { @@ -16340,7 +16789,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } sideImage = null; - if (currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR) { + if (currentEditMode == EDIT_MODE_NONE && sendPhotoType != SELECT_TYPE_AVATAR && sendPhotoType != SELECT_TYPE_STICKER) { if (scale >= 1.0f && !zoomAnimation && !zooming) { if (currentTranslationX > maxX + dp(5)) { sideImage = leftImage; @@ -16452,17 +16901,24 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat translateX = maxX; } boolean drawTextureView = videoSizeSet && aspectRatioFrameLayout != null && aspectRatioFrameLayout.getVisibility() == View.VISIBLE; + centerImageTransformLocked = false; + centerImageTransform.reset(); if (centerImage.hasBitmapImage() || drawTextureView && textureUploaded) { canvas.save(); canvas.translate(containerWidth / 2 + getAdditionX(), containerHeight / 2 + getAdditionY()); + centerImageTransform.postTranslate(containerWidth / 2 + getAdditionX(), containerHeight / 2 + getAdditionY()); canvas.translate(translateX, currentTranslationY + (currentEditMode != EDIT_MODE_PAINT ? currentPanTranslationY : 0)); + centerImageTransform.preTranslate(translateX, currentTranslationY + (currentEditMode != EDIT_MODE_PAINT ? currentPanTranslationY : 0)); canvas.scale(currentScale - scaleDiff, currentScale - scaleDiff); + centerImageTransform.preScale(currentScale - scaleDiff, currentScale - scaleDiff); canvas.rotate(currentRotation); + centerImageTransform.postRotate(currentRotation); if (currentEditMode == EDIT_MODE_PAINT && photoPaintView != null) { int trueH = getContainerViewHeight(true, 0); trueH -= photoPaintView.getEmojiPadding(Math.abs(AndroidUtilities.displaySize.y + AndroidUtilities.statusBarHeight - trueH) < dp(20)); int h = getContainerViewHeight(false, 0); canvas.translate(0, (trueH - h) / 2f * (1f - photoPaintView.adjustPanLayoutHelperProgress())); + centerImageTransform.postTranslate(0, (trueH - h) / 2f * (1f - photoPaintView.adjustPanLayoutHelperProgress())); } boolean drawCenterImage = false; @@ -16488,6 +16944,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } width *= scale; height *= scale; +// centerImageTransform.postScale(scale, scale); centerImage.setImageCoords(-width / 2, -height / 2, width, height); if (isCurrentVideo) { centerImage.draw(canvas); @@ -16495,6 +16952,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat drawCenterImage = true; } } + centerImageTransformLocked = true; } int bitmapWidth, originalWidth; @@ -16611,16 +17069,21 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } canvas.translate(cropTransform.getCropAreaX() * cropAnimationValue, cropTransform.getCropAreaY() * cropAnimationValue); + if (!centerImageTransformLocked) centerImageTransform.postTranslate(cropTransform.getCropAreaX() * cropAnimationValue, cropTransform.getCropAreaY() * cropAnimationValue); canvas.scale(cropScale, cropScale); + if (!centerImageTransformLocked) centerImageTransform.postScale(cropScale, cropScale); canvas.translate(cropTransform.getCropPx() * rotatedWidth * scale * cropAnimationValue, cropTransform.getCropPy() * rotatedHeight * scale * cropAnimationValue); + if (!centerImageTransformLocked) centerImageTransform.postTranslate(cropTransform.getCropPx() * rotatedWidth * scale * cropAnimationValue, cropTransform.getCropPy() * rotatedHeight * scale * cropAnimationValue); float rotation = (cropTransform.getRotation() + orientation); if (rotation > 180) { rotation -= 360; } if (sendPhotoType == SELECT_TYPE_AVATAR && (currentEditMode == EDIT_MODE_PAINT || switchingToMode == EDIT_MODE_PAINT)) { canvas.rotate(rotation); + if (!centerImageTransformLocked) centerImageTransform.postRotate(rotation); } else { canvas.rotate(rotation * cropAnimationValue); + if (!centerImageTransformLocked) centerImageTransform.postRotate(rotation * cropAnimationValue); } } else { if (videoTextureView != null) { @@ -16698,7 +17161,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } if (paintingOverlay.getVisibility() == View.VISIBLE && (isCurrentVideo || currentEditMode != EDIT_MODE_FILTER || switchingToMode != -1)) { - canvas.clipRect(0, 0, paintingOverlay.getMeasuredWidth(), paintingOverlay.getMeasuredHeight()); + if (sendPhotoType != SELECT_TYPE_STICKER) { + canvas.clipRect(0, 0, paintingOverlay.getMeasuredWidth(), paintingOverlay.getMeasuredHeight()); + } paintingOverlay.draw(canvas); } canvas.restore(); @@ -16933,6 +17398,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (photoViewerWebView == null || !photoViewerWebView.isLoaded()) { centerImage.setAlpha(alpha); centerImage.draw(canvas); + stickerMakerView.drawSegmentBorderPath(canvas, centerImage, centerImageTransform, containerView); + centerImageTransformLocked = true; } if (restore) { canvas.restore(); @@ -17298,7 +17765,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - if (scale != 1) { + if (scale != 1 && sendPhotoType != SELECT_TYPE_STICKER) { scroller.abortAnimation(); scroller.fling(Math.round(translationX), Math.round(translationY), Math.round(velocityX), Math.round(velocityY), (int) minX, (int) maxX, (int) minY, (int) maxY); containerView.postInvalidate(); @@ -17314,7 +17781,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat float x = e.getX(); float y = e.getY(); if (checkImageView.getVisibility() != View.VISIBLE) { - if (SharedConfig.nextMediaTap && y > ActionBar.getCurrentActionBarHeight() + AndroidUtilities.statusBarHeight + dp(40)) { + if (SharedConfig.nextMediaTap && sendPhotoType != SELECT_TYPE_STICKER && y > ActionBar.getCurrentActionBarHeight() + AndroidUtilities.statusBarHeight + dp(40)) { int side = Math.min(135, containerView.getMeasuredWidth() / 8); if (x < side) { if (leftImage.hasImageSet()) { @@ -17955,7 +18422,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (fancyShadows) { navigationBar.setVisibility(View.VISIBLE); navigationBar.setAlpha(0f); - navigationBar.setBackgroundColor(0x7f000000); + navigationBar.setBackgroundColor((sendPhotoType == SELECT_TYPE_STICKER ? 0xFF000000 : 0x7f000000)); } qualityChooseView.setTag(1); qualityChooseViewAnimation.playTogether( @@ -17990,7 +18457,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (fancyShadows) { navigationBar.setVisibility(View.GONE); navigationBar.setAlpha(0f); - navigationBar.setBackgroundColor(0x7f000000); + navigationBar.setBackgroundColor((sendPhotoType == SELECT_TYPE_STICKER ? 0xFF000000 : 0x7f000000)); } qualityChooseView.setVisibility(View.INVISIBLE); qualityPicker.setVisibility(View.INVISIBLE); @@ -18946,6 +19413,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } + private void cancelStickerClippingMode() { + if (sendPhotoType == SELECT_TYPE_STICKER && cutOutBtn.isCancelState()) { + cutOutBtn.setCutOutState(true); + stickerMakerView.disableClippingMode(); + containerView.invalidate(); + } + } + private void invalidateBlur() { if (animationInProgress != 0) { return; @@ -18953,6 +19428,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (captionEdit != null) { captionEdit.invalidateBlur(); } + if (cutOutBtn != null) { + cutOutBtn.invalidateBlur(); + } if (videoTimelineView != null) { videoTimelineView.invalidateBlur(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java index 429b8a548..e3134d73a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PremiumPreviewFragment.java @@ -72,6 +72,9 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; import org.telegram.ui.Business.AwayMessagesActivity; import org.telegram.ui.Business.BusinessChatbotController; +import org.telegram.ui.Business.BusinessIntroActivity; +import org.telegram.ui.Business.BusinessLinksActivity; +import org.telegram.ui.Business.BusinessLinksController; import org.telegram.ui.Business.ChatbotsActivity; import org.telegram.ui.Business.GreetMessagesActivity; import org.telegram.ui.Business.LocationActivity; @@ -197,6 +200,8 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification public final static int PREMIUM_FEATURE_BUSINESS_AWAY_MESSAGES = 33; public final static int PREMIUM_FEATURE_BUSINESS_CHATBOTS = 34; public final static int PREMIUM_FEATURE_FOLDER_TAGS = 35; + public final static int PREMIUM_FEATURE_BUSINESS_INTRO = 36; + public final static int PREMIUM_FEATURE_BUSINESS_CHAT_LINKS = 37; private int statusBarHeight; private int firstViewHeight; @@ -294,6 +299,10 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification return PREMIUM_FEATURE_BUSINESS_QUICK_REPLIES; case "business_bots": return PREMIUM_FEATURE_BUSINESS_CHATBOTS; + case "business_intro": + return PREMIUM_FEATURE_BUSINESS_INTRO; + case "business_links": + return PREMIUM_FEATURE_BUSINESS_CHAT_LINKS; case "business_hours": return PREMIUM_FEATURE_BUSINESS_OPENING_HOURS; case "business_location": @@ -373,6 +382,10 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification return "quick_replies"; case PREMIUM_FEATURE_BUSINESS_CHATBOTS: return "business_bots"; + case PREMIUM_FEATURE_BUSINESS_INTRO: + return "business_intro"; + case PREMIUM_FEATURE_BUSINESS_CHAT_LINKS: + return "business_links"; case PREMIUM_FEATURE_BUSINESS_OPENING_HOURS: return "business_hours"; case PREMIUM_FEATURE_BUSINESS_LOCATION: @@ -452,6 +465,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification if (getMessagesController().suggestedFilters.isEmpty()) { getMessagesController().loadSuggestedFilters(); } + BusinessLinksController.getInstance(currentAccount).load(false); } } @@ -736,6 +750,10 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification }); } else if (cell.data.type == PREMIUM_FEATURE_FOLDER_TAGS) { presentFragment(new FiltersSetupActivity().highlightTags()); + } else if (cell.data.type == PREMIUM_FEATURE_BUSINESS_INTRO) { + presentFragment(new BusinessIntroActivity()); + } else if (cell.data.type == PREMIUM_FEATURE_BUSINESS_CHAT_LINKS) { + presentFragment(new BusinessLinksActivity()); } return; } @@ -813,14 +831,14 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_ADVANCED_CHAT_MANAGEMENT, R.drawable.menu_premium_tools, LocaleController.getString(R.string.PremiumPreviewAdvancedChatManagement), LocaleController.getString(R.string.PremiumPreviewAdvancedChatManagementDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_PROFILE_BADGE, R.drawable.msg_premium_badge, LocaleController.getString(R.string.PremiumPreviewProfileBadge), LocaleController.getString(R.string.PremiumPreviewProfileBadgeDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_ANIMATED_AVATARS, R.drawable.msg_premium_avatar, LocaleController.getString(R.string.PremiumPreviewAnimatedProfiles), LocaleController.getString(R.string.PremiumPreviewAnimatedProfilesDescription))); - premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_SAVED_TAGS, R.drawable.premium_tags, applyNewSpan(LocaleController.getString(R.string.PremiumPreviewTags2)), LocaleController.getString(R.string.PremiumPreviewTagsDescription2))); + premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_SAVED_TAGS, R.drawable.premium_tags, LocaleController.getString(R.string.PremiumPreviewTags2), LocaleController.getString(R.string.PremiumPreviewTagsDescription2))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_APPLICATION_ICONS, R.drawable.msg_premium_icons, LocaleController.getString(R.string.PremiumPreviewAppIcon), LocaleController.getString(R.string.PremiumPreviewAppIconDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_EMOJI_STATUS, R.drawable.premium_status, LocaleController.getString(R.string.PremiumPreviewEmojiStatus), LocaleController.getString(R.string.PremiumPreviewEmojiStatusDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_TRANSLATIONS, R.drawable.msg_premium_translate, LocaleController.getString(R.string.PremiumPreviewTranslations), LocaleController.getString(R.string.PremiumPreviewTranslationsDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_WALLPAPER, R.drawable.premium_wallpaper, LocaleController.getString(R.string.PremiumPreviewWallpaper), LocaleController.getString(R.string.PremiumPreviewWallpaperDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_NAME_COLOR, R.drawable.premium_colors, LocaleController.getString(R.string.PremiumPreviewProfileColor), LocaleController.getString(R.string.PremiumPreviewProfileColorDescription))); - premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_LAST_SEEN, R.drawable.menu_premium_seen, applyNewSpan(LocaleController.getString(R.string.PremiumPreviewLastSeen)), LocaleController.getString(R.string.PremiumPreviewLastSeenDescription))); - premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_MESSAGE_PRIVACY, R.drawable.menu_premium_privacy, applyNewSpan(LocaleController.getString(R.string.PremiumPreviewMessagePrivacy)), LocaleController.getString(R.string.PremiumPreviewMessagePrivacyDescription))); + premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_LAST_SEEN, R.drawable.menu_premium_seen, LocaleController.getString(R.string.PremiumPreviewLastSeen), LocaleController.getString(R.string.PremiumPreviewLastSeenDescription))); + premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_MESSAGE_PRIVACY, R.drawable.menu_premium_privacy, LocaleController.getString(R.string.PremiumPreviewMessagePrivacy), LocaleController.getString(R.string.PremiumPreviewMessagePrivacyDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_BUSINESS, R.drawable.filled_premium_business, applyNewSpan(LocaleController.getString(R.string.TelegramBusiness)), LocaleController.getString(R.string.PremiumPreviewBusinessDescription))); if (messagesController.premiumFeaturesTypesToPosition.size() > 0) { @@ -848,7 +866,9 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_BUSINESS_QUICK_REPLIES, R.drawable.filled_open_message, LocaleController.getString(R.string.PremiumBusinessQuickReplies), LocaleController.getString(R.string.PremiumBusinessQuickRepliesDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_BUSINESS_GREETING_MESSAGES, R.drawable.premium_status, LocaleController.getString(R.string.PremiumBusinessGreetingMessages), LocaleController.getString(R.string.PremiumBusinessGreetingMessagesDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_BUSINESS_AWAY_MESSAGES, R.drawable.filled_premium_away, LocaleController.getString(R.string.PremiumBusinessAwayMessages), LocaleController.getString(R.string.PremiumBusinessAwayMessagesDescription))); - premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_BUSINESS_CHATBOTS, R.drawable.filled_premium_bots, LocaleController.getString(R.string.PremiumBusinessChatbots), LocaleController.getString(R.string.PremiumBusinessChatbotsDescription))); + premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_BUSINESS_CHATBOTS, R.drawable.filled_premium_bots, applyNewSpan(LocaleController.getString(R.string.PremiumBusinessChatbots2)), LocaleController.getString(R.string.PremiumBusinessChatbotsDescription))); + premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_BUSINESS_CHAT_LINKS, R.drawable.filled_premium_chatlink, applyNewSpan(LocaleController.getString(R.string.PremiumBusinessChatLinks)), LocaleController.getString(R.string.PremiumBusinessChatLinksDescription))); + premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_BUSINESS_INTRO, R.drawable.filled_premium_intro, applyNewSpan(LocaleController.getString(R.string.PremiumBusinessIntro)), LocaleController.getString(R.string.PremiumBusinessIntroDescription))); } else { premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_EMOJI_STATUS, R.drawable.filled_premium_status2, LocaleController.getString(R.string.PremiumPreviewBusinessEmojiStatus), LocaleController.getString(R.string.PremiumPreviewBusinessEmojiStatusDescription))); premiumFeatures.add(new PremiumFeatureData(PREMIUM_FEATURE_FOLDER_TAGS, R.drawable.premium_tags, LocaleController.getString(R.string.PremiumPreviewFolderTags), LocaleController.getString(R.string.PremiumPreviewFolderTagsDescription))); @@ -857,7 +877,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification if (messagesController.businessFeaturesTypesToPosition.size() > 0) { for (int i = 0; i < premiumFeatures.size(); i++) { - if (messagesController.businessFeaturesTypesToPosition.get(premiumFeatures.get(i).type, -1) == -1 && !BuildVars.DEBUG_PRIVATE_VERSION) { + if (messagesController.businessFeaturesTypesToPosition.get(premiumFeatures.get(i).type, -1) == -1 && !BuildVars.DEBUG_VERSION) { premiumFeatures.remove(i); i--; } @@ -1463,7 +1483,7 @@ public class PremiumPreviewFragment extends BaseFragment implements Notification @Override public void onLongPress() { super.onLongPress(); - if (settingsView != null && !BuildVars.DEBUG_PRIVATE_VERSION) { + if (settingsView != null || !BuildVars.DEBUG_PRIVATE_VERSION) { return; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacyControlActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacyControlActivity.java index b6d3a573a..d4aef8999 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacyControlActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacyControlActivity.java @@ -8,9 +8,8 @@ package org.telegram.ui; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.AnimatorSet; +import static org.telegram.messenger.LocaleController.getString; + import android.content.Context; import android.content.SharedPreferences; import android.graphics.Canvas; @@ -72,7 +71,6 @@ import org.telegram.ui.Cells.TextSettingsCell; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.BackgroundGradientDrawable; import org.telegram.ui.Components.BackupImageView; -import org.telegram.ui.Components.BotWebViewContainer; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.CombinedDrawable; @@ -100,8 +98,10 @@ public class PrivacyControlActivity extends BaseFragment implements Notification private int initialRulesSubType; private ArrayList initialPlus = new ArrayList<>(); private ArrayList initialMinus = new ArrayList<>(); + private final boolean[] initialPlusPremium = new boolean[2]; private int rulesType; + private final boolean[] currentPlusPremium = new boolean[2]; private ArrayList currentPlus; private ArrayList currentMinus; @@ -110,6 +110,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification private boolean prevSubtypeContacts; + private int setBirthdayRow; private int messageRow; private int sectionRow; private int everybodyRow; @@ -149,6 +150,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification public final static int PRIVACY_RULES_TYPE_VOICE_MESSAGES = 8; public final static int PRIVACY_RULES_TYPE_BIO = 9; public final static int PRIVACY_RULES_TYPE_MESSAGES = 10; + public final static int PRIVACY_RULES_TYPE_BIRTHDAY = 11; public final static int TYPE_EVERYBODY = 0; public final static int TYPE_NOBODY = 1; @@ -467,13 +469,15 @@ public class PrivacyControlActivity extends BaseFragment implements Notification } else if (rulesType == PRIVACY_RULES_TYPE_CALLS) { actionBar.setTitle(LocaleController.getString("Calls", R.string.Calls)); } else if (rulesType == PRIVACY_RULES_TYPE_INVITE) { - actionBar.setTitle(LocaleController.getString("GroupsAndChannels", R.string.GroupsAndChannels)); + actionBar.setTitle(LocaleController.getString("PrivacyInvites", R.string.PrivacyInvites)); } else if (rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES) { actionBar.setTitle(LocaleController.getString("PrivacyVoiceMessages", R.string.PrivacyVoiceMessages)); } else if (rulesType == PRIVACY_RULES_TYPE_LASTSEEN) { actionBar.setTitle(LocaleController.getString("PrivacyLastSeen", R.string.PrivacyLastSeen)); } else if (rulesType == PRIVACY_RULES_TYPE_MESSAGES) { actionBar.setTitle(LocaleController.getString(R.string.PrivacyMessages)); + } else if (rulesType == PRIVACY_RULES_TYPE_BIRTHDAY) { + actionBar.setTitle(LocaleController.getString(R.string.PrivacyBirthday)); } actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override @@ -564,7 +568,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification cameraDrawable.setCustomEndFrame(43); setAvatarCell.imageView.playAnimation(); } - } else if (rulesType == PRIVACY_RULES_TYPE_MESSAGES && position == myContactsRow && !getUserConfig().isPremium()) { + } else if (rulesType == PRIVACY_RULES_TYPE_MESSAGES && position == myContactsRow && !getMessagesController().newNoncontactPeersRequirePremiumWithoutOwnpremium && !getUserConfig().isPremium()) { BulletinFactory.of(this).createSimpleBulletin( R.raw.star_premium_2, LocaleController.getString(R.string.OptionPremiumRequiredTitle), @@ -624,50 +628,31 @@ public class PrivacyControlActivity extends BaseFragment implements Notification } else { createFromArray = currentPlus; } - if (createFromArray.isEmpty()) { - Bundle args = new Bundle(); - args.putBoolean(position == neverShareRow ? "isNeverShare" : "isAlwaysShare", true); - args.putInt("chatAddType", rulesType != PRIVACY_RULES_TYPE_LASTSEEN ? 1 : 0); - GroupCreateActivity fragment = new GroupCreateActivity(args); - fragment.setDelegate(ids -> { - if (position == neverShareRow) { - currentMinus = ids; - for (int a = 0; a < currentMinus.size(); a++) { - currentPlus.remove(currentMinus.get(a)); - } - } else { - currentPlus = ids; - for (int a = 0; a < currentPlus.size(); a++) { - currentMinus.remove(currentPlus.get(a)); - } - } - updateDoneButton(); - listAdapter.notifyDataSetChanged(); - }); - presentFragment(fragment); - } else { - PrivacyUsersActivity fragment = new PrivacyUsersActivity(PrivacyUsersActivity.TYPE_PRIVACY, createFromArray, rulesType != PRIVACY_RULES_TYPE_LASTSEEN && rulesType != PRIVACY_RULES_TYPE_PHOTO && rulesType != PRIVACY_RULES_TYPE_BIO, position == alwaysShareRow); - fragment.setDelegate((ids, added) -> { - if (position == neverShareRow) { - currentMinus = ids; - if (added) { - for (int a = 0; a < currentMinus.size(); a++) { - currentPlus.remove(currentMinus.get(a)); - } - } - } else { - currentPlus = ids; - if (added) { - for (int a = 0; a < currentPlus.size(); a++) { - currentMinus.remove(currentPlus.get(a)); - } - } - } - updateDoneButton(); - listAdapter.notifyDataSetChanged(); - }); - presentFragment(fragment); + Bundle args = new Bundle(); + args.putBoolean(position == neverShareRow ? "isNeverShare" : "isAlwaysShare", true); + args.putInt("chatAddType", rulesType != PRIVACY_RULES_TYPE_LASTSEEN ? 1 : 0); + if (position == alwaysShareRow && rulesType == PRIVACY_RULES_TYPE_INVITE) { + args.putBoolean("allowPremium", true); } + GroupCreateActivity fragment = new GroupCreateActivity(args); + fragment.select(createFromArray, position == alwaysShareRow && currentPlusPremium[currentType == TYPE_CONTACTS ? 0 : 1]); + fragment.setDelegate((premium, ids) -> { + if (position == neverShareRow) { + currentMinus = ids; + for (int a = 0; a < currentMinus.size(); a++) { + currentPlus.remove(currentMinus.get(a)); + } + } else { + currentPlusPremium[currentType == TYPE_CONTACTS ? 0 : 1] = premium; + currentPlus = ids; + for (int a = 0; a < currentPlus.size(); a++) { + currentMinus.remove(currentPlus.get(a)); + } + } + updateDoneButton(); + listAdapter.notifyDataSetChanged(); + }); + presentFragment(fragment); } else if (position == p2pRow) { presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_P2P)); } else if (position == readRow) { @@ -771,6 +756,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification req.key = new TLRPC.TL_inputPrivacyKeyChatInvite(); } else if (rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES) { req.key = new TLRPC.TL_inputPrivacyKeyVoiceMessages(); + } else if (rulesType == PRIVACY_RULES_TYPE_BIRTHDAY) { + req.key = new TLRPC.TL_inputPrivacyKeyBirthday(); } else { req.key = new TLRPC.TL_inputPrivacyKeyStatusTimestamp(); } @@ -821,6 +808,9 @@ public class PrivacyControlActivity extends BaseFragment implements Notification } else if (currentType == TYPE_CONTACTS) { req.rules.add(new TLRPC.TL_inputPrivacyValueAllowContacts()); } + if (currentType != 0 && currentPlusPremium[currentType == TYPE_CONTACTS ? 0 : 1]) { + req.rules.add(new TLRPC.TL_inputPrivacyValueAllowPremium()); + } AlertDialog progressDialog = null; if (getParentActivity() != null) { progressDialog = new AlertDialog(getParentActivity(), AlertDialog.ALERT_TYPE_SPINNER); @@ -881,6 +871,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification currentPlus = new ArrayList<>(); return; } + currentPlusPremium[0] = initialPlusPremium[0] = rulesType == PRIVACY_RULES_TYPE_INVITE; + currentPlusPremium[1] = initialPlusPremium[1] = false; currentPlus = new ArrayList<>(); currentMinus = new ArrayList<>(); ArrayList privacyRules = ContactsController.getInstance(currentAccount).getPrivacyRules(rulesType); @@ -888,6 +880,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification currentType = TYPE_NOBODY; } else { int type = -1; + boolean premium = false; + boolean hadAllowContacts = false; for (int a = 0; a < privacyRules.size(); a++) { TLRPC.PrivacyRule rule = privacyRules.get(a); if (rule instanceof TLRPC.TL_privacyValueAllowChatParticipants) { @@ -906,10 +900,19 @@ public class PrivacyControlActivity extends BaseFragment implements Notification } else if (rule instanceof TLRPC.TL_privacyValueDisallowUsers) { TLRPC.TL_privacyValueDisallowUsers privacyValueDisallowUsers = (TLRPC.TL_privacyValueDisallowUsers) rule; currentMinus.addAll(privacyValueDisallowUsers.users); + } else if (rule instanceof TLRPC.TL_privacyValueAllowPremium) { + premium = true; + } else if (rule instanceof TLRPC.TL_privacyValueAllowAll) { + type = 0; + } else if (rule instanceof TLRPC.TL_privacyValueDisallowAll && !hadAllowContacts) { + type = 1; + } else if (rule instanceof TLRPC.TL_privacyValueAllowContacts) { + hadAllowContacts = true; + type = 2; } else if (type == -1) { if (rule instanceof TLRPC.TL_privacyValueAllowAll) { type = 0; - } else if (rule instanceof TLRPC.TL_privacyValueDisallowAll) { + } else if (rule instanceof TLRPC.TL_privacyValueDisallowAll && !hadAllowContacts) { type = 1; } else { type = 2; @@ -923,6 +926,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification } else if (type == TYPE_NOBODY || type == -1 && currentPlus.size() > 0) { currentType = TYPE_NOBODY; } + int a = currentType == TYPE_CONTACTS ? 0 : 1; + currentPlusPremium[a] = initialPlusPremium[a] = premium; if (doneButton != null) { doneButton.setAlpha(0.0f); doneButton.setScaleX(0.0f); @@ -975,6 +980,9 @@ public class PrivacyControlActivity extends BaseFragment implements Notification if (rulesType == PRIVACY_RULES_TYPE_PHONE && currentType == TYPE_NOBODY && initialRulesSubType != currentSubType) { return true; } + if (currentType != 0 && initialPlusPremium[currentType == TYPE_CONTACTS ? 0 : 1] != currentPlusPremium[currentType == TYPE_CONTACTS ? 0 : 1]) { + return true; + } if (initialMinus.size() != currentMinus.size()) { return true; } @@ -1005,6 +1013,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification currentPhotoForRestRow = -1; photoForRestDescriptionRow = -1; messageRow = -1; + setBirthdayRow = -1; phoneDetailRow = -1; phoneSectionRow = -1; phoneEverybodyRow = -1; @@ -1021,6 +1030,12 @@ public class PrivacyControlActivity extends BaseFragment implements Notification readPremiumRow = readPremiumDetailRow = -1; rowCount = 0; + if (rulesType == PRIVACY_RULES_TYPE_BIRTHDAY) { + TLRPC.UserFull userFull = getMessagesController().getUserFull(getUserConfig().getClientUserId()); + if (userFull != null && userFull.birthday == null) { + setBirthdayRow = rowCount++; + } + } if (rulesType == PRIVACY_RULES_TYPE_FORWARDS) { messageRow = rowCount++; } @@ -1036,7 +1051,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification rulesType == PRIVACY_RULES_TYPE_FORWARDS || rulesType == PRIVACY_RULES_TYPE_PHONE || rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES || - rulesType == PRIVACY_RULES_TYPE_INVITE + rulesType == PRIVACY_RULES_TYPE_INVITE || + rulesType == PRIVACY_RULES_TYPE_BIRTHDAY ) { nobodyRow = rowCount++; } @@ -1348,6 +1364,13 @@ public class PrivacyControlActivity extends BaseFragment implements Notification } else { value = LocaleController.getString("EmpryUsersPlaceholder", R.string.EmpryUsersPlaceholder); } + if (currentPlusPremium[currentType == TYPE_CONTACTS ? 0 : 1]) { + if (currentPlus == null || currentPlus.isEmpty()) { + value = LocaleController.formatString(R.string.PrivacyPremium); + } else { + value = LocaleController.formatString(R.string.PrivacyPremiumAnd, value); + } + } if (rulesType != PRIVACY_RULES_TYPE_LASTSEEN && rulesType != PRIVACY_RULES_TYPE_PHOTO && rulesType != PRIVACY_RULES_TYPE_BIO) { textCell.setTextAndValue(LocaleController.getString("AlwaysAllow", R.string.AlwaysAllow), value, neverShareRow != -1); } else { @@ -1394,6 +1417,59 @@ public class PrivacyControlActivity extends BaseFragment implements Notification } else { backgroundResId = R.drawable.greydivider_bottom; } + } else if (position == setBirthdayRow) { + privacyCell.setText(AndroidUtilities.replaceArrows(AndroidUtilities.replaceSingleTag(LocaleController.getString(R.string.PrivacyBirthdaySet), () -> { + showDialog(AlertsCreator.createBirthdayPickerDialog(getContext(), getString(R.string.EditProfileBirthdayTitle), getString(R.string.EditProfileBirthdayButton), null, birthday -> { + TLRPC.TL_account_updateBirthday req = new TLRPC.TL_account_updateBirthday(); + req.flags |= 1; + req.birthday = birthday; + TLRPC.UserFull userFull = getMessagesController().getUserFull(getUserConfig().getClientUserId()); + TLRPC.TL_birthday oldBirthday = userFull != null ? userFull.birthday : null; + if (userFull != null) { + userFull.flags2 |= 32; + userFull.birthday = birthday; + getMessagesStorage().updateUserInfo(userFull, false); + } + getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.TL_boolTrue) { + BulletinFactory.of(PrivacyControlActivity.this) + .createSimpleBulletin(R.raw.contact_check, LocaleController.getString(R.string.PrivacyBirthdaySetDone)) + .setDuration(Bulletin.DURATION_PROLONG).show(); + } else { + if (userFull != null) { + if (oldBirthday == null) { + userFull.flags2 &=~ 32; + } else { + userFull.flags2 |= 32; + } + userFull.birthday = oldBirthday; + getMessagesStorage().updateUserInfo(userFull, false); + } + if (err != null && err.text != null && err.text.startsWith("FLOOD_WAIT_")) { + if (getContext() != null) { + showDialog( + new AlertDialog.Builder(getContext(), resourceProvider) + .setTitle(getString(R.string.PrivacyBirthdayTooOftenTitle)) + .setMessage(getString(R.string.PrivacyBirthdayTooOftenMessage)) + .setPositiveButton(getString(R.string.OK), null) + .create() + ); + } + } else { + BulletinFactory.of(PrivacyControlActivity.this) + .createSimpleBulletin(R.raw.error, LocaleController.getString(R.string.UnknownError)) + .show(); + } + } + }), ConnectionsManager.RequestFlagDoNotWaitFloodWait); + + MessagesController.getInstance(currentAccount).removeSuggestion(0, "BIRTHDAY_SETUP"); + + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.premiumPromoUpdated); + updateRows(true); + }, null, getResourceProvider()).create()); + }), true)); + backgroundResId = R.drawable.greydivider; } else if (position == detailRow) { if (rulesType == PRIVACY_RULES_TYPE_PHONE) { if (prevSubtypeContacts = (currentType == TYPE_NOBODY && currentSubType == 1)) { @@ -1425,7 +1501,9 @@ public class PrivacyControlActivity extends BaseFragment implements Notification } else if (rulesType == PRIVACY_RULES_TYPE_PHOTO) { privacyCell.setText(LocaleController.getString("PrivacyProfilePhotoInfo", R.string.PrivacyProfilePhotoInfo)); } else if (rulesType == PRIVACY_RULES_TYPE_BIO) { - privacyCell.setText(LocaleController.getString("PrivacyBioInfo", R.string.PrivacyBioInfo)); + privacyCell.setText(LocaleController.getString("PrivacyBioInfo3", R.string.PrivacyBioInfo3)); + } else if (rulesType == PRIVACY_RULES_TYPE_BIRTHDAY) { + privacyCell.setText(LocaleController.getString(R.string.PrivacyBirthdayInfo)); } else if (rulesType == PRIVACY_RULES_TYPE_P2P) { privacyCell.setText(LocaleController.getString("PrivacyCallsP2PHelp", R.string.PrivacyCallsP2PHelp)); } else if (rulesType == PRIVACY_RULES_TYPE_CALLS) { @@ -1453,6 +1531,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification privacyCell.setText(LocaleController.getString("CustomP2PInfo", R.string.CustomP2PInfo)); } else if (rulesType == PRIVACY_RULES_TYPE_BIO) { privacyCell.setText(LocaleController.getString("PrivacyBioInfo", R.string.PrivacyBioInfo)); + } else if (rulesType == PRIVACY_RULES_TYPE_BIRTHDAY) { + privacyCell.setText(LocaleController.getString(R.string.PrivacyBirthdayInfo3)); } else if (rulesType == PRIVACY_RULES_TYPE_CALLS) { privacyCell.setText(LocaleController.getString("CustomCallInfo", R.string.CustomCallInfo)); } else if (rulesType == PRIVACY_RULES_TYPE_INVITE) { @@ -1506,6 +1586,8 @@ public class PrivacyControlActivity extends BaseFragment implements Notification headerCell.setText(LocaleController.getString("PrivacyVoiceMessagesTitle", R.string.PrivacyVoiceMessagesTitle)); } else if (rulesType == PRIVACY_RULES_TYPE_MESSAGES) { headerCell.setText(LocaleController.getString(R.string.PrivacyMessagesTitle)); + } else if (rulesType == PRIVACY_RULES_TYPE_BIRTHDAY) { + headerCell.setText(LocaleController.getString(R.string.PrivacyBirthday)); } else { headerCell.setText(LocaleController.getString("LastSeenTitle", R.string.LastSeenTitle)); } @@ -1528,7 +1610,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification radioCell.setText(LocaleController.getString("LastSeenEverybody", R.string.LastSeenEverybody), currentType == TYPE_EVERYBODY, true); } } else if (position == myContactsRow) { - if ((rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES || rulesType == PRIVACY_RULES_TYPE_MESSAGES) && !getUserConfig().isPremium()) { + if (rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES && !getUserConfig().isPremium() || rulesType == PRIVACY_RULES_TYPE_MESSAGES && !getMessagesController().newNoncontactPeersRequirePremiumWithoutOwnpremium && !getUserConfig().isPremium()) { radioCell.setRadioIcon(getContext().getResources().getDrawable(R.drawable.mini_switch_lock).mutate()); } if (rulesType == PRIVACY_RULES_TYPE_P2P) { @@ -1539,7 +1621,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification radioCell.setText(LocaleController.getString("LastSeenContacts", R.string.LastSeenContacts), currentType == TYPE_CONTACTS, nobodyRow != -1); } } else { - if ((rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES || rulesType == PRIVACY_RULES_TYPE_MESSAGES) && !getUserConfig().isPremium()) { + if (rulesType == PRIVACY_RULES_TYPE_VOICE_MESSAGES && !getUserConfig().isPremium() || rulesType == PRIVACY_RULES_TYPE_MESSAGES && !getMessagesController().newNoncontactPeersRequirePremiumWithoutOwnpremium && !getUserConfig().isPremium()) { radioCell.setRadioIcon(getContext().getResources().getDrawable(R.drawable.mini_switch_lock).mutate()); } if (rulesType == PRIVACY_RULES_TYPE_P2P) { @@ -1569,7 +1651,7 @@ public class PrivacyControlActivity extends BaseFragment implements Notification public int getItemViewType(int position) { if (position == alwaysShareRow || position == neverShareRow || position == p2pRow || position == readPremiumRow) { return 0; - } else if (position == shareDetailRow || position == detailRow || position == p2pDetailRow || position == photoForRestDescriptionRow || position == readDetailRow || position == readPremiumDetailRow) { + } else if (position == shareDetailRow || position == detailRow || position == p2pDetailRow || position == photoForRestDescriptionRow || position == readDetailRow || position == readPremiumDetailRow || position == setBirthdayRow) { return 1; } else if (position == sectionRow || position == shareSectionRow || position == p2pSectionRow || position == phoneSectionRow) { return 2; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java index 5848f8b57..820e50c67 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java @@ -66,6 +66,8 @@ import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.Premium.PremiumGradient; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.TextStyleSpan; +import org.telegram.ui.bots.BotBiometry; +import org.telegram.ui.bots.BotBiometrySettings; import java.util.ArrayList; @@ -85,6 +87,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio private int lastSeenRow; private int profilePhotoRow; private int bioRow; + private int birthdayRow; private int forwardsRow; private int callsRow; private int voicesRow; @@ -109,6 +112,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio private int passportRow; private int paymentsClearRow; private int webSessionsRow; + private int botsBiometryRow; private int botsDetailRow; private int botsAndWebsitesShadowRow; private int contactsSectionRow; @@ -122,6 +126,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio private int secretDetailRow; private int rowCount; + private final ArrayList biometryBots = new ArrayList<>(); + private boolean deleteAccountUpdate; private boolean secretMapUpdate; private boolean currentSync; @@ -361,6 +367,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_PHOTO)); } else if (position == bioRow) { presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_BIO)); + } else if (position == birthdayRow) { + presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_BIRTHDAY)); } else if (position == forwardsRow) { presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_FORWARDS)); } else if (position == voicesRow) { @@ -582,9 +590,17 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } } else if (position == passportRow) { presentFragment(new PassportActivity(PassportActivity.TYPE_PASSWORD, 0, "", "", null, null, null, null, null)); + } else if (position == botsBiometryRow) { + presentFragment(new BotBiometrySettings()); } }); + BotBiometry.getBots(getContext(), currentAccount, bots -> { + biometryBots.clear(); + biometryBots.addAll(bots); + updateRows(true); + }); + return fragmentView; } @@ -650,10 +666,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio phoneNumberRow = rowCount++; lastSeenRow = rowCount++; profilePhotoRow = rowCount++; - bioRow = rowCount++; forwardsRow = rowCount++; callsRow = rowCount++; - groupsRow = rowCount++; groupsDetailRow = -1; if (!getMessagesController().premiumFeaturesBlocked() || getUserConfig().isPremium()) { voicesRow = rowCount++; @@ -662,6 +676,9 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio voicesRow = -1; noncontactsRow = -1; } + birthdayRow = rowCount++; + bioRow = rowCount++; + groupsRow = rowCount++; privacyShadowRow = rowCount++; if (getMessagesController().autoarchiveAvailable || getUserConfig().isPremium()) { @@ -683,6 +700,11 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio passportRow = -1; } paymentsClearRow = rowCount++; + if (!biometryBots.isEmpty()) { + botsBiometryRow = rowCount++; + } else { + botsBiometryRow = -1; + } if (webSessionsActivityPreload != null && webSessionsActivityPreload.getSessionsCount() > 0) { webSessionsRow = rowCount++; botsDetailRow = rowCount++; @@ -770,6 +792,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio int type = -1; int plus = 0; int minus = 0; + boolean premium = false; for (int a = 0; a < privacyRules.size(); a++) { TLRPC.PrivacyRule rule = privacyRules.get(a); if (rule instanceof TLRPC.TL_privacyValueAllowChatParticipants) { @@ -796,6 +819,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } else if (rule instanceof TLRPC.TL_privacyValueDisallowUsers) { TLRPC.TL_privacyValueDisallowUsers privacyValueDisallowUsers = (TLRPC.TL_privacyValueDisallowUsers) rule; minus += privacyValueDisallowUsers.users.size(); + } else if (rule instanceof TLRPC.TL_privacyValueAllowPremium) { + premium = true; } else if (type == -1) { if (rule instanceof TLRPC.TL_privacyValueAllowAll) { type = 0; @@ -821,33 +846,33 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } } } else if (type == 2 || type == -1 && minus > 0 && plus > 0) { - if (rulesType == 3) { + if (rulesType == PrivacyControlActivity.PRIVACY_RULES_TYPE_P2P) { if (plus == 0 && minus == 0) { return LocaleController.getString("P2PContacts", R.string.P2PContacts); } else { if (plus != 0 && minus != 0) { - return LocaleController.formatString("P2PContactsMinusPlus", R.string.P2PContactsMinusPlus, minus, plus); + return LocaleController.formatString(R.string.P2PContactsMinusPlus, minus, plus); } else if (minus != 0) { - return LocaleController.formatString("P2PContactsMinus", R.string.P2PContactsMinus, minus); + return LocaleController.formatString(R.string.P2PContactsMinus, minus); } else { - return LocaleController.formatString("P2PContactsPlus", R.string.P2PContactsPlus, plus); + return LocaleController.formatString(R.string.P2PContactsPlus, plus); } } } else { if (plus == 0 && minus == 0) { - return LocaleController.getString("LastSeenContacts", R.string.LastSeenContacts); + return LocaleController.getString(premium ? R.string.LastSeenContactsPremium : R.string.LastSeenContacts); } else { if (plus != 0 && minus != 0) { - return LocaleController.formatString("LastSeenContactsMinusPlus", R.string.LastSeenContactsMinusPlus, minus, plus); + return LocaleController.formatString(premium ? R.string.LastSeenContactsPremiumMinusPlus : R.string.LastSeenContactsMinusPlus, minus, plus); } else if (minus != 0) { - return LocaleController.formatString("LastSeenContactsMinus", R.string.LastSeenContactsMinus, minus); + return LocaleController.formatString(premium ? R.string.LastSeenContactsPremiumMinus : R.string.LastSeenContactsMinus, minus); } else { - return LocaleController.formatString("LastSeenContactsPlus", R.string.LastSeenContactsPlus, plus); + return LocaleController.formatString(premium ? R.string.LastSeenContactsPremiumPlus : R.string.LastSeenContactsPlus, plus); } } } } else if (type == 1 || plus > 0) { - if (rulesType == 3) { + if (rulesType == PrivacyControlActivity.PRIVACY_RULES_TYPE_P2P) { if (plus == 0) { return LocaleController.getString("P2PNobody", R.string.P2PNobody); } else { @@ -855,9 +880,9 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } } else { if (plus == 0) { - return LocaleController.getString("LastSeenNobody", R.string.LastSeenNobody); + return LocaleController.getString(premium ? R.string.LastSeenNobodyPremium : R.string.LastSeenNobody); } else { - return LocaleController.formatString("LastSeenNobodyPlus", R.string.LastSeenNobodyPlus, plus); + return LocaleController.formatString(premium ? R.string.LastSeenNobodyPremiumPlus : R.string.LastSeenNobodyPlus, plus); } } } @@ -889,6 +914,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio position == callsRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_CALLS) || position == profilePhotoRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_PHOTO) || position == bioRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_BIO) || + position == birthdayRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_BIRTHDAY) || position == forwardsRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_FORWARDS) || position == phoneNumberRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_PHONE) || position == voicesRow && !getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_VOICE_MESSAGES) || @@ -896,7 +922,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio position == deleteAccountRow && !getContactsController().getLoadingDeleteInfo() || position == newChatsRow && !getContactsController().getLoadingGlobalSettings() || position == emailLoginRow || position == paymentsClearRow || position == secretMapRow || - position == contactsSyncRow || position == passportRow || position == contactsDeleteRow || position == contactsSuggestRow || position == autoDeleteMesages; + position == contactsSyncRow || position == passportRow || position == contactsDeleteRow || + position == contactsSuggestRow || position == autoDeleteMesages || position == botsBiometryRow; } @Override @@ -970,7 +997,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } else { value = formatRulesString(getAccountInstance(), ContactsController.PRIVACY_RULES_TYPE_INVITE); } - textCell.setTextAndValue(LocaleController.getString("GroupsAndChannels", R.string.GroupsAndChannels), value, true); + textCell.setTextAndValue(LocaleController.getString(R.string.PrivacyInvites), value, false); } else if (position == callsRow) { if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_CALLS)) { showLoading = true; @@ -995,6 +1022,14 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio value = formatRulesString(getAccountInstance(), ContactsController.PRIVACY_RULES_TYPE_BIO); } textCell.setTextAndValue(LocaleController.getString("PrivacyBio", R.string.PrivacyBio), value, true); + } else if (position == birthdayRow) { + if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_BIRTHDAY)) { + showLoading = true; + loadingLen = 30; + } else { + value = formatRulesString(getAccountInstance(), ContactsController.PRIVACY_RULES_TYPE_BIRTHDAY); + } + textCell.setTextAndValue(LocaleController.getString(R.string.PrivacyBirthday), value, true); } else if (position == forwardsRow) { if (getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_FORWARDS)) { showLoading = true; @@ -1017,7 +1052,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayIcon), PorterDuff.Mode.MULTIPLY)); } else if (position == noncontactsRow) { value = LocaleController.getString(noncontactsValue ? R.string.ContactsAndPremium : R.string.P2PEverybody); - textCell.setTextAndValue(addPremiumStar(LocaleController.getString(R.string.PrivacyMessages)), value, false); + textCell.setTextAndValue(getMessagesController().newNoncontactPeersRequirePremiumWithoutOwnpremium ? LocaleController.getString(R.string.PrivacyMessages) : addPremiumStar(LocaleController.getString(R.string.PrivacyMessages)), value, bioRow != -1); } else if (position == passportRow) { textCell.setText(LocaleController.getString("TelegramPassport", R.string.TelegramPassport), true); } else if (position == deleteAccountRow) { @@ -1037,6 +1072,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio deleteAccountUpdate = false; } else if (position == paymentsClearRow) { textCell.setText(LocaleController.getString("PrivacyPaymentsClear", R.string.PrivacyPaymentsClear), true); + } else if (position == botsBiometryRow) { + textCell.setText(LocaleController.getString(R.string.PrivacyBiometryBotsButton), true); } else if (position == secretMapRow) { switch (SharedConfig.mapPreviewType) { case 0: @@ -1074,6 +1111,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio privacyCell.setText(LocaleController.getString("SecretWebPageInfo", R.string.SecretWebPageInfo)); } else if (position == botsDetailRow) { privacyCell.setText(LocaleController.getString("PrivacyBotsInfo", R.string.PrivacyBotsInfo)); + } else if (position == privacyShadowRow) { + privacyCell.setText(LocaleController.getString(R.string.PrivacyInvitesInfo)); } else if (position == contactsDetailRow) { /*if (newSync) { privacyCell.setText(LocaleController.getString("SyncContactsInfoOn", R.string.SyncContactsInfoOn)); @@ -1206,15 +1245,15 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio public int getItemViewType(int position) { if (position == passportRow || position == lastSeenRow || position == phoneNumberRow || position == deleteAccountRow || position == webSessionsRow || position == groupsRow || position == paymentsClearRow || - position == secretMapRow || position == contactsDeleteRow) { + position == secretMapRow || position == contactsDeleteRow || position == botsBiometryRow) { return 0; - } else if (position == deleteAccountDetailRow || position == groupsDetailRow || position == sessionsDetailRow || position == secretDetailRow || position == botsDetailRow || position == contactsDetailRow || position == newChatsSectionRow) { + } else if (position == privacyShadowRow || position == deleteAccountDetailRow || position == groupsDetailRow || position == sessionsDetailRow || position == secretDetailRow || position == botsDetailRow || position == contactsDetailRow || position == newChatsSectionRow) { return 1; } else if (position == securitySectionRow || position == advancedSectionRow || position == privacySectionRow || position == secretSectionRow || position == botsSectionRow || position == contactsSectionRow || position == newChatsHeaderRow) { return 2; } else if (position == secretWebpageRow || position == contactsSyncRow || position == contactsSuggestRow || position == newChatsRow) { return 3; - } else if (position == privacyShadowRow || position == botsAndWebsitesShadowRow) { + } else if (position == botsAndWebsitesShadowRow) { return 4; } else if (position == autoDeleteMesages || position == sessionsRow || position == emailLoginRow || position == passwordRow || position == passcodeRow || position == blockedRow) { return 5; @@ -1225,9 +1264,9 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio private SpannableString premiumStar; private CharSequence addPremiumStar(String text) { - if (!getUserConfig().isPremium()) { - return text; - } +// if (getUserConfig().isPremium()) { +// return text; +// } if (premiumStar == null) { premiumStar = new SpannableString("โ˜…"); Drawable drawable = new AnimatedEmojiDrawable.WrapSizeDrawable(PremiumGradient.getInstance().premiumStarMenuDrawable, dp(18), dp(18)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacyUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacyUsersActivity.java index 6f8459812..f1d315d19 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacyUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacyUsersActivity.java @@ -66,6 +66,7 @@ public class PrivacyUsersActivity extends BaseFragment implements NotificationCe private boolean isGroup; private ArrayList uidArray; private boolean isAlwaysShare; + public int rulesType; private PrivacyActivityDelegate delegate; @@ -85,6 +86,11 @@ public class PrivacyUsersActivity extends BaseFragment implements NotificationCe blockedUsersActivity = true; } + public PrivacyUsersActivity loadBlocked() { + getMessagesController().getBlockedPeers(true); + return this; + } + public PrivacyUsersActivity(int type, ArrayList users, boolean group, boolean always) { super(); uidArray = users; @@ -199,8 +205,11 @@ public class PrivacyUsersActivity extends BaseFragment implements NotificationCe } else if (currentType == TYPE_FILTER) { args.putInt("chatAddType", 2); } + if (isAlwaysShare && rulesType == PrivacyControlActivity.PRIVACY_RULES_TYPE_INVITE) { + args.putBoolean("allowPremium", true); + } GroupCreateActivity fragment = new GroupCreateActivity(args); - fragment.setDelegate(ids -> { + fragment.setDelegate((premium, ids) -> { for (Long id1 : ids) { if (uidArray.contains(id1)) { continue; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index 057798c42..ed5334647 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -11,6 +11,7 @@ package org.telegram.ui; import static androidx.core.view.ViewCompat.TYPE_TOUCH; import static org.telegram.messenger.AndroidUtilities.dp; import static org.telegram.messenger.ContactsController.PRIVACY_RULES_TYPE_ADDED_BY_PHONE; +import static org.telegram.messenger.LocaleController.formatString; import android.Manifest; import android.animation.Animator; @@ -64,6 +65,7 @@ import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextPaint; import android.text.TextUtils; +import android.text.style.CharacterStyle; import android.text.style.ClickableSpan; import android.text.style.ForegroundColorSpan; import android.util.Property; @@ -109,12 +111,12 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; -import com.google.android.exoplayer2.util.Log; - import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.BillingController; +import org.telegram.messenger.BirthdayController; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ChatObject; import org.telegram.messenger.ChatThemeController; @@ -150,7 +152,7 @@ import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.SerializedData; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; -import org.telegram.tgnet.tl.TL_stories; +import org.telegram.tgnet.tl.TL_fragment; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; @@ -175,9 +177,11 @@ import org.telegram.ui.Cells.DrawerProfileCell; import org.telegram.ui.Cells.GraySectionCell; import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.NotificationsCheckCell; +import org.telegram.ui.Cells.ProfileChannelCell; import org.telegram.ui.Cells.SettingsSearchCell; import org.telegram.ui.Cells.SettingsSuggestionCell; import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Cells.ShareDialogCell; import org.telegram.ui.Cells.TextCell; import org.telegram.ui.Cells.TextCheckCell; import org.telegram.ui.Cells.TextDetailCell; @@ -228,6 +232,8 @@ import org.telegram.ui.Components.Premium.PremiumFeatureBottomSheet; import org.telegram.ui.Components.Premium.PremiumGradient; import org.telegram.ui.Components.Premium.PremiumPreviewBottomSheet; import org.telegram.ui.Components.Premium.ProfilePremiumCell; +import org.telegram.ui.Components.Premium.boosts.BoostRepository; +import org.telegram.ui.Components.Premium.boosts.PremiumPreviewGiftToUsersBottomSheet; import org.telegram.ui.Components.Premium.boosts.UserSelectorBottomSheet; import org.telegram.ui.Components.ProfileGalleryView; import org.telegram.ui.Components.RLottieDrawable; @@ -253,6 +259,7 @@ import org.telegram.ui.Stories.StoriesListPlaceProvider; import org.telegram.ui.Stories.StoryViewer; import org.telegram.ui.Stories.recorder.DualCameraView; import org.telegram.ui.Stories.recorder.StoryRecorder; +import org.telegram.ui.bots.BotBiometry; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -260,12 +267,15 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.Period; import java.time.format.TextStyle; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -445,6 +455,10 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private TLRPC.ChatFull chatInfo; private TLRPC.UserFull userInfo; + public ProfileChannelCell.ChannelMessageFetcher profileChannelMessageFetcher; + public boolean createdBirthdayFetcher; + public ProfileBirthdayEffect.BirthdayEffectFetcher birthdayFetcher; + private CharSequence currentBio; private long selectedUser; @@ -481,7 +495,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private final static int view_discussion = 22; private final static int delete_topic = 23; - private final static int edit_name = 30; + private final static int edit_info = 30; private final static int logout = 31; private final static int search_button = 32; private final static int set_as_main = 33; @@ -501,8 +515,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private int setAvatarRow; private int setAvatarSectionRow; + private int channelRow; + private int channelDividerRow; private int numberSectionRow; private int numberRow; + public int birthdayRow; private int setUsernameRow; private int bioRow; private int phoneSuggestionSectionRow; @@ -611,6 +628,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. HashSet notificationsExceptionTopics = new HashSet<>(); + private CharacterStyle loadingSpan; + private final Property HEADER_SHADOW = new AnimationProperties.FloatProperty("headerShadow") { @Override public void setValue(ProfileActivity object, float value) { @@ -1940,6 +1959,10 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (pinchToZoomHelper != null) { pinchToZoomHelper.clear(); } + if (birthdayFetcher != null && createdBirthdayFetcher) { + birthdayFetcher.detach(true); + birthdayFetcher = null; + } } @Override @@ -2059,7 +2082,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity(), resourcesProvider); builder.setTitle(LocaleController.getString("BlockUser", R.string.BlockUser)); - builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("AreYouSureBlockContact2", R.string.AreYouSureBlockContact2, ContactsController.formatName(user.first_name, user.last_name)))); + builder.setMessage(AndroidUtilities.replaceTags(formatString("AreYouSureBlockContact2", R.string.AreYouSureBlockContact2, ContactsController.formatName(user.first_name, user.last_name)))); builder.setPositiveButton(LocaleController.getString("BlockContact", R.string.BlockContact), (dialogInterface, i) -> { getMessagesController().blockPeer(userId); if (BulletinFactory.canShowBulletin(ProfileActivity.this)) { @@ -2140,7 +2163,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(LocaleController.getPluralString("DeleteTopics", 1)); TLRPC.TL_forumTopic topic = MessagesController.getInstance(currentAccount).getTopicsController().findTopic(chatId, topicId); - builder.setMessage(LocaleController.formatString("DeleteSelectedTopic", R.string.DeleteSelectedTopic, topic == null ? "topic" : topic.title)); + builder.setMessage(formatString("DeleteSelectedTopic", R.string.DeleteSelectedTopic, topic == null ? "topic" : topic.title)); builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { @@ -2236,7 +2259,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity(), resourcesProvider); builder.setTitle(LocaleController.getString("AddBot", R.string.AddBot)); String chatName = chat == null ? "" : chat.title; - builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("AddMembersAlertNamesText", R.string.AddMembersAlertNamesText, UserObject.getUserName(user), chatName))); + builder.setMessage(AndroidUtilities.replaceTags(formatString("AddMembersAlertNamesText", R.string.AddMembersAlertNamesText, UserObject.getUserName(user), chatName))); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); builder.setPositiveButton(LocaleController.getString("AddBot", R.string.AddBot), (di, i) -> { disableProfileAnimation = true; @@ -2370,6 +2393,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } final boolean isVideo = location.imageType == FileLoader.IMAGE_TYPE_ANIMATION; File f = FileLoader.getInstance(currentAccount).getPathToAttach(location.location, isVideo ? "mp4" : null, true); + if (isVideo && !f.exists()) { + f = new File(FileLoader.getDirectory(FileLoader.MEDIA_DIR_IMAGE), FileLoader.getAttachFileName(location.location, "mp4")); + } if (f.exists()) { MediaController.saveFile(f.toString(), getParentActivity(), 0, null, null, uri -> { if (getParentActivity() == null) { @@ -2378,8 +2404,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. BulletinFactory.createSaveToGalleryBulletin(ProfileActivity.this, isVideo, null).show(); }); } - } else if (id == edit_name) { - presentFragment(new ChangeNameActivity(resourcesProvider)); + } else if (id == edit_info) { + presentFragment(new UserInfoActivity()); } else if (id == edit_color) { presentFragment(new PeerColorActivity(0).startOnProfile().setOnApplied(ProfileActivity.this)); } else if (id == logout) { @@ -2454,10 +2480,10 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } if (location.imageType == FileLoader.IMAGE_TYPE_ANIMATION) { builder.setTitle(LocaleController.getString("AreYouSureDeleteVideoTitle", R.string.AreYouSureDeleteVideoTitle)); - builder.setMessage(LocaleController.formatString("AreYouSureDeleteVideo", R.string.AreYouSureDeleteVideo)); + builder.setMessage(formatString("AreYouSureDeleteVideo", R.string.AreYouSureDeleteVideo)); } else { builder.setTitle(LocaleController.getString("AreYouSureDeletePhotoTitle", R.string.AreYouSureDeletePhotoTitle)); - builder.setMessage(LocaleController.formatString("AreYouSureDeletePhoto", R.string.AreYouSureDeletePhoto)); + builder.setMessage(formatString("AreYouSureDeletePhoto", R.string.AreYouSureDeletePhoto)); } builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), (dialogInterface, i) -> { int position = avatarsViewPager.getRealPosition(); @@ -3667,9 +3693,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else if (position == setUsernameRow) { presentFragment(new ChangeUsernameActivity()); } else if (position == bioRow) { - if (userInfo != null) { - presentFragment(new ChangeBioActivity()); - } + presentFragment(new UserInfoActivity()); } else if (position == numberRow) { presentFragment(new ActionIntroActivity(ActionIntroActivity.ACTION_TYPE_CHANGE_PHONE_NUMBER)); } else if (position == setAvatarRow) { @@ -3679,7 +3703,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else if (position == businessRow) { presentFragment(new PremiumPreviewFragment(PremiumPreviewFragment.FEATURES_BUSINESS, "settings")); } else if (position == premiumGiftingRow) { - UserSelectorBottomSheet.open(); + UserSelectorBottomSheet.open(0, BirthdayController.getInstance(currentAccount).getState()); } else if (position == bizHoursRow) { hoursExpanded = !hoursExpanded; saveScrollPosition(); @@ -3731,6 +3755,19 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } // } } + } else if (position == channelRow) { + if (userInfo == null) return; + Bundle args = new Bundle(); + args.putLong("chat_id", userInfo.personal_channel_id); + presentFragment(new ChatActivity(args)); + } else if (position == birthdayRow) { + if (birthdayEffect != null && birthdayEffect.start()) { + return; + } + TextDetailCell cell = (TextDetailCell) view; + if (cell.hasImage()) { + onTextDetailCellImageClicked(cell.getImageView()); + } } else { processOnClickOrPress(position, view, x, y); } @@ -3776,7 +3813,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. BuildVars.DEBUG_PRIVATE_VERSION ? (SharedConfig.photoViewerBlur ? "do not blur in photoviewer" : "blur in photoviewer") : null, !SharedConfig.payByInvoice ? "Enable Invoice Payment" : "Disable Invoice Payment", BuildVars.DEBUG_PRIVATE_VERSION ? "Update Attach Bots" : null, - Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? (!SharedConfig.useCamera2 ? "Use Camera 2 API" : "Use old Camera 1 API") : null + Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? (!SharedConfig.useCamera2 ? "Use Camera 2 API" : "Use old Camera 1 API") : null, + BuildVars.DEBUG_VERSION ? "Clear bot biometry data" : null }; builder.setItems(items, (dialog, which) -> { @@ -3810,7 +3848,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. getMessagesStorage().clearSentMedia(); SharedConfig.setNoSoundHintShowed(false); SharedPreferences.Editor editor = MessagesController.getGlobalMainSettings().edit(); - editor.remove("archivehint").remove("proximityhint").remove("archivehint_l").remove("speedhint").remove("gifhint").remove("reminderhint").remove("soundHint").remove("themehint").remove("bganimationhint").remove("filterhint").remove("n_0").remove("storyprvhint").remove("storyhint").remove("storyhint2").remove("storydualhint").remove("storysvddualhint").remove("stories_camera").remove("dualcam").remove("dualmatrix").remove("dual_available").remove("archivehint").remove("askNotificationsAfter").remove("askNotificationsDuration").remove("viewoncehint").remove("taptostorysoundhint").remove("nothanos").remove("voiceoncehint").remove("savedhint").remove("savedsearchhint").remove("savedsearchtaghint").remove("groupEmojiPackHintShown").remove("newppsms").apply(); + editor.remove("archivehint").remove("proximityhint").remove("archivehint_l").remove("speedhint").remove("gifhint").remove("reminderhint").remove("soundHint").remove("themehint").remove("bganimationhint").remove("filterhint").remove("n_0").remove("storyprvhint").remove("storyhint").remove("storyhint2").remove("storydualhint").remove("storysvddualhint").remove("stories_camera").remove("dualcam").remove("dualmatrix").remove("dual_available").remove("archivehint").remove("askNotificationsAfter").remove("askNotificationsDuration").remove("viewoncehint").remove("taptostorysoundhint").remove("nothanos").remove("voiceoncehint").remove("savedhint").remove("savedsearchhint").remove("savedsearchtaghint").remove("groupEmojiPackHintShown").remove("newppsms").remove("monetizationadshint").apply(); MessagesController.getEmojiSettings(currentAccount).edit().remove("featured_hidden").remove("emoji_featured_hidden").commit(); SharedConfig.textSelectionHintShows = 0; SharedConfig.lockRecordAudioVideoHint = 0; @@ -3830,7 +3868,15 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. getNotificationCenter().postNotificationName(NotificationCenter.newSuggestionsAvailable); RestrictedLanguagesSelectActivity.cleanup(); PersistColorPalette.getInstance(currentAccount).cleanup(); - getMessagesController().getMainSettings().edit().remove("peerColors").remove("profilePeerColors").remove("boostingappearance").commit(); + SharedPreferences prefs = getMessagesController().getMainSettings(); + editor = prefs.edit(); + editor.remove("peerColors").remove("profilePeerColors").remove("boostingappearance").remove("bizbothint"); + for (String key : prefs.getAll().keySet()) { + if (key.contains("show_gift_for_") || key.contains("bdayhint_") || key.contains("bdayanim_")) { + editor.remove(key); + } + } + editor.commit(); } else if (which == 7) { VoIPHelper.showCallDebugSettings(getParentActivity()); } else if (which == 8) { @@ -3972,6 +4018,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. listCodecs("video/avc", info); listCodecs("video/hevc", info); + listCodecs("video/x-vnd.on2.vp8", info); + listCodecs("video/x-vnd.on2.vp9", info); showDialog(new ShareAlert(getParentActivity(), null, info.toString(), false, null, false) { @Override @@ -4011,7 +4059,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else if (which == 23) { SharedConfig.toggleSurfaceInStories(); for (int i = 0; i < getParentLayout().getFragmentStack().size(); i++) { - getParentLayout().getFragmentStack().get(i).storyViewer = null; + getParentLayout().getFragmentStack().get(i).clearStoryViewers(); } } else if (which == 24) { SharedConfig.togglePhotoViewerBlur(); @@ -4021,6 +4069,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. getMediaDataController().loadAttachMenuBots(false, true); } else if (which == 27) { SharedConfig.toggleUseCamera2(); + } else if (which == 28) { + BotBiometry.clear(); } }); builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); @@ -4041,6 +4091,15 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. participant = visibleChatParticipants.get(position - membersStartRow); } return onMemberClick(participant, true, view); + } else if (position == birthdayRow) { + if (userInfo == null) return false; + try { + AndroidUtilities.addToClipboard(UserInfoActivity.birthdayString(userInfo.birthday)); + BulletinFactory.of(ProfileActivity.this).createCopyBulletin(LocaleController.getString(R.string.BirthdayCopied)).show(); + } catch (Exception e) { + FileLog.e(e); + } + return true; } else { return processOnClickOrPress(position, view, view.getWidth() / 2f, (int) (view.getHeight() * .75f)); } @@ -4781,6 +4840,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. blurredView.setFitsSystemWindows(true); contentView.addView(blurredView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + createBirthdayEffect(); createFloatingActionButton(getContext()); return fragmentView; } @@ -5473,7 +5533,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. showDialog( new AlertDialog.Builder(getParentActivity(), resourcesProvider) .setTitle(LocaleController.getString("AppName", R.string.AppName)) - .setMessage(LocaleController.formatString("AdminWillBeRemoved", R.string.AdminWillBeRemoved, ContactsController.formatName(user.first_name, user.last_name))) + .setMessage(formatString("AdminWillBeRemoved", R.string.AdminWillBeRemoved, ContactsController.formatName(user.first_name, user.last_name))) .setPositiveButton(LocaleController.getString("OK", R.string.OK), (dialog, which) -> openRightsEdit.run(1)) .setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null) .create() @@ -5590,6 +5650,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private boolean processOnClickOrPress(final int position, final View view, final float x, final float y) { if (position == usernameRow || position == setUsernameRow) { final String username; + final TLRPC.TL_username usernameObj; if (userId != 0) { final TLRPC.User user = getMessagesController().getUser(userId); String username1 = UserObject.getPublicUsername(user); @@ -5597,12 +5658,14 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. return false; } username = username1; + usernameObj = DialogObject.findUsername(username, user); } else if (chatId != 0) { final TLRPC.Chat chat = getMessagesController().getChat(chatId); if (chat == null || topicId == 0 && !ChatObject.isPublic(chat)) { return false; } username = ChatObject.getPublicUsername(chat); + usernameObj = DialogObject.findUsername(username, chat); } else { return false; } @@ -5614,15 +5677,75 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else { link = "https://" + getMessagesController().linkPrefix + "/c/" + chat.id + (topicId != 0 ? "/" + topicId : ""); } - showDialog(new ShareAlert(getParentActivity(), null, link, false, link, false) { + ShareAlert shareAlert = new ShareAlert(getParentActivity(), null, link, false, link, false) { @Override protected void onSend(LongSparseArray dids, int count, TLRPC.TL_forumTopic topic) { AndroidUtilities.runOnUIThread(() -> { BulletinFactory.createInviteSentBulletin(getParentActivity(), contentView, dids.size(), dids.size() == 1 ? dids.valueAt(0).id : 0, count, getThemedColor(Theme.key_undo_background), getThemedColor(Theme.key_undo_infoColor)).show(); }, 250); } - }); + }; + showDialog(shareAlert); + if (usernameObj != null && !usernameObj.editable) { + TL_fragment.TL_getCollectibleInfo req = new TL_fragment.TL_getCollectibleInfo(); + TL_fragment.TL_inputCollectibleUsername input = new TL_fragment.TL_inputCollectibleUsername(); + input.username = usernameObj.username; + req.collectible = input; + int reqId = getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TL_fragment.TL_collectibleInfo) { + TL_fragment.TL_collectibleInfo info = (TL_fragment.TL_collectibleInfo) res; + TLObject obj; + if (userId != 0) { + obj = getMessagesController().getUser(userId); + } else { + obj = getMessagesController().getChat(chatId); + } + final String usernameStr = "@" + usernameObj.username; + final String date = LocaleController.getInstance().formatterBoostExpired.format(new Date(info.purchase_date * 1000L)); + final String cryptoAmount = BillingController.getInstance().formatCurrency(info.crypto_amount, info.crypto_currency); + final String amount = BillingController.getInstance().formatCurrency(info.amount, info.currency); + BulletinFactory.of(shareAlert.bulletinContainer2, resourcesProvider) + .createImageBulletin( + R.drawable.filled_username, + AndroidUtilities.withLearnMore(AndroidUtilities.replaceTags(formatString(R.string.FragmentChannelUsername, usernameStr, date, cryptoAmount, TextUtils.isEmpty(amount) ? "" : "("+amount+")")), () -> { + Bulletin.hideVisible(); + Browser.openUrl(getContext(), info.url); + }) + ) + .setOnClickListener(v -> { + Bulletin.hideVisible(); + Browser.openUrl(getContext(), info.url); + }) + .show(false); + } else { + BulletinFactory.showError(err); + } + })); + getConnectionsManager().bindRequestToGuid(reqId, getClassGuid()); + } } else { + if (usernameObj != null && !usernameObj.editable) { + TL_fragment.TL_getCollectibleInfo req = new TL_fragment.TL_getCollectibleInfo(); + TL_fragment.TL_inputCollectibleUsername input = new TL_fragment.TL_inputCollectibleUsername(); + input.username = usernameObj.username; + req.collectible = input; + int reqId = getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TL_fragment.TL_collectibleInfo) { + TLObject obj; + if (userId != 0) { + obj = getMessagesController().getUser(userId); + } else { + obj = getMessagesController().getChat(chatId); + } + FragmentUsernameBottomSheet.open(getContext(), FragmentUsernameBottomSheet.TYPE_USERNAME, usernameObj.username, obj, (TL_fragment.TL_collectibleInfo) res, getResourceProvider()); + } else { + BulletinFactory.showError(err); + } + })); + getConnectionsManager().bindRequestToGuid(reqId, getClassGuid()); + return true; + } + try { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); String text = "@" + username; @@ -5640,6 +5763,22 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. return false; } + if (position == phoneRow && user.phone.startsWith("888")) { + TL_fragment.TL_inputCollectiblePhone input = new TL_fragment.TL_inputCollectiblePhone(); + final String phone = input.phone = user.phone; + TL_fragment.TL_getCollectibleInfo req = new TL_fragment.TL_getCollectibleInfo(); + req.collectible = input; + int reqId = getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TL_fragment.TL_collectibleInfo) { + FragmentUsernameBottomSheet.open(getContext(), FragmentUsernameBottomSheet.TYPE_PHONE, phone, user, (TL_fragment.TL_collectibleInfo) res, getResourceProvider()); + } else { + BulletinFactory.showError(err); + } + })); + getConnectionsManager().bindRequestToGuid(reqId, getClassGuid()); + return true; + } + ArrayList items = new ArrayList<>(); ArrayList actions = new ArrayList<>(); List icons = new ArrayList<>(); @@ -5916,7 +6055,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. ArrayList[] days = OpeningHoursActivity.getDaysHours(userInfo.business_work_hours.weekly_open); StringBuilder sb = new StringBuilder(); if (userInfo.user != null) { - sb.append(LocaleController.formatString(R.string.BusinessHoursCopyHeader, UserObject.getUserName(userInfo.user))).append("\n"); + sb.append(formatString(R.string.BusinessHoursCopyHeader, UserObject.getUserName(userInfo.user))).append("\n"); } for (int i = 0; i < days.length; ++i) { ArrayList periods = days[i]; @@ -5944,7 +6083,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. int valueUtcOffset = timezone == null ? 0 : timezone.utc_offset; int utcOffset = (currentUtcOffset - valueUtcOffset) / 60; if (utcOffset != 0 && timezone != null) { - sb.append(LocaleController.formatString(R.string.BusinessHoursCopyFooter, TimezonesController.getInstance(currentAccount).getTimezoneName(timezone, true))); + sb.append(formatString(R.string.BusinessHoursCopyFooter, TimezonesController.getInstance(currentAccount).getTimezoneName(timezone, true))); } finalText = sb.toString(); } else if (position == bizLocationRow) { @@ -6299,7 +6438,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } fragment.setIgnoreUsers(users); } - fragment.setDelegate((users, fwdCount) -> { + fragment.setDelegate2((users, fwdCount) -> { HashSet currentParticipants = new HashSet<>(); ArrayList addedUsers = new ArrayList<>(); if (chatInfo != null && chatInfo.participants != null && chatInfo.participants.participants != null) { @@ -7188,6 +7327,19 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } updateAutoDeleteItem(); updateTtlIcon(); + if (profileChannelMessageFetcher == null && !isSettings()) { + profileChannelMessageFetcher = new ProfileChannelCell.ChannelMessageFetcher(currentAccount); + profileChannelMessageFetcher.subscribe(() -> updateListAnimated(false)); + profileChannelMessageFetcher.fetch(userInfo); + } + if (!isSettings()) { + ProfileBirthdayEffect.BirthdayEffectFetcher oldFetcher = birthdayFetcher; + birthdayFetcher = ProfileBirthdayEffect.BirthdayEffectFetcher.of(currentAccount, userInfo, birthdayFetcher); + createdBirthdayFetcher = birthdayFetcher != oldFetcher; + if (birthdayFetcher != null) { + birthdayFetcher.subscribe(this::createBirthdayEffect); + } + } } } else if (id == NotificationCenter.privacyRulesUpdated) { if (qrItem != null) { @@ -7426,6 +7578,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. undoView.hide(true, 0); } super.onBecomeFullyHidden(); + fullyVisible = false; } public void setPlayProfileAnimation(int type) { @@ -7800,6 +7953,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } } animatorSet.playTogether(animators); + if (birthdayEffect != null) { + birthdayEffect.hide(); + } } profileTransitionInProgress = true; ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1f); @@ -7923,7 +8079,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. return getMessagesController().getStoriesController().hasStories(getDialogId()) && !isTopic; } - public void setUserInfo(TLRPC.UserFull value) { + public void setUserInfo( + TLRPC.UserFull value, + ProfileChannelCell.ChannelMessageFetcher channelMessageFetcher, + ProfileBirthdayEffect.BirthdayEffectFetcher birthdayAssetsFetcher + ) { userInfo = value; if (storyView != null) { storyView.setStories(userInfo.stories); @@ -7934,6 +8094,24 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (sharedMediaLayout != null) { sharedMediaLayout.setUserInfo(userInfo); } + if (profileChannelMessageFetcher == null) { + profileChannelMessageFetcher = channelMessageFetcher; + } + if (profileChannelMessageFetcher == null) { + profileChannelMessageFetcher = new ProfileChannelCell.ChannelMessageFetcher(currentAccount); + } + profileChannelMessageFetcher.subscribe(() -> updateListAnimated(false)); + profileChannelMessageFetcher.fetch(userInfo); + if (birthdayFetcher == null) { + birthdayFetcher = birthdayAssetsFetcher; + } + if (birthdayFetcher == null) { + birthdayFetcher = ProfileBirthdayEffect.BirthdayEffectFetcher.of(currentAccount, userInfo, birthdayFetcher); + createdBirthdayFetcher = birthdayFetcher != null; + } + if (birthdayFetcher != null) { + birthdayFetcher.subscribe(this::createBirthdayEffect); + } } public boolean canSearchMembers() { @@ -7987,8 +8165,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. setAvatarSectionRow = -1; numberSectionRow = -1; numberRow = -1; + birthdayRow = -1; setUsernameRow = -1; bioRow = -1; + channelRow = -1; + channelDividerRow = -1; phoneSuggestionSectionRow = -1; phoneSuggestionRow = -1; passwordSuggestionSectionRow = -1; @@ -8164,6 +8345,13 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. boolean hasInfo = userInfo != null && !TextUtils.isEmpty(userInfo.about) || user != null && !TextUtils.isEmpty(username); boolean hasPhone = user != null && (!TextUtils.isEmpty(user.phone) || !TextUtils.isEmpty(vcardPhone)); + if (userInfo != null && (userInfo.flags2 & 64) != 0 && (profileChannelMessageFetcher == null || !profileChannelMessageFetcher.loaded || profileChannelMessageFetcher.messageObject != null)) { + TLRPC.Chat channel = getMessagesController().getChat(userInfo.personal_channel_id); + if (channel != null && (ChatObject.isPublic(channel) || !ChatObject.isNotInChat(channel))) { + channelRow = rowCount++; + channelDividerRow = rowCount++; + } + } infoStartRow = rowCount; infoHeaderRow = rowCount++; if (!isBot && (hasPhone || !hasInfo)) { @@ -8176,6 +8364,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. usernameRow = rowCount++; } if (userInfo != null) { + if (userInfo.birthday != null) { + birthdayRow = rowCount++; + } if (userInfo.business_work_hours != null) { bizHoursRow = rowCount++; } @@ -8183,9 +8374,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. bizLocationRow = rowCount++; } } - if (phoneRow != -1 || userInfoRow != -1 || usernameRow != -1 || bizHoursRow != -1 || bizLocationRow != -1) { - notificationsDividerRow = rowCount++; - } +// if (phoneRow != -1 || userInfoRow != -1 || usernameRow != -1 || bizHoursRow != -1 || bizLocationRow != -1) { +// notificationsDividerRow = rowCount++; +// } if (userId != getUserConfig().getClientUserId()) { notificationsRow = rowCount++; } @@ -8257,9 +8448,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. usernameRow = rowCount++; } } - if (infoHeaderRow != -1) { - notificationsDividerRow = rowCount++; - } +// if (infoHeaderRow != -1) { +// notificationsDividerRow = rowCount++; +// } notificationsRow = rowCount++; infoSectionRow = rowCount++; @@ -8771,7 +8962,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (previousTransitionFragment != null) { previousTransitionFragment.checkAndUpdateAvatar(); } - avatarImage.getImageReceiver().setVisible(!PhotoViewer.isShowingImage(photoBig) && (storyViewer == null || !storyViewer.isShown() || storyViewer.transitionViewHolder.view != avatarImage), storyView != null); + avatarImage.getImageReceiver().setVisible(!PhotoViewer.isShowingImage(photoBig) && (getLastStoryViewer() == null || getLastStoryViewer().transitionViewHolder.view != avatarImage), storyView != null); } else if (chatId != 0) { TLRPC.Chat chat = getMessagesController().getChat(chatId); if (chat != null) { @@ -8821,7 +9012,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (count > 0) { statusString = LocaleController.formatPluralString("messages", count, count); } else { - statusString = LocaleController.formatString("TopicProfileStatus", R.string.TopicProfileStatus, chat.title); + statusString = formatString("TopicProfileStatus", R.string.TopicProfileStatus, chat.title); } SpannableString arrowString = new SpannableString(">"); arrowString.setSpan(new ColoredImageSpan(R.drawable.arrow_newchat), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); @@ -9025,7 +9216,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. prevLoadedImageLocation = imageLocation; getFileLoader().loadFile(imageLocation, chat, null, FileLoader.PRIORITY_LOW, 1); } - avatarImage.getImageReceiver().setVisible(!PhotoViewer.isShowingImage(photoBig) && (storyViewer == null || !storyViewer.isShown() || storyViewer.transitionViewHolder.view != avatarImage), storyView != null); + avatarImage.getImageReceiver().setVisible(!PhotoViewer.isShowingImage(photoBig) && (getLastStoryViewer() == null || getLastStoryViewer().transitionViewHolder.view != avatarImage), storyView != null); } if (qrItem != null) { @@ -9078,13 +9269,17 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (view instanceof HeaderCell) { ((HeaderCell) view).setTextColor(applyPeerColor(getThemedColor(Theme.key_windowBackgroundWhiteBlueHeader), false)); } else if (view instanceof TextDetailCell) { - ((TextDetailCell) view).valueTextView.setTextColor(applyPeerColor(getThemedColor(Theme.key_windowBackgroundWhiteGrayText2), false)); + ((TextDetailCell) view).updateColors(); } else if (view instanceof TextCell) { ((TextCell) view).updateColors(); } else if (view instanceof AboutLinkCell) { ((AboutLinkCell) view).updateColors(); } else if (view instanceof NotificationsCheckCell) { ((NotificationsCheckCell) view).getCheckBox().invalidate(); + } else if (view instanceof ProfileHoursCell) { + ((ProfileHoursCell) view).updateColors(); + } else if (view instanceof ProfileChannelCell) { + ((ProfileChannelCell) view).updateColors(); } }); if (sharedMediaLayout != null && sharedMediaLayout.scrollSlidingTextTabStrip != null) { @@ -9104,7 +9299,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private final SparseIntArray adaptedColors = new SparseIntArray(); private int applyPeerColor(int color, boolean actionBar, Boolean online) { - if (!actionBar) return color; + if (!actionBar && isSettings()) return color; if (peerColor != null) { if (!actionBar) { int index = adaptedColors.indexOfKey(color); @@ -9155,7 +9350,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. return; } if (UserObject.isUserSelf(user)) { - otherItem.addSubItem(edit_name, R.drawable.msg_edit, LocaleController.getString(R.string.EditName)); + otherItem.addSubItem(edit_info, R.drawable.msg_edit, LocaleController.getString(R.string.EditInfo)); otherItem.addSubItem(edit_color, R.drawable.msg_colors, LocaleController.getString(R.string.EditProfileColor)); selfUser = true; } else { @@ -10043,7 +10238,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. VIEW_TYPE_TEXT_DETAIL_MULTILINE = 19, VIEW_TYPE_NOTIFICATIONS_CHECK_SIMPLE = 20, VIEW_TYPE_LOCATION = 21, - VIEW_TYPE_HOURS = 22; + VIEW_TYPE_HOURS = 22, + VIEW_TYPE_CHANNEL = 23; private Context mContext; @@ -10062,7 +10258,12 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } case VIEW_TYPE_TEXT_DETAIL_MULTILINE: case VIEW_TYPE_TEXT_DETAIL: - final TextDetailCell textDetailCell = new TextDetailCell(mContext, resourcesProvider, viewType == VIEW_TYPE_TEXT_DETAIL_MULTILINE); + final TextDetailCell textDetailCell = new TextDetailCell(mContext, resourcesProvider, viewType == VIEW_TYPE_TEXT_DETAIL_MULTILINE) { + @Override + protected int processColor(int color) { + return applyPeerColor(color, false); + } + }; textDetailCell.setContentDescriptionValueFirst(true); view = textDetailCell; view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); @@ -10196,7 +10397,12 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); break; case VIEW_TYPE_HOURS: - view = new ProfileHoursCell(mContext, resourcesProvider); + view = new ProfileHoursCell(mContext, resourcesProvider) { + @Override + protected int processColor(int color) { + return applyPeerColor(color, false); + } + }; view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); break; case VIEW_TYPE_VERSION: @@ -10223,7 +10429,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } break; } - cell.setText(LocaleController.formatString("TelegramVersion", R.string.TelegramVersion, String.format(Locale.US, "v%s (%d) %s", pInfo.versionName, code, abi))); + cell.setText(formatString("TelegramVersion", R.string.TelegramVersion, String.format(Locale.US, "v%s (%d) %s", pInfo.versionName, code, abi))); } catch (Exception e) { FileLog.e(e); } @@ -10258,6 +10464,15 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. view = new ProfilePremiumCell(mContext, resourcesProvider); view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); break; + case VIEW_TYPE_CHANNEL: + view = new ProfileChannelCell(ProfileActivity.this) { + @Override + public int processColor(int color) { + return applyPeerColor(color, false); + } + }; + view.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + break; } if (viewType != VIEW_TYPE_SHARED_MEDIA) { view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT)); @@ -10270,6 +10485,10 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (holder.itemView == sharedMediaLayout) { sharedMediaLayoutAttached = true; } + if (holder.itemView instanceof TextDetailCell) { + ((TextDetailCell) holder.itemView).textView.setLoading(loadingSpan); + ((TextDetailCell) holder.itemView).valueTextView.setLoading(loadingSpan); + } } @Override @@ -10307,7 +10526,35 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. case VIEW_TYPE_TEXT_DETAIL: TextDetailCell detailCell = (TextDetailCell) holder.itemView; boolean containsQr = false; - if (position == phoneRow) { + boolean containsGift = false; + if (position == birthdayRow) { + TLRPC.UserFull userFull = getMessagesController().getUserFull(userId); + if (userFull != null && userFull.birthday != null) { + final boolean today = BirthdayController.isToday(userFull); + final boolean withYear = (userFull.birthday.flags & 1) != 0; + final int age = withYear ? Period.between(LocalDate.of(userFull.birthday.year, userFull.birthday.month, userFull.birthday.day), LocalDate.now()).getYears() : -1; + + String text = UserInfoActivity.birthdayString(userFull.birthday); + + if (withYear) { + text = LocaleController.formatPluralString(today ? "ProfileBirthdayTodayValueYear" : "ProfileBirthdayValueYear", age, text); + } else { + text = LocaleController.formatString(today ? R.string.ProfileBirthdayTodayValue : R.string.ProfileBirthdayValue, text); + } + + detailCell.setTextAndValue( + Emoji.replaceWithRestrictedEmoji(text, detailCell.textView, () -> { + if (holder.getAdapterPosition() == position && birthdayRow == position && holder.getItemViewType() == VIEW_TYPE_TEXT_DETAIL) { + onBindViewHolder(holder, position); + } + }), + LocaleController.getString(today ? R.string.ProfileBirthdayToday : R.string.ProfileBirthday), + isTopic || bizHoursRow != -1 || bizLocationRow != -1 + ); + + containsGift = today && !getMessagesController().premiumPurchaseBlocked(); + } + } else if (position == phoneRow) { String text; TLRPC.User user = getMessagesController().getUser(userId); String phoneNumber; @@ -10324,7 +10571,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. isFragmentPhoneNumber = phoneNumber != null && phoneNumber.matches("888\\d{8}"); detailCell.setTextAndValue(text, LocaleController.getString(isFragmentPhoneNumber ? R.string.AnonymousNumber : R.string.PhoneMobile), false); } else if (position == usernameRow) { - String text, username = null; + String username = null; + CharSequence text; CharSequence value; ArrayList usernames = new ArrayList<>(); if (userId != 0) { @@ -10332,7 +10580,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (user != null) { usernames.addAll(user.usernames); } + TLRPC.TL_username usernameObj = null; if (user != null && !TextUtils.isEmpty(user.username)) { + usernameObj = DialogObject.findUsername(user.username, usernames); username = user.username; } usernames = user == null ? new ArrayList<>() : new ArrayList<>(user.usernames); @@ -10340,6 +10590,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. for (int i = 0; i < usernames.size(); ++i) { TLRPC.TL_username u = usernames.get(i); if (u != null && u.active && !TextUtils.isEmpty(u.username)) { + usernameObj = u; username = u.username; break; } @@ -10348,6 +10599,10 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. value = LocaleController.getString("Username", R.string.Username); if (username != null) { text = "@" + username; + if (usernameObj != null && !usernameObj.editable) { + text = new SpannableString(text); + ((SpannableString) text).setSpan(makeUsernameLinkSpan(usernameObj), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } } else { text = "โ€”"; } @@ -10369,7 +10624,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. value = ""; usernames = new ArrayList<>(); } - detailCell.setTextAndValue(text, alsoUsernamesString(username, usernames, value), isTopic || bizHoursRow != -1 || bizLocationRow != -1); + detailCell.setTextAndValue(text, alsoUsernamesString(username, usernames, value), (isTopic || bizHoursRow != -1 || bizLocationRow != -1) && birthdayRow < 0); } else if (position == locationRow) { if (chatInfo != null && chatInfo.location instanceof TLRPC.TL_channelLocation) { TLRPC.TL_channelLocation location = (TLRPC.TL_channelLocation) chatInfo.location; @@ -10418,7 +10673,12 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. detailCell.setTextAndValue(text, value, true); detailCell.setContentDescriptionValueFirst(true); } - if (containsQr) { + if (containsGift) { + Drawable drawable = ContextCompat.getDrawable(detailCell.getContext(), R.drawable.msg_input_gift); + drawable.setColorFilter(new PorterDuffColorFilter(applyPeerColor(getThemedColor(Theme.key_switch2TrackChecked), false), PorterDuff.Mode.MULTIPLY)); + detailCell.setImage(drawable, LocaleController.getString(R.string.GiftPremium)); + detailCell.setImageClickListener(ProfileActivity.this::onTextDetailCellImageClicked); + } else if (containsQr) { Drawable drawable = ContextCompat.getDrawable(detailCell.getContext(), R.drawable.msg_qr_mini); drawable.setColorFilter(new PorterDuffColorFilter(applyPeerColor(getThemedColor(Theme.key_switch2TrackChecked), false), PorterDuff.Mode.MULTIPLY)); detailCell.setImage(drawable, LocaleController.getString("GetQRCode", R.string.GetQRCode)); @@ -10428,6 +10688,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. detailCell.setImageClickListener(null); } detailCell.setTag(position); + detailCell.textView.setLoading(loadingSpan); + detailCell.valueTextView.setLoading(loadingSpan); break; case VIEW_TYPE_ABOUT_LINK: AboutLinkCell aboutLinkCell = (AboutLinkCell) holder.itemView; @@ -10623,11 +10885,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } enabled = true; } else if (delta < 60 * 60) { - val = LocaleController.formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Minutes", delta / 60)); + val = formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Minutes", delta / 60)); } else if (delta < 60 * 60 * 24) { - val = LocaleController.formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Hours", (int) Math.ceil(delta / 60.0f / 60))); + val = formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Hours", (int) Math.ceil(delta / 60.0f / 60))); } else if (delta < 60 * 60 * 24 * 365) { - val = LocaleController.formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Days", (int) Math.ceil(delta / 60.0f / 60 / 24))); + val = formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Days", (int) Math.ceil(delta / 60.0f / 60 / 24))); } else { val = null; } @@ -10743,6 +11005,12 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. }); hoursCell.set(userInfo != null ? userInfo.business_work_hours : null, hoursExpanded, hoursShownMine, notificationsDividerRow < 0 || bizLocationRow >= 0); break; + case VIEW_TYPE_CHANNEL: + ((ProfileChannelCell) holder.itemView).set( + getMessagesController().getChat(userInfo.personal_channel_id), + profileChannelMessageFetcher != null ? profileChannelMessageFetcher.messageObject : null + ); + break; } } @@ -10762,23 +11030,10 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (alsoUsernames.size() > 0) { SpannableStringBuilder usernames = new SpannableStringBuilder(); for (int i = 0; i < alsoUsernames.size(); ++i) { - final String usernameRaw = alsoUsernames.get(i).username; + TLRPC.TL_username usernameObj = alsoUsernames.get(i); + final String usernameRaw = usernameObj.username; SpannableString username = new SpannableString("@" + usernameRaw); - username.setSpan(new ClickableSpan() { - @Override - public void onClick(@NonNull View view) { - String urlFinal = getMessagesController().linkPrefix + "/" + usernameRaw; - if (currentChat == null || !currentChat.noforwards) { - AndroidUtilities.addToClipboard(urlFinal); - undoView.showWithAction(0, UndoView.ACTION_USERNAME_COPIED, null); - } - } - - @Override - public void updateDrawState(@NonNull TextPaint ds) { - ds.setUnderlineText(false); - } - }, 0, username.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + username.setSpan(makeUsernameLinkSpan(usernameObj), 0, username.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); username.setSpan(new ForegroundColorSpan(applyPeerColor(getThemedColor(Theme.key_chat_messageLinkIn), false)), 0, username.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); usernames.append(username); if (i < alsoUsernames.size() - 1) { @@ -10798,6 +11053,57 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } } + private final HashMap usernameSpans = new HashMap(); + public ClickableSpan makeUsernameLinkSpan(TLRPC.TL_username usernameObj) { + ClickableSpan span = usernameSpans.get(usernameObj); + if (span != null) return span; + + final String usernameRaw = usernameObj.username; + span = new ClickableSpan() { + @Override + public void onClick(@NonNull View view) { + if (!usernameObj.editable) { + if (loadingSpan == this) return; + setLoadingSpan(this); + TL_fragment.TL_getCollectibleInfo req = new TL_fragment.TL_getCollectibleInfo(); + TL_fragment.TL_inputCollectibleUsername input = new TL_fragment.TL_inputCollectibleUsername(); + input.username = usernameObj.username; + req.collectible = input; + int reqId = getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + setLoadingSpan(null); + if (res instanceof TL_fragment.TL_collectibleInfo) { + TLObject obj; + if (userId != 0) { + obj = getMessagesController().getUser(userId); + } else { + obj = getMessagesController().getChat(chatId); + } + FragmentUsernameBottomSheet.open(getContext(), FragmentUsernameBottomSheet.TYPE_USERNAME, usernameObj.username, obj, (TL_fragment.TL_collectibleInfo) res, getResourceProvider()); + } else { + BulletinFactory.showError(err); + } + })); + getConnectionsManager().bindRequestToGuid(reqId, getClassGuid()); + } else { + setLoadingSpan(null); + String urlFinal = getMessagesController().linkPrefix + "/" + usernameRaw; + if (currentChat == null || !currentChat.noforwards) { + AndroidUtilities.addToClipboard(urlFinal); + undoView.showWithAction(0, UndoView.ACTION_USERNAME_COPIED, null); + } + } + } + + @Override + public void updateDrawState(@NonNull TextPaint ds) { + ds.setUnderlineText(false); + ds.setColor(ds.linkColor); + } + }; + usernameSpans.put(usernameObj, span); + return span; + } + @Override public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) { if (holder.getAdapterPosition() == setAvatarRow) { @@ -10816,7 +11122,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. position == faqRow || position == policyRow || position == sendLogsRow || position == sendLastLogsRow || position == clearLogsRow || position == switchBackendRow || position == setAvatarRow || position == addToGroupButtonRow || position == premiumRow || position == premiumGiftingRow || - position == businessRow || position == liteModeRow; + position == businessRow || position == liteModeRow || position == birthdayRow || position == channelRow; } if (holder.itemView instanceof UserCell) { UserCell userCell = (UserCell) holder.itemView; @@ -10844,7 +11150,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (position == infoHeaderRow || position == membersHeaderRow || position == settingsSectionRow2 || position == numberSectionRow || position == helpHeaderRow || position == debugHeaderRow) { return VIEW_TYPE_HEADER; - } else if (position == phoneRow || position == locationRow || position == numberRow) { + } else if (position == phoneRow || position == locationRow || position == numberRow || position == birthdayRow) { return VIEW_TYPE_TEXT_DETAIL; } else if (position == usernameRow || position == setUsernameRow) { return VIEW_TYPE_TEXT_DETAIL_MULTILINE; @@ -10869,7 +11175,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } else if (position == infoSectionRow || position == lastSectionRow || position == membersSectionRow || position == secretSettingsSectionRow || position == settingsSectionRow || position == devicesSectionRow || position == helpSectionCell || position == setAvatarSectionRow || position == passwordSuggestionSectionRow || - position == phoneSuggestionSectionRow || position == premiumSectionsRow || position == reportDividerRow) { + position == phoneSuggestionSectionRow || position == premiumSectionsRow || position == reportDividerRow || position == channelDividerRow) { return VIEW_TYPE_SHADOW; } else if (position >= membersStartRow && position < membersEndRow) { return VIEW_TYPE_USER; @@ -10891,6 +11197,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. return VIEW_TYPE_LOCATION; } else if (position == bizHoursRow) { return VIEW_TYPE_HOURS; + } else if (position == channelRow) { + return VIEW_TYPE_CHANNEL; } return 0; } @@ -11076,7 +11384,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. }), new SearchResult(108, LocaleController.getString("Passcode", R.string.Passcode), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg2_secret, () -> presentFragment(PasscodeActivity.determineOpenFragment())), SharedConfig.hasEmailLogin ? new SearchResult(125, LocaleController.getString(R.string.EmailLogin), "emailLoginRow", LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg2_secret, () -> presentFragment(new PrivacySettingsActivity())) : null, - new SearchResult(101, LocaleController.getString("BlockedUsers", R.string.BlockedUsers), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new PrivacyUsersActivity())), + new SearchResult(101, LocaleController.getString("BlockedUsers", R.string.BlockedUsers), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new PrivacyUsersActivity().loadBlocked())), new SearchResult(110, LocaleController.getString("SessionsTitle", R.string.SessionsTitle), R.drawable.msg2_secret, () -> presentFragment(new SessionsActivity(0))), new SearchResult(105, LocaleController.getString("PrivacyPhone", R.string.PrivacyPhone), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_PHONE, true))), new SearchResult(102, LocaleController.getString("PrivacyLastSeen", R.string.PrivacyLastSeen), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_LASTSEEN, true))), @@ -11084,7 +11392,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. new SearchResult(104, LocaleController.getString("PrivacyForwards", R.string.PrivacyForwards), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_FORWARDS, true))), new SearchResult(122, LocaleController.getString("PrivacyP2P", R.string.PrivacyP2P), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_P2P, true))), new SearchResult(106, LocaleController.getString("Calls", R.string.Calls), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_CALLS, true))), - new SearchResult(107, LocaleController.getString("GroupsAndChannels", R.string.GroupsAndChannels), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_INVITE, true))), + new SearchResult(107, LocaleController.getString("PrivacyInvites", R.string.PrivacyInvites), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_INVITE, true))), new SearchResult(123, LocaleController.getString("PrivacyVoiceMessages", R.string.PrivacyVoiceMessages), LocaleController.getString("PrivacySettings", R.string.PrivacySettings), R.drawable.msg_secret, () -> { if (!getUserConfig().isPremium()) { try { @@ -11952,13 +12260,40 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. args.putLong("chat_id", chatId); args.putLong("user_id", userId); presentFragment(new QrActivity(args)); + } else if (parent.getTag() != null && ((int) parent.getTag()) == birthdayRow) { + TLRPC.User user = getMessagesController().getUser(dialogId); + if (user == null || userInfo == null) return; + ArrayList options = new ArrayList<>(userInfo.premium_gifts); + if (options.isEmpty()) { + if (getVisibleDialog() != null) return; + final AlertDialog progressDialog = new AlertDialog(getContext(), AlertDialog.ALERT_TYPE_SPINNER); + final int reqId = BoostRepository.loadGiftOptions(null, loadedOptions -> { + progressDialog.dismiss(); + if (getVisibleDialog() != null) return; + loadedOptions = BoostRepository.filterGiftOptions(loadedOptions, 1); + loadedOptions = BoostRepository.filterGiftOptionsByBilling(loadedOptions); + ArrayList users = new ArrayList<>(); + users.add(user); + PremiumPreviewGiftToUsersBottomSheet.show(users, loadedOptions); + }); + progressDialog.setOnCancelListener(di -> { + getConnectionsManager().cancelRequest(reqId, true); + }); + progressDialog.showDelayed(500); + } else { + showDialog(new GiftPremiumBottomSheet(this, user)); + } } } + private boolean fullyVisible; + @Override public void onBecomeFullyVisible() { super.onBecomeFullyVisible(); writeButtonSetBackground(); + fullyVisible = true; + createBirthdayEffect(); } private void writeButtonSetBackground() { @@ -12156,6 +12491,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. put(++pointer, notificationsSimpleRow, sparseIntArray); put(++pointer, bizHoursRow, sparseIntArray); put(++pointer, bizLocationRow, sparseIntArray); + put(++pointer, birthdayRow, sparseIntArray); + put(++pointer, channelRow, sparseIntArray); } private void put(int id, int position, SparseIntArray sparseIntArray) { @@ -12385,19 +12722,19 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private ShowDrawable showStatusButton; public ShowDrawable getShowStatusButton() { if (showStatusButton == null) { - showStatusButton = new ShowDrawable(); + showStatusButton = new ShowDrawable(LocaleController.getString(R.string.StatusHiddenShow)); showStatusButton.setAlpha((int) (0xFF * Math.min(1f, extraHeight / AndroidUtilities.dp(88f)))); showStatusButton.setBackgroundColor(ColorUtils.blendARGB(Theme.multAlpha(Theme.adaptHSV(actionBarBackgroundColor, +0.18f, -0.1f), 0.5f), 0x23ffffff, currentExpandAnimatorValue)); } return showStatusButton; } - private static class ShowDrawable extends Drawable implements SimpleTextView.PressableDrawable { + public static class ShowDrawable extends Drawable implements SimpleTextView.PressableDrawable { private final Text text; public final Paint backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - public ShowDrawable() { - text = new Text(LocaleController.getString(R.string.StatusHiddenShow), 11); + public ShowDrawable(String string) { + text = new Text(string, 11); backgroundPaint.setColor(0x1f000000); } @@ -12477,4 +12814,31 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } } + public void setLoadingSpan(CharacterStyle span) { + if (loadingSpan == span) return; + loadingSpan = span; + AndroidUtilities.forEachViews(listView, view -> { + if (view instanceof TextDetailCell) { + ((TextDetailCell) view).textView.setLoading(loadingSpan); + ((TextDetailCell) view).valueTextView.setLoading(loadingSpan); + } + }); + } + + private ProfileBirthdayEffect birthdayEffect; + + private void createBirthdayEffect() { + if (fragmentView == null || !fullyVisible || birthdayFetcher == null || getContext() == null) + return; + + if (birthdayEffect != null) { + birthdayEffect.updateFetcher(birthdayFetcher); + birthdayEffect.invalidate(); + return; + } + + birthdayEffect = new ProfileBirthdayEffect(this, birthdayFetcher); + ((FrameLayout) fragmentView).addView(birthdayEffect, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL_HORIZONTAL | Gravity.TOP)); + } + } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileBirthdayEffect.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileBirthdayEffect.java new file mode 100644 index 000000000..cfd1f41c5 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileBirthdayEffect.java @@ -0,0 +1,430 @@ +package org.telegram.ui; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.PointF; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.widget.TextView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BirthdayController; +import org.telegram.messenger.BuildVars; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLocation; +import org.telegram.messenger.ImageReceiver; +import org.telegram.messenger.LiteMode; +import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.Utilities; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.TextDetailCell; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.RecyclerListView; + +import java.time.LocalDate; +import java.time.Period; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +public class ProfileBirthdayEffect extends View { + + private final int currentAccount; + private final long dialogId; + private final ProfileActivity profileActivity; + private BirthdayEffectFetcher fetcher; + private BirthdayEffectFetcher fetcherToSet; + + public static String numbersEmojipack = "FestiveFontEmoji"; + public static String interactionsPack = "EmojiAnimations"; + public static String[] interactions = new String[] { + "๐ŸŽ‰", "๐ŸŽ†", "๐ŸŽˆ" + }; + + + public PointF sourcePoint = new PointF(); + + public ProfileBirthdayEffect(ProfileActivity profileActivity, BirthdayEffectFetcher fetcher) { + super(profileActivity.getContext()); + + this.currentAccount = profileActivity.getCurrentAccount(); + this.dialogId = profileActivity.getDialogId(); + this.profileActivity = profileActivity; + this.fetcher = fetcher; + } + + private boolean autoplayed; + private boolean attached; + private float t = 1; + + private long lastTime; + + private final static long duration = 4200L; + + @Override + protected void onDraw(Canvas canvas) { + + if (!fetcher.loaded) return; + + if (!attached) { + for (int i = 0; i < fetcher.allAssets.size(); ++i) { + fetcher.allAssets.get(i).setParentView(this); + } + attached = true; + + if (!autoplayed) { + autoplayed = true; + post(() -> { +// final String key = "bdayanim_" + LocalDate.now().getYear() + "_" + dialogId; +// if (MessagesController.getInstance(currentAccount).getMainSettings().getBoolean(key, true)) { + start(); +// MessagesController.getInstance(currentAccount).getMainSettings().edit().putBoolean(key, false).apply(); +// } + }); + } + } + + if (!isPlaying) { + return; + } + + final long now = System.currentTimeMillis(); + final float delta = Utilities.clamp((now - lastTime), 20, 0) / (float) duration; + t = Utilities.clamp(t + delta, 1, 0); + lastTime = now; + + updateSourcePoint(); + + final int iw = EmojiAnimationsOverlay.getFilterWidth(); + fetcher.interactionAsset.setImageCoords((getWidth() - dp(iw)) / 2f, Math.max(0, sourcePoint.y - dp(iw) * .5f), dp(iw), dp(iw)); + canvas.save(); + canvas.scale(-1, 1, getWidth() / 2f, 0); + fetcher.interactionAsset.draw(canvas); + fetcher.interactionAsset.setAlpha(1f - (t - .9f) / .1f); + canvas.restore(); + + final int sz = dp(110); + for (int i = fetcher.digitAssets.size() - 1; i >= 0; --i) { + ImageReceiverAsset asset = fetcher.digitAssets.get(i); + + final float t = AndroidUtilities.cascade(this.t, i, fetcher.digitAssets.size(), 1.8f); + + final float w = (getWidth() - sz * .88f * (fetcher.digitAssets.size() - 1)) / 2f - sourcePoint.x; + final float h = sourcePoint.y + sz; + + final float centerX = sourcePoint.x + sz * .88f * i + t * w; + final float centerY = sourcePoint.y - h * (float) Math.pow(this.t, 2f); + final float scale = CubicBezierInterpolator.EASE_OUT_QUINT.getInterpolation(Utilities.clamp(t / .4f, 1, 0)); + + asset.setImageCoords( + centerX - sz / 2f * scale, + centerY - sz / 2f * scale, + sz * scale, + sz * scale + ); + asset.draw(canvas); + } + + if (t >= 1) { + isPlaying = false; + updateFetcher(fetcherToSet); + fetcherToSet = null; + } else { + invalidate(); + } + } + + public void updateFetcher(BirthdayEffectFetcher fetcher) { + if (this.fetcher == fetcher || fetcher == null) return; + if (isPlaying) { + fetcherToSet = fetcher; + } else { + if (attached) { + for (int i = 0; i < this.fetcher.allAssets.size(); ++i) { + this.fetcher.allAssets.get(i).setParentView(null); + } + attached = false; + } + this.fetcher.removeView(this); + this.fetcher = fetcher; + if (!attached) { + for (int i = 0; i < fetcher.allAssets.size(); ++i) { + fetcher.allAssets.get(i).setParentView(this); + } + attached = true; + } + } + } + + private boolean isPlaying = false; + public boolean start() { + if (!fetcher.loaded) { + return false; + } + if (t < 1) { + return false; + } + if (fetcher.interactionAsset.getLottieAnimation() != null) { + fetcher.interactionAsset.getLottieAnimation().setCurrentFrame(0, false); + fetcher.interactionAsset.getLottieAnimation().restart(true); + } + isPlaying = true; + t = 0; + invalidate(); + return true; + } + + public void hide() { + animate().alpha(0).setDuration(200).setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT).start(); + } + + private void updateSourcePoint() { + RecyclerListView listView = profileActivity.getListView(); + final int position = profileActivity.birthdayRow; + if (position < 0) return; + for (int i = 0; i < listView.getChildCount(); ++i) { + View child = listView.getChildAt(i); + final int childPosition = listView.getChildAdapterPosition(child); + if (position == childPosition && child instanceof TextDetailCell) { + TextView textView = ((TextDetailCell) child).textView; + sourcePoint.set( + listView.getX() + child.getX() + textView.getX() + dp(12), + listView.getY() + child.getY() + textView.getY() + textView.getMeasuredHeight() / 2f + ); + return; + } + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + fetcher.addView(this); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (attached) { + for (int i = 0; i < fetcher.allAssets.size(); ++i) { + fetcher.allAssets.get(i).setParentView(null); + } + attached = false; + } + fetcher.removeView(this); + } + + public static class BirthdayEffectFetcher { + public static BirthdayEffectFetcher of(int currentAccount, TLRPC.UserFull userInfo) { + return of(currentAccount, userInfo, null); + } + + public static BirthdayEffectFetcher of(int currentAccount, TLRPC.UserFull userInfo, BirthdayEffectFetcher old) { + if (!LiteMode.isEnabled(LiteMode.FLAG_ANIMATED_STICKERS_CHAT) || !BirthdayController.isToday(userInfo)) { + if (old != null) { + old.detach(false); + } + return null; + } + final int age; + if ((userInfo.birthday.flags & 1) != 0) { + age = Period.between(LocalDate.of(userInfo.birthday.year, userInfo.birthday.month, userInfo.birthday.day), LocalDate.now()).getYears(); + } else { + age = 0; + } + if (old != null) { + if (old.age == age) return old; + old.detach(false); + } + return new BirthdayEffectFetcher(currentAccount, age); + } + + + public final int currentAccount; + public final int age; + + private boolean loaded; + + public ImageReceiverAsset interactionAsset; + public ArrayList digitAssets = new ArrayList<>(); + + public ArrayList allAssets = new ArrayList<>(); + public ArrayList loadedAssets = new ArrayList<>(); + + private final boolean[] setsLoaded = new boolean[2]; + + private BirthdayEffectFetcher(int currentAccount, int age) { + this.currentAccount = currentAccount; + this.age = age; + + if (age <= 0) { + setsLoaded[0] = true; + } else { + final ArrayList order = new ArrayList<>(); + final HashSet digits = new HashSet<>(); + final String ageString = "" + age; + for (int i = 0; i < ageString.length(); ++i) { + char c = ageString.charAt(i); + int n = c - '0'; + if (n < 0 || n > 9) continue; + order.add(n); + digits.add(n); + } + + TLRPC.TL_inputStickerSetShortName inputStickerSetShortName = new TLRPC.TL_inputStickerSetShortName(); + inputStickerSetShortName.short_name = numbersEmojipack; + MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSetShortName, 0, false, set -> { + + HashMap documents = new HashMap<>(); + + for (Integer digit : digits) { + TLRPC.Document d = SelectAnimatedEmojiDialog.findSticker(set, digit + "\uFE0F\u20E3"); + if (d == null) { + d = SelectAnimatedEmojiDialog.findSticker(set, digit + "\u20E3"); + } + if (d == null) { + FileLog.e("couldn't find " + (digit + "\uFE0F\u20E3") + " emoji in " + numbersEmojipack); + return; + } + documents.put(digit, d); + } + + HashMap assets = new HashMap<>(); + for (Map.Entry entry : documents.entrySet()) { + final int digit = entry.getKey(); + ImageReceiverAsset asset = new ImageReceiverAsset(); + allAssets.add(asset); + asset.setEmoji(entry.getValue(), "80_80", set, () -> { + loadedAssets.add(asset); + checkWhenLoaded(); + }); + asset.onAttachedToWindow(); + assets.put(digit, asset); + } + + for (int i = 0; i < order.size(); ++i) { + final int digit = order.get(i); + digitAssets.add(assets.get(digit)); + } + + setsLoaded[0] = true; + checkWhenLoaded(); + }); + } + + final String interaction = interactions[Utilities.random.nextInt(interactions.length)]; + + TLRPC.TL_inputStickerSetShortName inputStickerSetShortName2 = new TLRPC.TL_inputStickerSetShortName(); + inputStickerSetShortName2.short_name = interactionsPack; + MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSetShortName2, 0, false, set -> { + TLRPC.Document document = SelectAnimatedEmojiDialog.findSticker(set, interaction); + + if (document == null) { + FileLog.e("couldn't find " + interaction + " sticker in " + interactionsPack); + return; + } + + interactionAsset = new ImageReceiverAsset(); + allAssets.add(interactionAsset); + final int w = EmojiAnimationsOverlay.getFilterWidth(); + interactionAsset.setAutoRepeat(0); + interactionAsset.setEmoji(document, w + "_" + w + "_precache", set, () -> { + loadedAssets.add(interactionAsset); + checkWhenLoaded(); + }); + interactionAsset.onAttachedToWindow(); + + setsLoaded[1] = true; + checkWhenLoaded(); + }); + } + + private ArrayList callbacks = new ArrayList<>(); + public void checkWhenLoaded() { + if (loaded || loadedAssets.size() < allAssets.size()) { + return; + } + if (!setsLoaded[0] || !setsLoaded[1]) { + return; + } + loaded = true; + for (Runnable callback : callbacks) + callback.run(); + callbacks.clear(); + } + + public boolean isLoaded() { + return loaded; + } + + public void subscribe(Runnable callback) { + if (loaded) callback.run(); + else callbacks.add(callback); + } + + private boolean detachLater; + public void detach(boolean force) { + if (!force && !views.isEmpty()) { + detachLater = true; + return; + } + callbacks.clear(); + for (int i = 0; i < allAssets.size(); ++i) { + allAssets.get(i).onDetachedFromWindow(); + } + allAssets.clear(); + } + + public ArrayList views = new ArrayList<>(); + + public void addView(ProfileBirthdayEffect effect) { + views.add(effect); + } + + public void removeView(ProfileBirthdayEffect effect) { + views.remove(effect); + if (views.isEmpty() && detachLater) { + detach(true); + detachLater = false; + } + } + } + + + private static class ImageReceiverAsset extends ImageReceiver { + + public void setEmoji(TLRPC.Document document, String filter, TLRPC.TL_messages_stickerSet set, Runnable whenDone) { + final Runnable[] callback = new Runnable[] { whenDone }; + setDelegate(new ImageReceiverDelegate() { + @Override + public void didSetImage(ImageReceiver imageReceiver, boolean set, boolean thumb, boolean memCache) { + if (imageReceiver.hasBitmapImage() && callback[0] != null) { + RLottieDrawable lottieDrawable = imageReceiver.getLottieAnimation(); + if (lottieDrawable == null) { + callback[0].run(); + callback[0] = null; + return; + } + if (lottieDrawable.isGeneratingCache()) { + lottieDrawable.whenCacheDone = () -> { + callback[0].run(); + callback[0] = null; + }; + } else { + callback[0].run(); + callback[0] = null; + } + } + } + }); + setImage(ImageLocation.getForDocument(document), filter, null, null, set, 0); + } + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ReportAdBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/ReportAdBottomSheet.java new file mode 100644 index 000000000..7a3b363b1 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/ReportAdBottomSheet.java @@ -0,0 +1,491 @@ +package org.telegram.ui; + +import static org.telegram.messenger.AndroidUtilities.dp; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessageObject; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.R; +import org.telegram.messenger.Utilities; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.BackDrawable; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.HeaderCell; +import org.telegram.ui.Components.AnimatedFloat; +import org.telegram.ui.Components.CombinedDrawable; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LinkSpanDrawable; +import org.telegram.ui.Components.MediaActivity; +import org.telegram.ui.Components.UItem; +import org.telegram.ui.Components.UniversalAdapter; +import org.telegram.ui.Components.UniversalRecyclerView; +import org.telegram.ui.Components.ViewPagerFixed; + +import java.util.ArrayList; +import java.util.Collections; + +public class ReportAdBottomSheet extends BottomSheet { + + private final ViewPagerFixed viewPager; + private static final int PAGE_TYPE_OPTIONS = 0; + private static final int PAGE_TYPE_SUB_OPTIONS = 1; + private final Paint backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final MessageObject messageObject; + private final TLRPC.Chat chat; + private Listener listener; + + interface Listener { + void onReported(); + void onHidden(); + void onPremiumRequired(); + } + + public ReportAdBottomSheet(Context context, Theme.ResourcesProvider resourcesProvider, MessageObject messageObject, TLRPC.Chat chat) { + super(context, true, resourcesProvider); + this.messageObject = messageObject; + this.chat = chat; + backgroundPaint.setColor(Theme.getColor(Theme.key_dialogBackground, resourcesProvider)); + containerView = new ContainerView(context); + viewPager = new ViewPagerFixed(context) { + @Override + protected void onTabAnimationUpdate(boolean manual) { + super.onTabAnimationUpdate(manual); + containerView.invalidate(); + } + + @Override + protected boolean canScrollForward(MotionEvent e) { + return false; + } + + }; + viewPager.setPadding(backgroundPaddingLeft, 0, backgroundPaddingLeft, 0); + containerView.addView(viewPager, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); + viewPager.setAdapter(new ViewPagerFixed.Adapter() { + @Override + public int getItemCount() { + return 5; + } + + @Override + public View createView(int viewType) { + return new Page(context); + } + + @Override + public int getItemViewType(int position) { + if (position == 0) { + return PAGE_TYPE_OPTIONS; + } else { + return PAGE_TYPE_SUB_OPTIONS; + } + } + + @Override + public void bindView(View view, int position, int viewType) { + ((Page) view).bind(viewType); + } + + }); + + if (messageObject == null) { + setReportChooseOption(null); + } + } + + public ReportAdBottomSheet setReportChooseOption(TLRPC.TL_channels_sponsoredMessageReportResultChooseOption chooseOption) { + View[] viewPages = viewPager.getViewPages(); + if (viewPages[0] instanceof Page) { + ((Page) viewPages[0]).bind(PAGE_TYPE_OPTIONS); + containerView.post(() -> ((Page) viewPages[0]).setOption(chooseOption)); + } + if (viewPages[1] instanceof Page) { + ((Page) viewPages[1]).bind(PAGE_TYPE_SUB_OPTIONS); + } + return this; + } + + public ReportAdBottomSheet setListener(Listener listener) { + this.listener = listener; + return this; + } + + @Override + public void onBackPressed() { + if (viewPager.getCurrentPosition() > 0) { + viewPager.scrollToPosition(viewPager.getCurrentPosition() - 1); + return; + } + super.onBackPressed(); + } + + @Override + protected boolean canDismissWithSwipe() { + View currentView = viewPager.getCurrentView(); + if (currentView instanceof Page) { + return ((Page) currentView).atTop(); + } + return true; + } + + private void submitOption(CharSequence optionText, byte[] option) { + TLRPC.TL_channels_reportSponsoredMessage req = new TLRPC.TL_channels_reportSponsoredMessage(); + req.channel = MessagesController.getInputChannel(chat); + req.random_id = messageObject.sponsoredId; + req.option = option; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> { + AndroidUtilities.runOnUIThread(() -> { + if (response != null) { + if (response instanceof TLRPC.TL_channels_sponsoredMessageReportResultChooseOption) { + TLRPC.TL_channels_sponsoredMessageReportResultChooseOption result = (TLRPC.TL_channels_sponsoredMessageReportResultChooseOption) response; + int nextPosition = viewPager.currentPosition + 1; + viewPager.scrollToPosition(nextPosition); + Page nextPage = (Page) viewPager.getViewPages()[1]; + if (nextPage != null) { + nextPage.setOption(result); + if (optionText != null) { + nextPage.setHeaderText(optionText); + } + } + } else if (response instanceof TLRPC.TL_channels_sponsoredMessageReportResultAdsHidden) { + if (listener != null) { + listener.onHidden(); + dismiss(); + } + } else if (response instanceof TLRPC.TL_channels_sponsoredMessageReportResultReported) { + if (listener != null) { + listener.onReported(); + dismiss(); + } + } + } else if (error != null) { + if ("PREMIUM_ACCOUNT_REQUIRED".equals(error.text)) { + if (listener != null) { + listener.onPremiumRequired(); + } + } else if ("AD_EXPIRED".equals(error.text)) { + if (listener != null) { + listener.onReported(); + } + } + dismiss(); + } + }); + }); + } + + private class ContainerView extends FrameLayout { + private final AnimatedFloat isActionBar = new AnimatedFloat(this, 250, CubicBezierInterpolator.EASE_OUT_QUINT); + private float top; + private final Path path = new Path(); + private Boolean statusBarOpen; + + public ContainerView(Context context) { + super(context); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + View[] views = viewPager.getViewPages(); + top = 0; + for (View view : views) { + if (view == null) { + continue; + } + final Page page = (Page) view; + float t = Utilities.clamp(1f - Math.abs(page.getTranslationX() / (float) page.getMeasuredWidth()), 1, 0); + top += page.top() * t; + if (page.getVisibility() == View.VISIBLE) { + page.updateTops(); + } + } + float actionBarT = isActionBar.set(top <= AndroidUtilities.statusBarHeight ? 1f : 0f); + float statusBarHeight = AndroidUtilities.statusBarHeight * actionBarT; + top = Math.max(AndroidUtilities.statusBarHeight, top) - AndroidUtilities.statusBarHeight * actionBarT; + AndroidUtilities.rectTmp.set(backgroundPaddingLeft, top, getWidth() - backgroundPaddingLeft, getHeight() + dp(8)); + final float r = AndroidUtilities.lerp(dp(14), 0, actionBarT); + canvas.drawRoundRect(AndroidUtilities.rectTmp, r, r, backgroundPaint); + canvas.save(); + path.rewind(); + path.addRoundRect(AndroidUtilities.rectTmp, r, r, Path.Direction.CW); + canvas.clipPath(path); + super.dispatchDraw(canvas); + canvas.restore(); + updateLightStatusBar(statusBarHeight > AndroidUtilities.statusBarHeight / 2f); + } + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + return super.drawChild(canvas, child, drawingTime); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN && event.getY() < top) { + dismiss(); + return true; + } + return super.dispatchTouchEvent(event); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY)); + } + + private void updateLightStatusBar(boolean open) { + if (statusBarOpen != null && statusBarOpen == open) { + return; + } + boolean openBgLight = AndroidUtilities.computePerceivedBrightness(getThemedColor(Theme.key_dialogBackground)) > .721f; + boolean closedBgLight = AndroidUtilities.computePerceivedBrightness(Theme.blendOver(getThemedColor(Theme.key_actionBarDefault), 0x33000000)) > .721f; + boolean isLight = (statusBarOpen = open) ? openBgLight : closedBgLight; + AndroidUtilities.setLightStatusBar(getWindow(), isLight); + } + } + + private class Page extends FrameLayout { + int pageType; + TLRPC.TL_channels_sponsoredMessageReportResultChooseOption option; + + private final FrameLayout contentView; + private final UniversalRecyclerView listView; + private final BigHeaderCell headerView; + + public Page(Context context) { + super(context); + + contentView = new FrameLayout(context); + contentView.setPadding(0, AndroidUtilities.statusBarHeight, 0, 0); + contentView.setClipToPadding(true); + addView(contentView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); + + headerView = new BigHeaderCell(context, resourcesProvider); + headerView.setOnBackClickListener(() -> { + if (pageType == PAGE_TYPE_OPTIONS) { + dismiss(); + } else { + onBackPressed(); + } + }); + headerView.setText(LocaleController.getString("ReportAd", R.string.ReportAd)); + headerView.backDrawable.setColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + headerView.setBackgroundColor(Theme.getColor(Theme.key_dialogBackground, resourcesProvider)); + addView(headerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.FILL_HORIZONTAL)); + + listView = new UniversalRecyclerView(context, currentAccount, 0, this::fillItems, this::onClick, null, resourcesProvider); + listView.setClipToPadding(false); + listView.layoutManager.setReverseLayout(true); + listView.setOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + contentView.invalidate(); + containerView.invalidate(); + } + }); + contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + } + + public float top() { + float top = contentView.getPaddingTop(); + for (int i = 0; i < listView.getChildCount(); ++i) { + View child = listView.getChildAt(i); + int position = listView.layoutManager.getPosition(child); + if (position < 0 || position >= listView.adapter.getItemCount()) + continue; + UItem uItem = listView.adapter.getItem(position); + if (uItem != null && uItem.viewType == UniversalAdapter.VIEW_TYPE_SPACE) { + top = contentView.getPaddingTop() + child.getY(); + } + } + return top; + } + + public void updateTops() { + float top = -headerView.getHeight(); + for (int i = 0; i < listView.getChildCount(); ++i) { + View child = listView.getChildAt(i); + int position = listView.layoutManager.getPosition(child); + UItem uItem = listView.adapter.getItem(position); + if (uItem.viewType == UniversalAdapter.VIEW_TYPE_SPACE) { + top = contentView.getPaddingTop() + child.getY(); + break; + } + } + headerView.setTranslationY(Math.max(AndroidUtilities.statusBarHeight, top)); + } + + public void bind(int pageType) { + this.pageType = pageType; + headerView.setCloseImageVisible(pageType != PAGE_TYPE_OPTIONS); + if (listView != null) { + listView.adapter.update(true); + } + } + + public void setOption(TLRPC.TL_channels_sponsoredMessageReportResultChooseOption option) { + this.option = option; + listView.adapter.update(false); + } + + public void setHeaderText(CharSequence headerText) { + headerView.setText(headerText); + headerView.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.displaySize.x, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(120), MeasureSpec.AT_MOST)); + if (listView != null) { + listView.adapter.update(true); + } + } + + public void fillItems(ArrayList items, UniversalAdapter adapter) { + int height = 0; + + if (headerView.getMeasuredHeight() <= 0) { + headerView.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.displaySize.x, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dp(120), MeasureSpec.AT_MOST)); + } + UItem space = UItem.asSpace(headerView.getMeasuredHeight()); + space.id = -1; + space.transparent = true; + items.add(space); + height += headerView.getMeasuredHeight() / AndroidUtilities.density; + + if (option != null) { + HeaderCell headerCell = new HeaderCell(getContext(), Theme.key_windowBackgroundWhiteBlueHeader, 21, 0, 0, false, resourcesProvider); + headerCell.setText(option.title); + headerCell.setBackgroundColor(getThemedColor(Theme.key_dialogBackground)); + UItem headerItem = UItem.asCustom(headerCell); + headerItem.id = -2; + items.add(headerItem); + height += 40; + + for (int i = 0; i < option.options.size(); i++) { + UItem buttonItem = new UItem(UniversalAdapter.VIEW_TYPE_RIGHT_ICON_TEXT, false); + buttonItem.text = option.options.get(i).text; + buttonItem.backgroundKey = Theme.key_dialogBackground; + buttonItem.iconResId = R.drawable.msg_arrowright; + buttonItem.id = i; + items.add(buttonItem); + height += 50; + } + items.get(items.size() - 1).hideDivider = true; + + if (pageType == PAGE_TYPE_OPTIONS) { + FrameLayout frameLayout = new FrameLayout(getContext()); + Drawable shadowDrawable = Theme.getThemedDrawable(getContext(), R.drawable.greydivider, Theme.getColor(Theme.key_windowBackgroundGrayShadow, resourcesProvider)); + Drawable background = new ColorDrawable(getThemedColor(Theme.key_windowBackgroundGray)); + CombinedDrawable combinedDrawable = new CombinedDrawable(background, shadowDrawable, 0, 0); + combinedDrawable.setFullsize(true); + frameLayout.setBackground(combinedDrawable); + LinkSpanDrawable.LinksTextView textView = new LinkSpanDrawable.LinksTextView(getContext()); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + textView.setText(AndroidUtilities.replaceLinks(LocaleController.getString("ReportAdLearnMore", R.string.ReportAdLearnMore), resourcesProvider)); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText3, resourcesProvider)); + textView.setGravity(Gravity.CENTER); + frameLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 16, 16, 16, 16)); + UItem bottomItem = UItem.asCustom(frameLayout); + bottomItem.id = -3; + items.add(bottomItem); + height += 46; + } + } + + if (listView != null) { + if (containerView.getMeasuredHeight() - AndroidUtilities.statusBarHeight < AndroidUtilities.dp(height)) { + listView.layoutManager.setReverseLayout(false); + } else { + Collections.reverse(items); + listView.layoutManager.setReverseLayout(true); + } + } + } + + private void onClick(UItem item, View view, int position, float x, float y) { + if (item.viewType == UniversalAdapter.VIEW_TYPE_RIGHT_ICON_TEXT) { + if (option != null) { + TLRPC.TL_sponsoredMessageReportOption clickedOption = option.options.get(item.id); + if (clickedOption != null) { + submitOption(clickedOption.text, clickedOption.option); + } + } else { + submitOption(item.text, null); + } + } + } + + public boolean atTop() { + return !listView.canScrollVertically(-1); + } + + private class BigHeaderCell extends FrameLayout { + private final ImageView btnBack; + private final TextView textView; + public BackDrawable backDrawable; + private Runnable onBackClickListener; + + public BigHeaderCell(Context context, Theme.ResourcesProvider resourcesProvider) { + super(context); + textView = new TextView(context); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + textView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack, resourcesProvider)); + addView(textView); + + btnBack = new ImageView(context); + btnBack.setImageDrawable(backDrawable = new BackDrawable(false)); + backDrawable.setColor(0xffffffff); + addView(btnBack, LayoutHelper.createFrame(24, 24, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), 16, 16, 16, 0)); + btnBack.setOnClickListener(e -> { + if (onBackClickListener != null) { + onBackClickListener.run(); + } + }); + + setCloseImageVisible(true); + setMinimumHeight(dp(56)); + } + + public void setText(CharSequence text) { + textView.setText(text); + } + + public void setCloseImageVisible(boolean visible) { + btnBack.setVisibility(visible ? View.VISIBLE : View.GONE); + textView.setLayoutParams(LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.FILL_HORIZONTAL, LocaleController.isRTL || !visible ? 22 : 53, 14, LocaleController.isRTL && visible ? 53 : 22, 12)); + } + + public void setOnBackClickListener(Runnable onCloseClickListener) { + this.onBackClickListener = onCloseClickListener; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure( + MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), + heightMeasureSpec + ); + } + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/RevenueSharingAdsInfoBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/RevenueSharingAdsInfoBottomSheet.java new file mode 100644 index 000000000..808f6d764 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/RevenueSharingAdsInfoBottomSheet.java @@ -0,0 +1,184 @@ +package org.telegram.ui; + +import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.getString; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; +import android.text.SpannableString; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TextView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.R; +import org.telegram.messenger.browser.Browser; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.ColoredImageSpan; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LinkSpanDrawable; +import org.telegram.ui.Components.RLottieImageView; + +public class RevenueSharingAdsInfoBottomSheet extends BottomSheet { + private static final int ITEM_HORIZONTAL_PADDING = 27; + private static final int ICON_SIZE = 24; + private static final int ITEM_TEXT_PADDING = 68; + + private final Paint topIconBgPaint; + + @SuppressLint("UseCompatLoadingForDrawables") + public RevenueSharingAdsInfoBottomSheet(BaseFragment baseFragment, Context context, Theme.ResourcesProvider resourcesProvider) { + super(context, false, resourcesProvider); + topIconBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + topIconBgPaint.setStyle(Paint.Style.FILL); + topIconBgPaint.setColor(Theme.getColor(Theme.key_featuredStickers_addButton)); + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.VERTICAL); + + RLottieImageView imageView = new RLottieImageView(getContext()); + imageView.setScaleType(ImageView.ScaleType.CENTER); + imageView.setImageResource(R.drawable.large_ads_info); + imageView.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)); + imageView.setBackground(Theme.createCircleDrawable(dp(80), Theme.getColor(Theme.key_featuredStickers_addButton, resourcesProvider))); + linearLayout.addView(imageView, LayoutHelper.createLinear(80, 80, Gravity.CENTER_HORIZONTAL, 0, 28, 0, 0)); + + TextView topTitle = new TextView(context); + topTitle.setText(LocaleController.getString("AboutRevenueSharingAds", R.string.AboutRevenueSharingAds)); + topTitle.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + topTitle.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + topTitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + topTitle.setGravity(Gravity.CENTER_HORIZONTAL); + linearLayout.addView(topTitle, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 22, 14, 22, 0)); + + TextView topSubtitle = new TextView(context); + topSubtitle.setText(LocaleController.getString("RevenueSharingAdsAlertSubtitle", R.string.RevenueSharingAdsAlertSubtitle)); + topSubtitle.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + topSubtitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + topSubtitle.setGravity(Gravity.CENTER_HORIZONTAL); + linearLayout.addView(topSubtitle, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 22, 8, 22, 0)); + + FrameLayout info1 = new FeatureCell(context, R.drawable.menu_privacy, LocaleController.getString("RevenueSharingAdsInfo1Title", R.string.RevenueSharingAdsInfo1Title), LocaleController.getString("RevenueSharingAdsInfo1Subtitle", R.string.RevenueSharingAdsInfo1Subtitle)); + linearLayout.addView(info1, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 0, 0, 20, 0, 0)); + + FrameLayout info2 = new FeatureCell(context, R.drawable.menu_feature_split, LocaleController.getString("RevenueSharingAdsInfo2Title", R.string.RevenueSharingAdsInfo2Title), LocaleController.getString("RevenueSharingAdsInfo2Subtitle", R.string.RevenueSharingAdsInfo2Subtitle)); + linearLayout.addView(info2, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 0, 0, 16, 0, 0)); + + String info3DescriptionString = LocaleController.formatString("RevenueSharingAdsInfo3Subtitle", R.string.RevenueSharingAdsInfo3Subtitle, MessagesController.getInstance(baseFragment.getCurrentAccount()).channelRestrictSponsoredLevelMin); + SpannableStringBuilder info3Description = AndroidUtilities.replaceSingleTag(info3DescriptionString, Theme.key_chat_messageLinkIn, 0, () -> { + BaseFragment premiumFragment = new PremiumPreviewFragment(PremiumPreviewFragment.featureTypeToServerString(PremiumPreviewFragment.PREMIUM_FEATURE_ADS)); + baseFragment.presentFragment(premiumFragment); + dismiss(); + }); + + FrameLayout info3 = new FeatureCell(context, R.drawable.menu_feature_noads, LocaleController.getString("RevenueSharingAdsInfo3Title", R.string.RevenueSharingAdsInfo3Title), info3Description); + linearLayout.addView(info3, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 0, 0, 16, 0, 0)); + + View divider = new View(getContext()); + divider.setBackgroundColor(Theme.getColor(Theme.key_divider)); + LinearLayout.LayoutParams dividerLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1); + dividerLayoutParams.setMargins(AndroidUtilities.dp(24), AndroidUtilities.dp(20), AndroidUtilities.dp(24), AndroidUtilities.dp(20)); + linearLayout.addView(divider, dividerLayoutParams); + + TextView textViewDescription4 = new TextView(context); + textViewDescription4.setText(LocaleController.getString("RevenueSharingAdsInfo4Title", R.string.RevenueSharingAdsInfo4Title)); + textViewDescription4.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + textViewDescription4.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + textViewDescription4.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + textViewDescription4.setTextAlignment(TextView.TEXT_ALIGNMENT_CENTER); + linearLayout.addView(textViewDescription4, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 22, 0, 22, 0)); + + SpannableStringBuilder bottomSubtitle1 = AndroidUtilities.replaceTags(LocaleController.getString("RevenueSharingAdsInfo4Subtitle", R.string.RevenueSharingAdsInfo4Subtitle)); + String bottomSubtitle2 = getString("RevenueSharingAdsInfo4Subtitle", R.string.RevenueSharingAdsInfo4SubtitleLearnMore); + SpannableStringBuilder stringBuilder2 = AndroidUtilities.replaceSingleTag(bottomSubtitle2, Theme.key_chat_messageLinkIn, 0, () -> Browser.openUrl(getContext(), LocaleController.getString("PromoteUrl", R.string.PromoteUrl))); + SpannableString arrowStr = new SpannableString(">"); + ColoredImageSpan span = new ColoredImageSpan(R.drawable.attach_arrow_right); + span.setOverrideColor(Theme.getColor(Theme.key_chat_messageLinkIn)); + span.setScale(.7f, .7f); + span.setWidth(dp(12)); + span.setTranslateY(1); + arrowStr.setSpan(span, 0, arrowStr.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + SpannableStringBuilder bottomSubtitleFinal = AndroidUtilities.replaceCharSequence(">", AndroidUtilities.replaceCharSequence("%1$s", bottomSubtitle1, stringBuilder2), arrowStr); + LinkSpanDrawable.LinksTextView textViewSubtitle4 = new LinkSpanDrawable.LinksTextView(context); + textViewSubtitle4.setText(bottomSubtitleFinal); + textViewSubtitle4.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText, resourcesProvider)); + textViewSubtitle4.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + textViewSubtitle4.setGravity(Gravity.CENTER_HORIZONTAL); + textViewSubtitle4.setLineSpacing(AndroidUtilities.dp(2), 1f); + linearLayout.addView(textViewSubtitle4, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 26, 8, 26, 0)); + + TextView buttonTextView = new TextView(context); + buttonTextView.setLines(1); + buttonTextView.setSingleLine(true); + buttonTextView.setGravity(Gravity.CENTER); + buttonTextView.setEllipsize(TextUtils.TruncateAt.END); + buttonTextView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); + buttonTextView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + buttonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + buttonTextView.setText(LocaleController.getString("RevenueSharingAdsAlertButton", R.string.RevenueSharingAdsUnderstood)); + buttonTextView.setBackground(Theme.AdaptiveRipple.filledRect(Theme.getColor(Theme.key_featuredStickers_addButton), 6)); + buttonTextView.setOnClickListener(e -> dismiss()); + linearLayout.addView(buttonTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, 0, 14, 22, 14, 14)); + + ScrollView scrollView = new ScrollView(getContext()); + scrollView.addView(linearLayout); + setCustomView(scrollView); + } + + public static RevenueSharingAdsInfoBottomSheet showAlert(Context context, BaseFragment fragment, Theme.ResourcesProvider resourcesProvider) { + RevenueSharingAdsInfoBottomSheet alert = new RevenueSharingAdsInfoBottomSheet(fragment, context, resourcesProvider); + if (fragment != null) { + if (fragment.getParentActivity() != null) { + fragment.showDialog(alert); + } + } else { + alert.show(); + } + return alert; + } + + private class FeatureCell extends FrameLayout { + public FeatureCell(Context context, int icon, CharSequence header, CharSequence text) { + super(context); + boolean isRtl = LocaleController.isRTL; + ImageView ivIcon = new ImageView(getContext()); + Drawable iconDrawable = getContext().getResources().getDrawable(icon).mutate(); + iconDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText), PorterDuff.Mode.MULTIPLY)); + ivIcon.setImageDrawable(iconDrawable); + addView(ivIcon, LayoutHelper.createFrame(ICON_SIZE, ICON_SIZE, isRtl ? Gravity.RIGHT : Gravity.LEFT, isRtl ? 0 : ITEM_HORIZONTAL_PADDING, 6, isRtl ? ITEM_HORIZONTAL_PADDING : 0, 0)); + + TextView tvTitle = new TextView(getContext()); + tvTitle.setText(header); + tvTitle.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + tvTitle.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + addView(tvTitle, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, isRtl ? Gravity.RIGHT : Gravity.LEFT, isRtl ? ITEM_HORIZONTAL_PADDING : ITEM_TEXT_PADDING, 0, isRtl ? ITEM_TEXT_PADDING : ITEM_HORIZONTAL_PADDING, 0)); + + LinkSpanDrawable.LinksTextView tvSubtitle = new LinkSpanDrawable.LinksTextView(getContext()); + tvSubtitle.setText(text); + tvSubtitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + tvSubtitle.setTextColor(Theme.getColor(Theme.key_player_actionBarSubtitle)); + tvSubtitle.setLinkTextColor(Theme.getColor(Theme.key_chat_messageLinkIn, resourcesProvider)); + tvSubtitle.setLineSpacing(AndroidUtilities.dp(2), 1f); + addView(tvSubtitle, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, isRtl ? Gravity.RIGHT : Gravity.LEFT, isRtl ? ITEM_HORIZONTAL_PADDING : ITEM_TEXT_PADDING, 18, isRtl ? ITEM_TEXT_PADDING : ITEM_HORIZONTAL_PADDING, 0)); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java b/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java index 57c69ec24..0e03a10a6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SelectAnimatedEmojiDialog.java @@ -149,6 +149,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati public final static int TYPE_EMOJI_STATUS_CHANNEL_TOP = 10; public final static int TYPE_TAGS = 11; public final static int TYPE_EMOJI_STATUS_TOP = 12; + public final static int TYPE_STICKER_SET_EMOJI = 13; public boolean isBottom() { return type == TYPE_SET_REPLY_ICON || type == TYPE_EMOJI_STATUS_CHANNEL_TOP || type == TYPE_EMOJI_STATUS_TOP; @@ -205,6 +206,20 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati } } + public void setSelectedReaction(ReactionsLayoutInBubble.VisibleReaction reaction) { + selectedReactions.clear(); + selectedReactions.add(reaction); + if (emojiGridView != null) { + for (int i = 0; i < emojiGridView.getChildCount(); i++) { + if (emojiGridView.getChildAt(i) instanceof ImageViewEmoji) { + ImageViewEmoji imageViewEmoji = (ImageViewEmoji) emojiGridView.getChildAt(i); + imageViewEmoji.setViewSelected(selectedReactions.contains(imageViewEmoji.reaction), true); + } + } + emojiGridView.invalidate(); + } + } + public void setForUser(boolean forUser) { this.forUser = forUser; updateRows(false, false); @@ -387,6 +402,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati private boolean recentExpanded = false; private ArrayList recent = new ArrayList<>(); private ArrayList recentStickers = new ArrayList<>(); + private ArrayList standardEmojis = new ArrayList<>(); private ArrayList topReactions = new ArrayList<>(); private ArrayList recentReactions = new ArrayList<>(); private ArrayList defaultStatuses = new ArrayList<>(); @@ -656,7 +672,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati } emojiTabs.animateAppear = bubbleX == null; emojiTabs.setPaddingLeft(type == TYPE_CHAT_REACTIONS ? 10 : 5); - if (type != TYPE_EXPANDABLE_REACTIONS) { + if (type != TYPE_EXPANDABLE_REACTIONS && type != TYPE_STICKER_SET_EMOJI) { contentView.addView(emojiTabs, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36)); } cachedEmojiTabs[i] = emojiTabs; @@ -675,7 +691,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati } }; emojiTabsShadow.setBackgroundColor(Theme.getColor(Theme.key_divider, resourcesProvider)); - if (type != TYPE_EXPANDABLE_REACTIONS) { + if (type != TYPE_EXPANDABLE_REACTIONS && type != TYPE_STICKER_SET_EMOJI) { contentView.addView(emojiTabsShadow, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 1f / AndroidUtilities.density, Gravity.TOP, 0, 36, 0, 0)); } AndroidUtilities.updateViewVisibilityAnimated(emojiTabsShadow, true, 1f, false); @@ -874,7 +890,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati }); emojiSearchGridView.setVisibility(View.GONE); gridViewContainer.addView(emojiSearchGridView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL, 0, 0, 0, 0)); - contentView.addView(gridViewContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP, 0, type == TYPE_EXPANDABLE_REACTIONS ? 0 : 36 + (1 / AndroidUtilities.density), 0, 0)); + contentView.addView(gridViewContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP, 0, type == TYPE_EXPANDABLE_REACTIONS || type == TYPE_STICKER_SET_EMOJI ? 0 : 36 + (1 / AndroidUtilities.density), 0, 0)); scrollHelper = new RecyclerAnimationScrollHelper(emojiGridView, layoutManager); scrollHelper.setAnimationCallback(new RecyclerAnimationScrollHelper.AnimationCallback() { @@ -895,7 +911,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati RecyclerListView.OnItemLongClickListenerExtended onItemLongClick = new RecyclerListView.OnItemLongClickListenerExtended() { @Override public boolean onItemClick(View view, int position, float x, float y) { - if (type == TYPE_TAGS) return false; + if (type == TYPE_TAGS || type == TYPE_STICKER_SET_EMOJI) return false; if (view instanceof ImageViewEmoji && (type == TYPE_REACTIONS || type == TYPE_EXPANDABLE_REACTIONS)) { incrementHintUse(); performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); @@ -1664,235 +1680,286 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati final ArrayList> emojiArrays = new ArrayList<>(); final HashMap, String> emojiStickers = new HashMap<>(); final ArrayList sets = new ArrayList<>(); - Utilities.doCallbacks( - next -> { - if (queryFullyConsistsOfEmojis) { - StickerCategoriesListView.search.fetch(UserConfig.selectedAccount, query, list -> { - if (list != null) { - documentIds.addAll(list.document_id); - } - next.run(); - }); - } else { - next.run(); + final Utilities.Callback applySearch = next -> AndroidUtilities.runOnUIThread(() -> { + if (clearSearchRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(clearSearchRunnable); + clearSearchRunnable = null; + } + + if (query != lastQuery) { + return; + } + searched = true; + switchGrids(true, liftUp); + if (searchBox != null) { + searchBox.showProgress(false); + } + if (searchResult == null) { + searchResult = new ArrayList<>(); + } else { + searchResult.clear(); + } + if (searchSets == null) { + searchSets = new ArrayList<>(); + } else { + searchSets.clear(); + } + if (stickersSearchResult == null) { + stickersSearchResult = new ArrayList<>(); + } else { + stickersSearchResult.clear(); + } + emojiSearchGridView.scrollToPosition(0); + if (type == TYPE_REACTIONS || type == TYPE_TAGS || type == TYPE_SET_DEFAULT_REACTION) { + if (!reactions.isEmpty()) { + searchResult.addAll(reactions); + } else { + TLRPC.TL_availableReaction reaction = availableReactions.get(query); + if (reaction != null) { + searchResult.add(ReactionsLayoutInBubble.VisibleReaction.fromEmojicon(reaction)); } - }, - next -> { - MediaDataController.getInstance(currentAccount).getAnimatedEmojiByKeywords(query, _documentIds -> { - if (_documentIds != null) { - documentIds.addAll(_documentIds); + } + } + for (long documentId : documentIds) { + searchResult.add(ReactionsLayoutInBubble.VisibleReaction.fromCustomEmoji(documentId)); + } + searchSets.addAll(sets); + for (ArrayList array : emojiArrays) { + stickersSearchResult.addAll(array); + } + searchAdapter.updateRows(!firstSearch); + }); + + if (type == TYPE_STICKER_SET_EMOJI) { + final TLRPC.TL_messages_stickerSet[] restrictedSet = new TLRPC.TL_messages_stickerSet[] { null }; + final TLRPC.TL_messages_stickerSet[] staticSet = new TLRPC.TL_messages_stickerSet[] { null }; + + final Utilities.Callback loadSets = next -> { +// TLRPC.TL_inputStickerSetShortName inputStickerSetShortName = new TLRPC.TL_inputStickerSetShortName(); +// inputStickerSetShortName.short_name = "RestrictedEmoji"; +// MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSetShortName, 0, false, set -> { +// restrictedSet[0] = set; +// if (staticSet[0] != null) next.run(); +// }); + TLRPC.TL_inputStickerSetShortName inputStickerSetShortName2 = new TLRPC.TL_inputStickerSetShortName(); + inputStickerSetShortName2.short_name = "StaticEmoji"; + MediaDataController.getInstance(currentAccount).getStickerSet(inputStickerSetShortName2, 0, false, set -> { + staticSet[0] = set; +// if (restrictedSet[0] != null) + next.run(); + }); + }; + final Utilities.Callback search = next -> { + MediaDataController.getInstance(currentAccount).getEmojiSuggestions( + lastSearchKeyboardLanguage, query, false, + (result, alias) -> { + try { + for (int i = 0; i < result.size(); ++i) { + if (result.get(i).emoji.startsWith("animated_")) { + continue; + } + String emoji = result.get(i).emoji; + TLRPC.Document document; + document = findSticker(restrictedSet[0], emoji); + if (document == null) { + document = findSticker(staticSet[0], emoji); + } + if (document != null) { + AnimatedEmojiDrawable.getDocumentFetcher(currentAccount).putDocument(document); + documentIds.add(document.id); + } + } + } catch (Exception ignore) { + } + next.run(); + }, + null, false, false, false, 0 + ); + }; + + Utilities.doCallbacks(loadSets, search, applySearch); + } else { + final Utilities.Callback searchCategories = next -> { + if (queryFullyConsistsOfEmojis) { + StickerCategoriesListView.search.fetch(UserConfig.selectedAccount, query, list -> { + if (list != null) { + documentIds.addAll(list.document_id); } next.run(); }); - }, - next -> { - if (queryFullyConsistsOfEmojis) { - ArrayList stickerSets = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_EMOJIPACKS); - String emoticon; + } else { + next.run(); + } + }; + final Utilities.Callback searchByKeywords = next -> { + MediaDataController.getInstance(currentAccount).getAnimatedEmojiByKeywords(query, _documentIds -> { + if (_documentIds != null) { + documentIds.addAll(_documentIds); + } + next.run(); + }); + }; + final Utilities.Callback searchEmojiSuggestions = next -> { + if (queryFullyConsistsOfEmojis) { + ArrayList stickerSets = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_EMOJIPACKS); + String emoticon; - for (int i = 0; i < stickerSets.size(); ++i) { - if (stickerSets.get(i).documents == null) { - continue; + for (int i = 0; i < stickerSets.size(); ++i) { + if (stickerSets.get(i).documents == null) { + continue; + } + ArrayList documents = stickerSets.get(i).documents; + if (documents == null) { + continue; + } + for (int j = 0; j < documents.size(); ++j) { + emoticon = MessageObject.findAnimatedEmojiEmoticon(documents.get(j), null); + long id = documents.get(j).id; + if (emoticon != null && !documentIds.contains(id) && query.contains(emoticon.toLowerCase())) { + documentIds.add(id); } - ArrayList documents = stickerSets.get(i).documents; + } + } + + ArrayList featuredStickerSets = MediaDataController.getInstance(currentAccount).getFeaturedEmojiSets(); + for (int i = 0; i < featuredStickerSets.size(); ++i) { + if (featuredStickerSets.get(i) instanceof TLRPC.TL_stickerSetFullCovered && + ((TLRPC.TL_stickerSetFullCovered) featuredStickerSets.get(i)).keywords != null) { + ArrayList documents = ((TLRPC.TL_stickerSetFullCovered) featuredStickerSets.get(i)).documents; if (documents == null) { continue; } for (int j = 0; j < documents.size(); ++j) { emoticon = MessageObject.findAnimatedEmojiEmoticon(documents.get(j), null); - long id = documents.get(j).id; - if (emoticon != null && !documentIds.contains(id) && query.contains(emoticon.toLowerCase())) { + final long id = documents.get(j).id; + if (emoticon != null && !documentIds.contains(id) && query.contains(emoticon)) { documentIds.add(id); } } } + } - ArrayList featuredStickerSets = MediaDataController.getInstance(currentAccount).getFeaturedEmojiSets(); - for (int i = 0; i < featuredStickerSets.size(); ++i) { - if (featuredStickerSets.get(i) instanceof TLRPC.TL_stickerSetFullCovered && - ((TLRPC.TL_stickerSetFullCovered) featuredStickerSets.get(i)).keywords != null) { - ArrayList documents = ((TLRPC.TL_stickerSetFullCovered) featuredStickerSets.get(i)).documents; - if (documents == null) { - continue; - } - for (int j = 0; j < documents.size(); ++j) { - emoticon = MessageObject.findAnimatedEmojiEmoticon(documents.get(j), null); - final long id = documents.get(j).id; - if (emoticon != null && !documentIds.contains(id) && query.contains(emoticon)) { - documentIds.add(id); - } - } - } - } - - next.run(); - } else { - MediaDataController.getInstance(currentAccount).getEmojiSuggestions( - lastSearchKeyboardLanguage, query, false, - (result, alias) -> { - try { - for (int i = 0; i < result.size(); ++i) { - if (result.get(i).emoji.startsWith("animated_")) { - documentIds.add(Long.parseLong(result.get(i).emoji.substring(9))); - } else { - if (type == TYPE_REACTIONS || type == TYPE_TAGS || type == TYPE_SET_DEFAULT_REACTION) { - TLRPC.TL_availableReaction reaction = availableReactions.get(result.get(i).emoji); - if (reaction != null) { - reactions.add(ReactionsLayoutInBubble.VisibleReaction.fromEmojicon(reaction)); - } + next.run(); + } else { + MediaDataController.getInstance(currentAccount).getEmojiSuggestions( + lastSearchKeyboardLanguage, query, false, + (result, alias) -> { + try { + for (int i = 0; i < result.size(); ++i) { + if (result.get(i).emoji.startsWith("animated_")) { + documentIds.add(Long.parseLong(result.get(i).emoji.substring(9))); + } else { + if (type == TYPE_REACTIONS || type == TYPE_TAGS || type == TYPE_SET_DEFAULT_REACTION) { + TLRPC.TL_availableReaction reaction = availableReactions.get(result.get(i).emoji); + if (reaction != null) { + reactions.add(ReactionsLayoutInBubble.VisibleReaction.fromEmojicon(reaction)); } } } - } catch (Exception ignore) { - } - next.run(); - }, - null, true, type == TYPE_TOPIC_ICON, false, 30 - ); - } - }, - next -> { - if (type != TYPE_AVATAR_CONSTRUCTOR) { - next.run(); - return; - } - final ArrayList emojiStickersArray = new ArrayList<>(0); - final LongSparseArray emojiStickersMap = new LongSparseArray<>(0); - HashMap> allStickers = MediaDataController.getInstance(currentAccount).getAllStickers(); - if (query.length() <= 14) { - CharSequence emoji = query; - int length = emoji.length(); - for (int a = 0; a < length; a++) { - if (a < length - 1 && (emoji.charAt(a) == 0xD83C && emoji.charAt(a + 1) >= 0xDFFB && emoji.charAt(a + 1) <= 0xDFFF || emoji.charAt(a) == 0x200D && (emoji.charAt(a + 1) == 0x2640 || emoji.charAt(a + 1) == 0x2642))) { - emoji = TextUtils.concat(emoji.subSequence(0, a), emoji.subSequence(a + 2, emoji.length())); - length -= 2; - a--; - } else if (emoji.charAt(a) == 0xfe0f) { - emoji = TextUtils.concat(emoji.subSequence(0, a), emoji.subSequence(a + 1, emoji.length())); - length--; - a--; - } - } - ArrayList newStickers = allStickers != null ? allStickers.get(emoji.toString()) : null; - if (newStickers != null && !newStickers.isEmpty()) { - emojiStickersArray.addAll(newStickers); - for (int a = 0, size = newStickers.size(); a < size; a++) { - TLRPC.Document document = newStickers.get(a); - emojiStickersMap.put(document.id, document); - } - emojiArrays.add(emojiStickersArray); - } - } - if (allStickers != null && !allStickers.isEmpty() && query.length() > 1) { - MediaDataController.getInstance(currentAccount).getEmojiSuggestions(lastSearchKeyboardLanguage, query, false, (param, alias) -> { - boolean added = false; - for (int a = 0, size = param.size(); a < size; a++) { - String emoji = param.get(a).emoji; - ArrayList newStickers = allStickers != null ? allStickers.get(emoji) : null; - if (newStickers != null && !newStickers.isEmpty()) { - if (!emojiStickers.containsKey(newStickers)) { - emojiStickers.put(newStickers, emoji); - emojiArrays.add(newStickers); } + } catch (Exception ignore) { } - } - next.run(); - }, false); - } - }, - next -> { - ArrayList stickerSets = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_EMOJIPACKS); - final HashSet addedSets = new HashSet<>(); - final String q = translitSafe(query), sq = " " + q; - if (stickerSets != null) { - for (int i = 0; i < stickerSets.size(); ++i) { - TLRPC.TL_messages_stickerSet set = stickerSets.get(i); - if (set == null || set.set == null || set.set.title == null || set.documents == null || addedSets.contains(set.set.id)) continue; - final String title = translitSafe(set.set.title); - if (title.startsWith(q) || title.contains(sq)) { - sets.add(new SetTitleDocument(title)); - sets.addAll(set.documents); - addedSets.add(set.set.id); - } - } - } - ArrayList featuredSets = MediaDataController.getInstance(currentAccount).getFeaturedEmojiSets(); - if (featuredSets != null) { - for (int i = 0; i < featuredSets.size(); ++i) { - TLRPC.StickerSetCovered set = featuredSets.get(i); - if (set == null || set.set == null || set.set.title == null || addedSets.contains(set.set.id)) continue; - final String title = translitSafe(set.set.title); - if (title.startsWith(q) || title.contains(sq)) { - ArrayList documents = null; - if (set instanceof TLRPC.TL_stickerSetNoCovered) { - TLRPC.TL_messages_stickerSet fullSet = MediaDataController.getInstance(currentAccount).getStickerSet(MediaDataController.getInputStickerSet(set.set), set.set.hash, true); - if (fullSet != null) { - documents = fullSet.documents; - } - } else if (set instanceof TLRPC.TL_stickerSetFullCovered) { - documents = ((TLRPC.TL_stickerSetFullCovered) set).documents; - } else { - documents = set.covers; - } - if (documents == null || documents.size() == 0) continue; - sets.add(new SetTitleDocument(set.set.title)); - sets.addAll(documents); - addedSets.add(set.set.id); - } - } - } + next.run(); + }, + null, true, type == TYPE_TOPIC_ICON, false, 30 + ); + } + }; + final Utilities.Callback searchAvatarConstructor = next -> { + if (type != TYPE_AVATAR_CONSTRUCTOR) { next.run(); - }, - next -> AndroidUtilities.runOnUIThread(() -> { - if (clearSearchRunnable != null) { - AndroidUtilities.cancelRunOnUIThread(clearSearchRunnable); - clearSearchRunnable = null; - } - - if (query != lastQuery) { - return; - } - searched = true; - switchGrids(true, liftUp); - if (searchBox != null) { - searchBox.showProgress(false); - } - if (searchResult == null) { - searchResult = new ArrayList<>(); - } else { - searchResult.clear(); - } - if (searchSets == null) { - searchSets = new ArrayList<>(); - } else { - searchSets.clear(); - } - if (stickersSearchResult == null) { - stickersSearchResult = new ArrayList<>(); - } else { - stickersSearchResult.clear(); - } - emojiSearchGridView.scrollToPosition(0); - if (type == TYPE_REACTIONS || type == TYPE_TAGS || type == TYPE_SET_DEFAULT_REACTION) { - if (!reactions.isEmpty()) { - searchResult.addAll(reactions); - } else { - TLRPC.TL_availableReaction reaction = availableReactions.get(query); - if (reaction != null) { - searchResult.add(ReactionsLayoutInBubble.VisibleReaction.fromEmojicon(reaction)); - } + return; + } + final ArrayList emojiStickersArray = new ArrayList<>(0); + final LongSparseArray emojiStickersMap = new LongSparseArray<>(0); + HashMap> allStickers = MediaDataController.getInstance(currentAccount).getAllStickers(); + if (query.length() <= 14) { + CharSequence emoji = query; + int length = emoji.length(); + for (int a = 0; a < length; a++) { + if (a < length - 1 && (emoji.charAt(a) == 0xD83C && emoji.charAt(a + 1) >= 0xDFFB && emoji.charAt(a + 1) <= 0xDFFF || emoji.charAt(a) == 0x200D && (emoji.charAt(a + 1) == 0x2640 || emoji.charAt(a + 1) == 0x2642))) { + emoji = TextUtils.concat(emoji.subSequence(0, a), emoji.subSequence(a + 2, emoji.length())); + length -= 2; + a--; + } else if (emoji.charAt(a) == 0xfe0f) { + emoji = TextUtils.concat(emoji.subSequence(0, a), emoji.subSequence(a + 1, emoji.length())); + length--; + a--; } } - for (long documentId : documentIds) { - searchResult.add(ReactionsLayoutInBubble.VisibleReaction.fromCustomEmoji(documentId)); + ArrayList newStickers = allStickers != null ? allStickers.get(emoji.toString()) : null; + if (newStickers != null && !newStickers.isEmpty()) { + emojiStickersArray.addAll(newStickers); + for (int a = 0, size = newStickers.size(); a < size; a++) { + TLRPC.Document document = newStickers.get(a); + emojiStickersMap.put(document.id, document); + } + emojiArrays.add(emojiStickersArray); } - searchSets.addAll(sets); - for (ArrayList array : emojiArrays) { - stickersSearchResult.addAll(array); + } + if (allStickers != null && !allStickers.isEmpty() && query.length() > 1) { + MediaDataController.getInstance(currentAccount).getEmojiSuggestions(lastSearchKeyboardLanguage, query, false, (param, alias) -> { + boolean added = false; + for (int a = 0, size = param.size(); a < size; a++) { + String emoji = param.get(a).emoji; + ArrayList newStickers = allStickers != null ? allStickers.get(emoji) : null; + if (newStickers != null && !newStickers.isEmpty()) { + if (!emojiStickers.containsKey(newStickers)) { + emojiStickers.put(newStickers, emoji); + emojiArrays.add(newStickers); + } + } + } + next.run(); + }, false); + } + }; + final Utilities.Callback searchFromSets = next -> { + ArrayList stickerSets = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_EMOJIPACKS); + final HashSet addedSets = new HashSet<>(); + final String q = translitSafe(query), sq = " " + q; + if (stickerSets != null) { + for (int i = 0; i < stickerSets.size(); ++i) { + TLRPC.TL_messages_stickerSet set = stickerSets.get(i); + if (set == null || set.set == null || set.set.title == null || set.documents == null || addedSets.contains(set.set.id)) continue; + final String title = translitSafe(set.set.title); + if (title.startsWith(q) || title.contains(sq)) { + sets.add(new SetTitleDocument(title)); + sets.addAll(set.documents); + addedSets.add(set.set.id); + } } - searchAdapter.updateRows(!firstSearch); - }) - ); + } + ArrayList featuredSets = MediaDataController.getInstance(currentAccount).getFeaturedEmojiSets(); + if (featuredSets != null) { + for (int i = 0; i < featuredSets.size(); ++i) { + TLRPC.StickerSetCovered set = featuredSets.get(i); + if (set == null || set.set == null || set.set.title == null || addedSets.contains(set.set.id)) continue; + final String title = translitSafe(set.set.title); + if (title.startsWith(q) || title.contains(sq)) { + ArrayList documents = null; + if (set instanceof TLRPC.TL_stickerSetNoCovered) { + TLRPC.TL_messages_stickerSet fullSet = MediaDataController.getInstance(currentAccount).getStickerSet(MediaDataController.getInputStickerSet(set.set), set.set.hash, true); + if (fullSet != null) { + documents = fullSet.documents; + } + } else if (set instanceof TLRPC.TL_stickerSetFullCovered) { + documents = ((TLRPC.TL_stickerSetFullCovered) set).documents; + } else { + documents = set.covers; + } + if (documents == null || documents.size() == 0) continue; + sets.add(new SetTitleDocument(set.set.title)); + sets.addAll(documents); + addedSets.add(set.set.id); + } + } + } + next.run(); + }; + + Utilities.doCallbacks(searchCategories, searchByKeywords, searchEmojiSuggestions, searchAvatarConstructor, searchFromSets, applySearch); + } }, delay ? 425 : 0); if (searchBox != null) { searchBox.showProgress(true); @@ -1902,6 +1969,26 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati updateSearchBox(); } + public static TLRPC.Document findSticker(TLRPC.TL_messages_stickerSet set, String emoji) { + if (set == null) return null; + final String q = Emoji.fixEmoji(emoji); + long documentId = 0; + for (int i = 0; i < set.packs.size(); ++i) { + if (!set.packs.get(i).documents.isEmpty() && TextUtils.equals(Emoji.fixEmoji(set.packs.get(i).emoticon), q)) { + documentId = set.packs.get(i).documents.get(0); + break; + } + } + if (documentId == 0) return null; + for (int i = 0; i < set.documents.size(); ++i) { + TLRPC.Document d = set.documents.get(i); + if (d.id == documentId) { + return d; + } + } + return null; + } + private class SearchAdapter extends RecyclerListView.SelectionAdapter { public final static int VIEW_TYPE_SEARCH = 7; @@ -2464,6 +2551,10 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati if (imageView.imageReceiver != null) { imageView.imageReceiver.clearImage(); } + } else if (type == TYPE_STICKER_SET_EMOJI && position - (searchRow != -1 ? 1 : 0) - (longtapHintRow != -1 ? 1 : 0) < standardEmojis.size()) { + int pos = position - (searchRow != -1 ? 1 : 0) - (longtapHintRow != -1 ? 1 : 0) - (includeEmpty ? 1 : 0); + TLRPC.Document document = standardEmojis.get(pos); + imageView.setSticker(document, emojiGridView); } else if (position - (searchRow != -1 ? 1 : 0) - (longtapHintRow != -1 ? 1 : 0) < recentSize) { int resentPosition = position - (searchRow != -1 ? 1 : 0) - (longtapHintRow != -1 ? 1 : 0) - (includeEmpty ? 1 : 0); if (type == TYPE_AVATAR_CONSTRUCTOR && showStickers) { @@ -3066,11 +3157,17 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati public void setSticker(TLRPC.Document document, View parent) { this.document = document; createImageReceiver(parent); - SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(document, Theme.key_windowBackgroundWhiteGrayIcon, 0.2f); + Drawable thumb = null; +// if (type == TYPE_STICKER_SET_EMOJI) { +// thumb = Emoji.getEmojiDrawable(MessageObject.findAnimatedEmojiEmoticon(document, null)); +// } + if (thumb == null) { + thumb = DocumentObject.getSvgThumb(document, Theme.key_windowBackgroundWhiteGrayIcon, 0.2f); + } if (type == TYPE_CHAT_REACTIONS) { - imageReceiver.setImage(ImageLocation.getForDocument(document), !LiteMode.isEnabled(LiteMode.FLAG_ANIMATED_EMOJI_KEYBOARD) ? "34_34_firstframe" : "34_34", null, null, svgThumb, document.size, null, document, 0); + imageReceiver.setImage(ImageLocation.getForDocument(document), !LiteMode.isEnabled(LiteMode.FLAG_ANIMATED_EMOJI_KEYBOARD) ? "34_34_firstframe" : "34_34", null, null, thumb, document.size, null, document, 0); } else { - imageReceiver.setImage(ImageLocation.getForDocument(document), "100_100_firstframe", null, null, svgThumb, 0, "tgs", document, 0); + imageReceiver.setImage(ImageLocation.getForDocument(document), "100_100_firstframe", null, null, thumb, 0, "tgs", document, 0); } isStaticIcon = true; span = null; @@ -3165,7 +3262,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati return; } MediaDataController.getInstance(account).checkStickers(MediaDataController.TYPE_EMOJIPACKS); - if (type == TYPE_REACTIONS || type == TYPE_TAGS || type == TYPE_SET_DEFAULT_REACTION || type == TYPE_CHAT_REACTIONS) { + if (type == TYPE_REACTIONS || type == TYPE_TAGS || type == TYPE_SET_DEFAULT_REACTION || type == TYPE_CHAT_REACTIONS || type == TYPE_STICKER_SET_EMOJI) { MediaDataController.getInstance(account).checkReactions(); } else if (type == TYPE_EMOJI_STATUS_CHANNEL || type == TYPE_EMOJI_STATUS_CHANNEL_TOP) { if (MessagesController.getInstance(account).getMainSettings().getBoolean("resetemojipacks", true)) { @@ -3244,6 +3341,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati positionToButton.clear(); stickerSets.clear(); recentStickers.clear(); + standardEmojis.clear(); if ((!installedEmojipacks.isEmpty() || type == TYPE_AVATAR_CONSTRUCTOR) && type != TYPE_SET_REPLY_ICON && type != TYPE_SET_REPLY_ICON_BOTTOM && type != TYPE_CHAT_REACTIONS && type != TYPE_EXPANDABLE_REACTIONS) { searchRow = totalCount++; @@ -3336,7 +3434,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati } - if (includeHint && type != TYPE_SET_DEFAULT_REACTION && type != TYPE_TAGS && type != TYPE_TOPIC_ICON && type != TYPE_CHAT_REACTIONS && type != TYPE_EXPANDABLE_REACTIONS && type != TYPE_AVATAR_CONSTRUCTOR && type != TYPE_SET_REPLY_ICON && type != TYPE_SET_REPLY_ICON_BOTTOM) { + if (includeHint && type != TYPE_STICKER_SET_EMOJI && type != TYPE_SET_DEFAULT_REACTION && type != TYPE_TAGS && type != TYPE_TOPIC_ICON && type != TYPE_CHAT_REACTIONS && type != TYPE_EXPANDABLE_REACTIONS && type != TYPE_AVATAR_CONSTRUCTOR && type != TYPE_SET_REPLY_ICON && type != TYPE_SET_REPLY_ICON_BOTTOM) { longtapHintRow = totalCount++; rowHashCodes.add(6L); } @@ -3352,7 +3450,10 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati if (recentReactionsToSet != null) { topReactionsStartRow = totalCount; ArrayList tmp = new ArrayList<>(recentReactionsToSet); - if (type == TYPE_EXPANDABLE_REACTIONS || type == TYPE_TAGS) { + if (type == TYPE_STICKER_SET_EMOJI && tmp.size() > 8) { + tmp.removeAll(tmp.subList(8, tmp.size())); + } + if (type == TYPE_EXPANDABLE_REACTIONS || type == TYPE_TAGS || type == TYPE_STICKER_SET_EMOJI) { topReactions.addAll(tmp); } else { for (int i = 0; i < 16; i++) { @@ -3367,7 +3468,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati totalCount += topReactions.size(); topReactionsEndRow = totalCount; - if (!tmp.isEmpty() && type != TYPE_EXPANDABLE_REACTIONS && type != TYPE_TAGS) { + if (!tmp.isEmpty() && type != TYPE_EXPANDABLE_REACTIONS && type != TYPE_TAGS && type != TYPE_STICKER_SET_EMOJI) { boolean allRecentReactionsIsDefault = true; for (int i = 0; i < tmp.size(); i++) { if (tmp.get(i).documentId != 0) { @@ -3482,7 +3583,26 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati } } } - if (installedEmojipacks != null && type != TYPE_EXPANDABLE_REACTIONS) { + if (type == TYPE_STICKER_SET_EMOJI) { +// TLRPC.TL_inputStickerSetShortName inputStickerSetShortName = new TLRPC.TL_inputStickerSetShortName(); +// inputStickerSetShortName.short_name = "RestrictedEmoji"; +// TLRPC.TL_messages_stickerSet restrictedSet = mediaDataController.getStickerSet(inputStickerSetShortName, 0, false); + + TLRPC.TL_inputStickerSetShortName inputStickerSetShortName2 = new TLRPC.TL_inputStickerSetShortName(); + inputStickerSetShortName2.short_name = "StaticEmoji"; + TLRPC.TL_messages_stickerSet staticSet = mediaDataController.getStickerSet(inputStickerSetShortName2, 0, false); + + TLRPC.TL_messages_stickerSet baseSet = staticSet; // staticSet != null ? staticSet : restrictedSet; + + if (baseSet != null) { + for (TLRPC.Document d : baseSet.documents) { + standardEmojis.add(d); + rowHashCodes.add(43223 + 13L * d.id); + totalCount++; + } + } + } + if (installedEmojipacks != null && type != TYPE_EXPANDABLE_REACTIONS && type != TYPE_STICKER_SET_EMOJI) { for (int i = 0, j = 0; i < installedEmojipacks.size(); ++i) { TLRPC.TL_messages_stickerSet set = installedEmojipacks.get(i); if (set == null || set.set == null) { @@ -3517,7 +3637,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati } } } - if (featuredEmojiPacks != null && !showStickers && type != TYPE_EXPANDABLE_REACTIONS) { + if (featuredEmojiPacks != null && !showStickers && type != TYPE_EXPANDABLE_REACTIONS && type != TYPE_STICKER_SET_EMOJI) { final int maxlen = SPAN_COUNT_FOR_EMOJI * EXPAND_MAX_LINES; for (int i = 0; i < featuredEmojiPacks.size(); ++i) { TLRPC.StickerSetCovered set1 = featuredEmojiPacks.get(i); @@ -3595,7 +3715,7 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati } } - if (type != TYPE_EXPANDABLE_REACTIONS) { + if (type != TYPE_EXPANDABLE_REACTIONS && type != TYPE_STICKER_SET_EMOJI) { emojiTabs.updateEmojiPacks(packs); } @@ -3733,6 +3853,10 @@ public class SelectAnimatedEmojiDialog extends FrameLayout implements Notificati } private int getCacheType() { +// if (type == TYPE_STICKER_SET_EMOJI) { +// return AnimatedEmojiDrawable.CACHE_TYPE_ALERT_STANDARD_EMOJI; +// } + if (type == TYPE_SET_REPLY_ICON || type == TYPE_SET_REPLY_ICON_BOTTOM) { return AnimatedEmojiDrawable.CACHE_TYPE_ALERT_PREVIEW_STATIC; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java index 0cd503aa9..0ee0d6819 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/StatisticActivity.java @@ -3,6 +3,9 @@ package org.telegram.ui; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; +import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.getString; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; @@ -35,6 +38,7 @@ import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import org.checkerframework.checker.units.qual.A; import org.json.JSONException; import org.json.JSONObject; import org.telegram.messenger.AndroidUtilities; @@ -47,9 +51,11 @@ import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; +import org.telegram.tgnet.tl.TL_stats; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BackDrawable; @@ -78,6 +84,7 @@ import org.telegram.ui.Charts.view_data.ChartHeaderView; import org.telegram.ui.Charts.view_data.LineViewData; import org.telegram.ui.Charts.view_data.TransitionParams; import org.telegram.ui.Components.BottomPagerTabs; +import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.ChatAvatarContainer; import org.telegram.ui.Components.CombinedDrawable; @@ -87,9 +94,11 @@ import org.telegram.ui.Components.Premium.boosts.BoostDialogs; import org.telegram.ui.Components.RLottieImageView; import org.telegram.ui.Components.RadialProgressView; import org.telegram.ui.Components.RecyclerListView; +import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.Components.ViewPagerFixed; import org.telegram.ui.Stories.StoriesController; import org.telegram.ui.Stories.StoriesListPlaceProvider; +import org.telegram.ui.Stories.recorder.KeyboardNotifier; import java.util.ArrayList; import java.util.Arrays; @@ -170,6 +179,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente private AlertDialog[] progressDialog = new AlertDialog[1]; private ViewPagerFixed viewPagerFixed; private ChannelBoostLayout boostLayout; + private ChannelMonetizationLayout monetizationLayout; private boolean onlyBoostsStat; public StatisticActivity(Bundle args) { @@ -235,32 +245,32 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } TLObject req; if (isMegagroup) { - TLRPC.TL_stats_getMegagroupStats getMegagroupStats = new TLRPC.TL_stats_getMegagroupStats(); + TL_stats.TL_getMegagroupStats getMegagroupStats = new TL_stats.TL_getMegagroupStats(); req = getMegagroupStats; getMegagroupStats.channel = MessagesController.getInstance(currentAccount).getInputChannel(chatId); } else { - TLRPC.TL_stats_getBroadcastStats getBroadcastStats = new TLRPC.TL_stats_getBroadcastStats(); + TL_stats.TL_getBroadcastStats getBroadcastStats = new TL_stats.TL_getBroadcastStats(); req = getBroadcastStats; getBroadcastStats.channel = MessagesController.getInstance(currentAccount).getInputChannel(chatId); } int reqId = getConnectionsManager().sendRequest(req, (response, error) -> { - if (response instanceof TLRPC.TL_stats_broadcastStats) { + if (response instanceof TL_stats.TL_broadcastStats) { final ChartViewData[] chartsViewData = new ChartViewData[12]; - TLRPC.TL_stats_broadcastStats stats = (TLRPC.TL_stats_broadcastStats) response; + TL_stats.TL_broadcastStats stats = (TL_stats.TL_broadcastStats) response; - chartsViewData[0] = createViewData(stats.iv_interactions_graph, LocaleController.getString("IVInteractionsChartTitle", R.string.IVInteractionsChartTitle), 1); - chartsViewData[1] = createViewData(stats.followers_graph, LocaleController.getString("FollowersChartTitle", R.string.FollowersChartTitle), 0); - chartsViewData[2] = createViewData(stats.top_hours_graph, LocaleController.getString("TopHoursChartTitle", R.string.TopHoursChartTitle), 0); - chartsViewData[3] = createViewData(stats.interactions_graph, LocaleController.getString("ViewsAndSharesChartTitle", R.string.ViewsAndSharesChartTitle), 1); - chartsViewData[4] = createViewData(stats.growth_graph, LocaleController.getString("GrowthChartTitle", R.string.GrowthChartTitle), 0); - chartsViewData[5] = createViewData(stats.views_by_source_graph, LocaleController.getString("ViewsBySourceChartTitle", R.string.ViewsBySourceChartTitle), 2); - chartsViewData[6] = createViewData(stats.new_followers_by_source_graph, LocaleController.getString("NewFollowersBySourceChartTitle", R.string.NewFollowersBySourceChartTitle), 2); - chartsViewData[7] = createViewData(stats.languages_graph, LocaleController.getString("LanguagesChartTitle", R.string.LanguagesChartTitle), 4, true); - chartsViewData[8] = createViewData(stats.mute_graph, LocaleController.getString("NotificationsChartTitle", R.string.NotificationsChartTitle), 0); - chartsViewData[9] = createViewData(stats.reactions_by_emotion_graph, LocaleController.getString("ReactionsByEmotionChartTitle", R.string.ReactionsByEmotionChartTitle), 2); - chartsViewData[10] = createViewData(stats.story_interactions_graph, LocaleController.getString("StoryInteractionsChartTitle", R.string.StoryInteractionsChartTitle), 1); - chartsViewData[11] = createViewData(stats.story_reactions_by_emotion_graph, LocaleController.getString("StoryReactionsByEmotionChartTitle", R.string.StoryReactionsByEmotionChartTitle), 2); + chartsViewData[0] = createViewData(stats.iv_interactions_graph, getString("IVInteractionsChartTitle", R.string.IVInteractionsChartTitle), 1); + chartsViewData[1] = createViewData(stats.followers_graph, getString("FollowersChartTitle", R.string.FollowersChartTitle), 0); + chartsViewData[2] = createViewData(stats.top_hours_graph, getString("TopHoursChartTitle", R.string.TopHoursChartTitle), 0); + chartsViewData[3] = createViewData(stats.interactions_graph, getString("ViewsAndSharesChartTitle", R.string.ViewsAndSharesChartTitle), 1); + chartsViewData[4] = createViewData(stats.growth_graph, getString("GrowthChartTitle", R.string.GrowthChartTitle), 0); + chartsViewData[5] = createViewData(stats.views_by_source_graph, getString("ViewsBySourceChartTitle", R.string.ViewsBySourceChartTitle), 2); + chartsViewData[6] = createViewData(stats.new_followers_by_source_graph, getString("NewFollowersBySourceChartTitle", R.string.NewFollowersBySourceChartTitle), 2); + chartsViewData[7] = createViewData(stats.languages_graph, getString("LanguagesChartTitle", R.string.LanguagesChartTitle), 4, true); + chartsViewData[8] = createViewData(stats.mute_graph, getString("NotificationsChartTitle", R.string.NotificationsChartTitle), 0); + chartsViewData[9] = createViewData(stats.reactions_by_emotion_graph, getString("ReactionsByEmotionChartTitle", R.string.ReactionsByEmotionChartTitle), 2); + chartsViewData[10] = createViewData(stats.story_interactions_graph, getString("StoryInteractionsChartTitle", R.string.StoryInteractionsChartTitle), 1); + chartsViewData[11] = createViewData(stats.story_reactions_by_emotion_graph, getString("StoryReactionsByEmotionChartTitle", R.string.StoryReactionsByEmotionChartTitle), 2); if (chartsViewData[2] != null) { chartsViewData[2].useHourFormat = true; @@ -275,16 +285,16 @@ public class StatisticActivity extends BaseFragment implements NotificationCente int msgPos = 0; int storiesPos = 0; List storiesIds = new ArrayList<>(); - for (TLRPC.PostInteractionCounters interactionCounters : stats.recent_posts_interactions) { + for (TL_stats.PostInteractionCounters interactionCounters : stats.recent_posts_interactions) { RecentPostInfo recentPostInfo = new RecentPostInfo(); recentPostInfo.counters = interactionCounters; - if (interactionCounters instanceof TLRPC.TL_postInteractionCountersMessage) { + if (interactionCounters instanceof TL_stats.TL_postInteractionCountersMessage) { recentPostsAll.add(recentPostInfo); recentPostIdtoIndexMap.put(recentPostInfo.getId(), msgPos); msgPos++; } - if (interactionCounters instanceof TLRPC.TL_postInteractionCountersStory) { + if (interactionCounters instanceof TL_stats.TL_postInteractionCountersStory) { storiesIds.add(recentPostInfo.getId()); recentStoriesAll.add(recentPostInfo); recentStoriesIdtoIndexMap.put(recentPostInfo.getId(), storiesPos); @@ -326,18 +336,18 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } - if (response instanceof TLRPC.TL_stats_megagroupStats) { + if (response instanceof TL_stats.TL_megagroupStats) { final ChartViewData[] chartsViewData = new ChartViewData[8]; - TLRPC.TL_stats_megagroupStats stats = (TLRPC.TL_stats_megagroupStats) response; + TL_stats.TL_megagroupStats stats = (TL_stats.TL_megagroupStats) response; - chartsViewData[0] = createViewData(stats.growth_graph, LocaleController.getString("GrowthChartTitle", R.string.GrowthChartTitle), 0); - chartsViewData[1] = createViewData(stats.members_graph, LocaleController.getString("GroupMembersChartTitle", R.string.GroupMembersChartTitle), 0); - chartsViewData[2] = createViewData(stats.new_members_by_source_graph, LocaleController.getString("NewMembersBySourceChartTitle", R.string.NewMembersBySourceChartTitle), 2); - chartsViewData[3] = createViewData(stats.languages_graph, LocaleController.getString("MembersLanguageChartTitle", R.string.MembersLanguageChartTitle), 4, true); - chartsViewData[4] = createViewData(stats.messages_graph, LocaleController.getString("MessagesChartTitle", R.string.MessagesChartTitle), 2); - chartsViewData[5] = createViewData(stats.actions_graph, LocaleController.getString("ActionsChartTitle", R.string.ActionsChartTitle), 1); - chartsViewData[6] = createViewData(stats.top_hours_graph, LocaleController.getString("TopHoursChartTitle", R.string.TopHoursChartTitle), 0); - chartsViewData[7] = createViewData(stats.weekdays_graph, LocaleController.getString("TopDaysOfWeekChartTitle", R.string.TopDaysOfWeekChartTitle), 4); + chartsViewData[0] = createViewData(stats.growth_graph, getString("GrowthChartTitle", R.string.GrowthChartTitle), 0); + chartsViewData[1] = createViewData(stats.members_graph, getString("GroupMembersChartTitle", R.string.GroupMembersChartTitle), 0); + chartsViewData[2] = createViewData(stats.new_members_by_source_graph, getString("NewMembersBySourceChartTitle", R.string.NewMembersBySourceChartTitle), 2); + chartsViewData[3] = createViewData(stats.languages_graph, getString("MembersLanguageChartTitle", R.string.MembersLanguageChartTitle), 4, true); + chartsViewData[4] = createViewData(stats.messages_graph, getString("MessagesChartTitle", R.string.MessagesChartTitle), 2); + chartsViewData[5] = createViewData(stats.actions_graph, getString("ActionsChartTitle", R.string.ActionsChartTitle), 1); + chartsViewData[6] = createViewData(stats.top_hours_graph, getString("TopHoursChartTitle", R.string.TopHoursChartTitle), 0); + chartsViewData[7] = createViewData(stats.weekdays_graph, getString("TopDaysOfWeekChartTitle", R.string.TopDaysOfWeekChartTitle), 4); if (chartsViewData[6] != null) { chartsViewData[6].useHourFormat = true; @@ -415,12 +425,27 @@ public class StatisticActivity extends BaseFragment implements NotificationCente for (ChartViewData data : chartsViewData) { if (data != null && data.chartData == null && data.token != null) { - data.load(currentAccount, classGuid, chat.stats_dc, recyclerListView, adapter, diffUtilsCallback); + data.load(currentAccount, classGuid, chat.stats_dc, getFindChartCell(data)); } } } } + private Utilities.Callback0Return getFindChartCell(ChartViewData data) { + return () -> { + int n = recyclerListView.getChildCount(); + for (int i = 0; i < n; i++) { + View child = recyclerListView.getChildAt(i); + if (child instanceof ChartCell && ((ChartCell) child).data == data) { + return (ChartCell) child; + } + } + recyclerListView.setItemAnimator(null); + diffUtilsCallback.update(); + return null; + }; + } + @Override public void onFragmentDestroy() { getNotificationCenter().removeObserver(this, NotificationCenter.boostByChannelCreated); @@ -545,20 +570,19 @@ public class StatisticActivity extends BaseFragment implements NotificationCente public View createView(Context context) { sharedUi = new BaseChartView.SharedUiComponents(); TLRPC.Chat currentChat = MessagesController.getInstance(currentAccount).getChat(chatId); + TLRPC.ChatFull chatFull = MessagesController.getInstance(currentAccount).getChatFull(chatId); boolean isBoostSupported = ChatObject.isBoostSupported(currentChat); + final boolean hasMonetization = ChatObject.isChannelAndNotMegaGroup(currentChat) && chatFull != null && chatFull.can_view_revenue; BottomPagerTabs storiesTabsView = new BottomPagerTabs(context, getResourceProvider()) { @Override public Tab[] createTabs() { - Tab[] tabs = new Tab[]{ - new Tab(0, R.raw.stats, LocaleController.getString("Statistics", R.string.Statistics)), - new Tab(1, R.raw.boosts, LocaleController.getString("Boosts", R.string.Boosts)) - }; - tabs[0].customFrameInvert = true; - tabs[0].customEndFrameMid = 25; - tabs[0].customEndFrameEnd = 49; - tabs[1].customEndFrameMid = 25; - tabs[1].customEndFrameEnd = 49; - return tabs; + ArrayList tabs = new ArrayList<>(); + tabs.add(new Tab(0, R.raw.stats, 25, 49, getString(R.string.Statistics)).customFrameInvert()); + tabs.add(new Tab(1, R.raw.boosts, 25, 49, getString(R.string.Boosts))); + if (hasMonetization) { + tabs.add(new Tab(2, R.raw.monetize, 19, 45, getString(R.string.Monetization))); + } + return tabs.toArray(new Tab[0]); } }; @@ -568,12 +592,8 @@ public class StatisticActivity extends BaseFragment implements NotificationCente if (manual) { return; } - float progress = currentProgress; - if (currentPosition == 0) { - progress = 1f - progress; - } storiesTabsView.setScrolling(true); - storiesTabsView.setProgress(progress); + storiesTabsView.setProgress(viewPagerFixed.getPositionAnimated()); } }; @@ -587,6 +607,9 @@ public class StatisticActivity extends BaseFragment implements NotificationCente if (isBoostSupported) { boostLayout = new ChannelBoostLayout(StatisticActivity.this, -chatId, getResourceProvider()); } + if (hasMonetization) { + monetizationLayout = new ChannelMonetizationLayout(getContext(), StatisticActivity.this, currentAccount, -chatId, getResourceProvider()); + } boolean showTabs = isBoostSupported && !onlyBoostsStat; if (showTabs && startFromBoosts) { viewPagerFixed.setPosition(1); @@ -594,21 +617,32 @@ public class StatisticActivity extends BaseFragment implements NotificationCente viewPagerFixed.setAdapter(new ViewPagerFixed.Adapter() { @Override public int getItemCount() { - if (onlyBoostsStat) { - return 1; + int count = onlyBoostsStat ? 1 : 1 + (isBoostSupported ? 1 : 0); + if (hasMonetization) { + count++; } - if (isBoostSupported) { - return 2; - } - return 1; + return count; } @Override public View createView(int viewType) { - if (onlyBoostsStat) { - return boostLayout; + if (viewType == 0) { + return statisticLayout; } - return viewType == 0 ? statisticLayout : boostLayout; + viewType--; + if (viewType == 0) { + if (!onlyBoostsStat && isBoostSupported) { + return boostLayout; + } else { + return monetizationLayout; + } + } else { + viewType--; + } + if (viewType == 0) { + return monetizationLayout; + } + return statisticLayout; } @Override @@ -623,11 +657,22 @@ public class StatisticActivity extends BaseFragment implements NotificationCente }); - FrameLayout contentLayout = new FrameLayout(getContext()); + FrameLayout contentLayout = new SizeNotifierFrameLayout(getContext()); contentLayout.addView(viewPagerFixed, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0, 0, 0, 0, showTabs ? 64 : 0)); if (showTabs) { contentLayout.addView(storiesTabsView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL)); + Bulletin.addDelegate(this, new Bulletin.Delegate() { + @Override + public int getBottomOffset(int tag) { + return dp(64); + } + }); } + new KeyboardNotifier(contentLayout, keyboardHeight -> { + if (storiesTabsView != null) { + storiesTabsView.setVisibility(keyboardHeight > dp(20) ? View.GONE : View.VISIBLE); + } + }); fragmentView = contentLayout; recyclerListView = new RecyclerListView(context) { int lastH; @@ -652,17 +697,17 @@ public class StatisticActivity extends BaseFragment implements NotificationCente TextView loadingTitle = new TextView(context); loadingTitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - loadingTitle.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + loadingTitle.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); loadingTitle.setTextColor(Theme.getColor(Theme.key_player_actionBarTitle)); loadingTitle.setTag(Theme.key_player_actionBarTitle); - loadingTitle.setText(LocaleController.getString("LoadingStats", R.string.LoadingStats)); + loadingTitle.setText(getString("LoadingStats", R.string.LoadingStats)); loadingTitle.setGravity(Gravity.CENTER_HORIZONTAL); TextView loadingSubtitle = new TextView(context); loadingSubtitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); loadingSubtitle.setTextColor(Theme.getColor(Theme.key_player_actionBarSubtitle)); loadingSubtitle.setTag(Theme.key_player_actionBarSubtitle); - loadingSubtitle.setText(LocaleController.getString("LoadingStatsDescription", R.string.LoadingStatsDescription)); + loadingSubtitle.setText(getString("LoadingStatsDescription", R.string.LoadingStatsDescription)); loadingSubtitle.setGravity(Gravity.CENTER_HORIZONTAL); progressLayout.addView(imageView, LayoutHelper.createLinear(120, 120, Gravity.CENTER_HORIZONTAL, 0, 0, 0, 20)); @@ -737,11 +782,11 @@ public class StatisticActivity extends BaseFragment implements NotificationCente final ArrayList actions = new ArrayList<>(); final ArrayList icons = new ArrayList<>(); - items.add(LocaleController.getString("ViewMessageStatistic", R.string.ViewMessageStatistic)); + items.add(getString("ViewMessageStatistic", R.string.ViewMessageStatistic)); actions.add(0); icons.add(R.drawable.msg_stats); - items.add(LocaleController.getString("ViewMessage", R.string.ViewMessage)); + items.add(getString("ViewMessage", R.string.ViewMessage)); actions.add(1); icons.add(R.drawable.msg_msgbubble3); @@ -785,7 +830,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente avatarContainer.setOccupyStatusBar(!AndroidUtilities.isTablet()); avatarContainer.getAvatarImageView().setScaleX(0.9f); avatarContainer.getAvatarImageView().setScaleY(0.9f); - avatarContainer.setRightAvatarPadding(-AndroidUtilities.dp(3)); + avatarContainer.setRightAvatarPadding(-dp(3)); actionBar.addView(avatarContainer, 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, !inPreviewMode ? 50 : 0, 0, 40, 0)); TLRPC.Chat chatLocal = getMessagesController().getChat(chatId); @@ -826,17 +871,20 @@ public class StatisticActivity extends BaseFragment implements NotificationCente return fragmentView; } - public static ChartViewData createViewData(TLRPC.StatsGraph graph, String title, int graphType, boolean isLanguages) { - if (graph == null || graph instanceof TLRPC.TL_statsGraphError) { + public static ChartViewData createViewData(TL_stats.StatsGraph graph, String title, int graphType, boolean isLanguages) { + if (graph == null || graph instanceof TL_stats.TL_statsGraphError) { return null; } ChartViewData viewData = new ChartViewData(title, graphType); viewData.isLanguages = isLanguages; - if (graph instanceof TLRPC.TL_statsGraph) { - String json = ((TLRPC.TL_statsGraph) graph).json.data; + if (graph instanceof TL_stats.TL_statsGraph) { + String json = ((TL_stats.TL_statsGraph) graph).json.data; try { viewData.chartData = createChartData(new JSONObject(json), graphType, isLanguages); - viewData.zoomToken = ((TLRPC.TL_statsGraph) graph).zoom_token; + if (viewData.chartData != null) { + viewData.chartData.yRate = graph.rate; + } + viewData.zoomToken = ((TL_stats.TL_statsGraph) graph).zoom_token; if (viewData.chartData == null || viewData.chartData.x == null || viewData.chartData.x.length < 2) { viewData.isEmpty = true; } @@ -849,14 +897,14 @@ public class StatisticActivity extends BaseFragment implements NotificationCente e.printStackTrace(); return null; } - } else if (graph instanceof TLRPC.TL_statsGraphAsync) { - viewData.token = ((TLRPC.TL_statsGraphAsync) graph).token; + } else if (graph instanceof TL_stats.TL_statsGraphAsync) { + viewData.token = ((TL_stats.TL_statsGraphAsync) graph).token; } return viewData; } - private static ChartViewData createViewData(TLRPC.StatsGraph graph, String title, int graphType) { + public static ChartViewData createViewData(TL_stats.StatsGraph graph, String title, int graphType) { return createViewData(graph, title, graphType, false); } @@ -873,6 +921,11 @@ public class StatisticActivity extends BaseFragment implements NotificationCente return null; } + public static final int VIEW_TYPE_LINEAR = 0; + public static final int VIEW_TYPE_DOUBLE_LINEAR = 1; + public static final int VIEW_TYPE_STACKBAR = 2; + public static final int VIEW_TYPE_STACKLINEAR = 4; + class Adapter extends RecyclerListView.SelectionAdapter { int overviewHeaderCell = -1; @@ -924,13 +977,13 @@ public class StatisticActivity extends BaseFragment implements NotificationCente @Override public int getItemViewType(int position) { if (position == growCell || position == folowersCell || position == topHourseCell || position == notificationsCell || position == actionsCell || position == groupMembersCell) { - return 0; + return VIEW_TYPE_LINEAR; } else if (position == interactionsCell || position == ivInteractionsCell || position == storyInteractionsCell) { - return 1; + return VIEW_TYPE_DOUBLE_LINEAR; } else if (position == viewsBySourceCell || position == newFollowersBySourceCell || position == newMembersBySourceCell || position == messagesCell || position == reactionsByEmotionCell || position == storyReactionsByEmotionCell) { - return 2; + return VIEW_TYPE_STACKBAR; } else if (position == languagesCell || position == membersLanguageCell || position == topDayOfWeeksCell) { - return 4; + return VIEW_TYPE_STACKLINEAR; } else if (position >= recentPostsStartRow && position <= recentPostsEndRow) { return 9; } else if (position == progressCell) { @@ -1002,7 +1055,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View v; if (viewType >= 0 && viewType <= 4) { - v = new ChartCell(parent.getContext(), viewType, sharedUi) { + v = new ChartCell(parent.getContext(), currentAccount, viewType, sharedUi) { @Override protected void onDraw(Canvas canvas) { if (getTranslationY() != 0) { @@ -1027,7 +1080,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente v = new LoadingCell(parent.getContext()); v.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); } else if (viewType == 12) { - v = new EmptyCell(parent.getContext(), AndroidUtilities.dp(15)); + v = new EmptyCell(parent.getContext(), dp(15)); } else if (viewType == 13) { ChartHeaderView headerCell = new ChartHeaderView(parent.getContext()) { @Override @@ -1039,7 +1092,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } }; headerCell.setWillNotDraw(false); - headerCell.setPadding(headerCell.getPaddingLeft(), AndroidUtilities.dp(16), headerCell.getRight(), AndroidUtilities.dp(16)); + headerCell.setPadding(headerCell.getPaddingLeft(), dp(16), headerCell.getRight(), dp(16)); v = headerCell; } else if (viewType == 14) { v = new OverviewCell(parent.getContext(), isMegagroup ? 2 : 4); @@ -1124,19 +1177,19 @@ public class StatisticActivity extends BaseFragment implements NotificationCente ChartHeaderView headerCell = (ChartHeaderView) holder.itemView; headerCell.showDate(true); headerCell.setDates(minDateOverview, maxDateOverview); - headerCell.setPadding(0, AndroidUtilities.dp(16), 0, AndroidUtilities.dp(16)); + headerCell.setPadding(0, dp(16), 0, dp(16)); if (position == overviewHeaderCell) { - headerCell.setTitle(LocaleController.getString("StatisticOverview", R.string.StatisticOverview)); + headerCell.setTitle(getString("StatisticOverview", R.string.StatisticOverview)); } else if (position == topAdminsHeaderCell) { - headerCell.setTitle(LocaleController.getString("TopAdmins", R.string.TopAdmins)); + headerCell.setTitle(getString("TopAdmins", R.string.TopAdmins)); } else if (position == topInviterHeaderCell) { - headerCell.setTitle(LocaleController.getString("TopInviters", R.string.TopInviters)); + headerCell.setTitle(getString("TopInviters", R.string.TopInviters)); } else if (position == topMembersHeaderCell) { - headerCell.setTitle(LocaleController.getString("TopMembers", R.string.TopMembers)); + headerCell.setTitle(getString("TopMembers", R.string.TopMembers)); } else { headerCell.showDate(false); - headerCell.setPadding(AndroidUtilities.dp(2), AndroidUtilities.dp(15), AndroidUtilities.dp(2), AndroidUtilities.dp(6)); - headerCell.setTitle(LocaleController.getString("RecentPostsCapitalize", R.string.RecentPostsCapitalize)); + headerCell.setPadding(dp(2), dp(15), dp(2), dp(6)); + headerCell.setTitle(getString("RecentPostsCapitalize", R.string.RecentPostsCapitalize)); } } else if (type == 14) { OverviewCell overviewCell = (OverviewCell) holder.itemView; @@ -1395,10 +1448,63 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } } - private class ChartCell extends BaseChartCell { + public static class UniversalChartCell extends BaseChartCell { - public ChartCell(@NonNull Context context, int type, BaseChartView.SharedUiComponents sharedUi) { + private final int currentAccount; + private final int classGuid; + + public UniversalChartCell( + @NonNull Context context, + int currentAccount, + int type, + BaseChartView.SharedUiComponents sharedUi, + int classGuid + ) { super(context, type, sharedUi); + this.currentAccount = currentAccount; + this.classGuid = classGuid; + } + + + @Override + public void onZoomed() { + + } + + @Override + public void zoomCanceled() { + + } + + private int stats_dc; + private Utilities.Callback0Return findCell; + + public void set(int stats_dc, ChartViewData viewData, Utilities.Callback0Return findCell) { + this.stats_dc = stats_dc; + this.findCell = findCell; +// loadData(viewData); + updateData(viewData, false); + } + + @Override + public void loadData(ChartViewData data) { + if (data == null || stats_dc < 0) return; + data.load(currentAccount, classGuid, stats_dc, findCell); + } + } + + public class ChartCell extends BaseChartCell { + + private final int currentAccount; + + public ChartCell( + @NonNull Context context, + int currentAccount, + int type, + BaseChartView.SharedUiComponents sharedUi + ) { + super(context, type, sharedUi); + this.currentAccount = currentAccount; } @Override @@ -1435,29 +1541,29 @@ public class StatisticActivity extends BaseFragment implements NotificationCente return; } - TLRPC.TL_stats_loadAsyncGraph request = new TLRPC.TL_stats_loadAsyncGraph(); + TL_stats.TL_loadAsyncGraph request = new TL_stats.TL_loadAsyncGraph(); request.token = data.zoomToken; if (x != 0) { request.x = x; request.flags |= 1; } - ZoomCancelable finalCancelabel; - lastCancelable = finalCancelabel = new ZoomCancelable(); - finalCancelabel.adapterPosition = recyclerListView.getChildAdapterPosition(ChartCell.this); + ZoomCancelable finalCancelable; + lastCancelable = finalCancelable = new ZoomCancelable(); + finalCancelable.adapterPosition = recyclerListView.getChildAdapterPosition(ChartCell.this); chartView.legendSignatureView.showProgress(true, false); int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(request, (response, error) -> { ChartData childData = null; - if (response instanceof TLRPC.TL_statsGraph) { - String json = ((TLRPC.TL_statsGraph) response).json.data; + if (response instanceof TL_stats.TL_statsGraph) { + String json = ((TL_stats.TL_statsGraph) response).json.data; try { childData = createChartData(new JSONObject(json), data.graphType, data == languagesData); } catch (JSONException e) { e.printStackTrace(); } - } else if (response instanceof TLRPC.TL_statsGraphError) { - Toast.makeText(getContext(), ((TLRPC.TL_statsGraphError) response).error, Toast.LENGTH_LONG).show(); + } else if (response instanceof TL_stats.TL_statsGraphError) { + Toast.makeText(getContext(), ((TL_stats.TL_statsGraphError) response).error, Toast.LENGTH_LONG).show(); } ChartData finalChildData = childData; @@ -1465,8 +1571,8 @@ public class StatisticActivity extends BaseFragment implements NotificationCente if (finalChildData != null) { childDataCache.put(cacheKey, finalChildData); } - if (finalChildData != null && !finalCancelabel.canceled && finalCancelabel.adapterPosition >= 0) { - View view = layoutManager.findViewByPosition(finalCancelabel.adapterPosition); + if (finalChildData != null && !finalCancelable.canceled && finalCancelable.adapterPosition >= 0) { + View view = layoutManager.findViewByPosition(finalCancelable.adapterPosition); if (view instanceof ChartCell) { data.childChartData = finalChildData; ((ChartCell) view).chartView.legendSignatureView.showProgress(false, false); @@ -1481,7 +1587,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente @Override public void loadData(ChartViewData viewData) { - viewData.load(currentAccount, classGuid, chat.stats_dc, recyclerListView, adapter, diffUtilsCallback); + viewData.load(currentAccount, classGuid, chat.stats_dc, getFindChartCell(data)); } } @@ -1526,7 +1632,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } currentW += getChildAt(i).getMeasuredWidth(); } - setMeasuredDimension(getMeasuredWidth(), firstH + currentH + AndroidUtilities.dp(16)); + setMeasuredDimension(getMeasuredWidth(), firstH + currentH + dp(16)); } @Override @@ -1629,7 +1735,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente public abstract void zoomCanceled(); - abstract void loadData(ChartViewData viewData); + protected abstract void loadData(ChartViewData viewData); public void zoomChart(boolean skipTransition) { long d = chartView.getSelectedDate(); @@ -1719,7 +1825,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } private void zoomOut(boolean animated) { - if (data.chartData.x == null) { + if (data == null || data.chartData == null || data.chartData.x == null) { return; } chartHeaderView.zoomOut(chartView, animated); @@ -1974,7 +2080,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente this.position = position; checkBox = new FlatCheckBox(getContext()); - checkBox.setPadding(AndroidUtilities.dp(16), 0, AndroidUtilities.dp(16), 0); + checkBox.setPadding(dp(16), 0, dp(16), 0); checkboxContainer.addView(checkBox); checkBoxes.add(this); } @@ -2090,20 +2196,20 @@ public class StatisticActivity extends BaseFragment implements NotificationCente this.graphType = grahType; } - public void load(int accountId, int classGuid, int dc, RecyclerListView recyclerListView, Adapter adapter, DiffUtilsCallback difCallback) { + public void load(int accountId, int classGuid, int dc, Utilities.Callback0Return findMe) { if (!loading) { loading = true; - TLRPC.TL_stats_loadAsyncGraph request = new TLRPC.TL_stats_loadAsyncGraph(); + TL_stats.TL_loadAsyncGraph request = new TL_stats.TL_loadAsyncGraph(); request.token = token; int reqId = ConnectionsManager.getInstance(accountId).sendRequest(request, (response, error) -> { ChartData chartData = null; String zoomToken = null; if (error == null) { - if (response instanceof TLRPC.TL_statsGraph) { - String json = ((TLRPC.TL_statsGraph) response).json.data; + if (response instanceof TL_stats.TL_statsGraph) { + String json = ((TL_stats.TL_statsGraph) response).json.data; try { chartData = createChartData(new JSONObject(json), graphType, isLanguages); - zoomToken = ((TLRPC.TL_statsGraph) response).zoom_token; + zoomToken = ((TL_stats.TL_statsGraph) response).zoom_token; if (graphType == 4 && chartData.x != null && chartData.x.length > 0) { long x = chartData.x[chartData.x.length - 1]; childChartData = new StackLinearChartData(chartData, x); @@ -2113,10 +2219,10 @@ public class StatisticActivity extends BaseFragment implements NotificationCente e.printStackTrace(); } } - if (response instanceof TLRPC.TL_statsGraphError) { + if (response instanceof TL_stats.TL_statsGraphError) { isEmpty = false; isError = true; - errorMessage = ((TLRPC.TL_statsGraphError) response).error; + errorMessage = ((TL_stats.TL_statsGraphError) response).error; } } @@ -2127,19 +2233,9 @@ public class StatisticActivity extends BaseFragment implements NotificationCente this.chartData = finalChartData; this.zoomToken = finalZoomToken; - int n = recyclerListView.getChildCount(); - boolean found = false; - for (int i = 0; i < n; i++) { - View child = recyclerListView.getChildAt(i); - if (child instanceof ChartCell && ((ChartCell) child).data == this) { - ((ChartCell) child).updateData(this, true); - found = true; - break; - } - } - if (!found) { - recyclerListView.setItemAnimator(null); - difCallback.update(); + BaseChartCell me = findMe.run(); + if (me != null) { + me.updateData(this, true); } }); }, null, null, 0, dc, ConnectionsManager.ConnectionTypeGeneric, true); @@ -2149,7 +2245,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } public static class RecentPostInfo { - public TLRPC.PostInteractionCounters counters; + public TL_stats.PostInteractionCounters counters; public MessageObject message; public long getDate() { @@ -2160,45 +2256,45 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } public boolean isStory() { - return counters instanceof TLRPC.TL_postInteractionCountersStory; + return counters instanceof TL_stats.TL_postInteractionCountersStory; } public int getViews() { - if (counters instanceof TLRPC.TL_postInteractionCountersMessage) { - return ((TLRPC.TL_postInteractionCountersMessage) counters).views; + if (counters instanceof TL_stats.TL_postInteractionCountersMessage) { + return ((TL_stats.TL_postInteractionCountersMessage) counters).views; } - if (counters instanceof TLRPC.TL_postInteractionCountersStory) { - return ((TLRPC.TL_postInteractionCountersStory) counters).views; + if (counters instanceof TL_stats.TL_postInteractionCountersStory) { + return ((TL_stats.TL_postInteractionCountersStory) counters).views; } return 0; } public int getReactions() { - if (counters instanceof TLRPC.TL_postInteractionCountersMessage) { - return ((TLRPC.TL_postInteractionCountersMessage) counters).reactions; + if (counters instanceof TL_stats.TL_postInteractionCountersMessage) { + return ((TL_stats.TL_postInteractionCountersMessage) counters).reactions; } - if (counters instanceof TLRPC.TL_postInteractionCountersStory) { - return ((TLRPC.TL_postInteractionCountersStory) counters).reactions; + if (counters instanceof TL_stats.TL_postInteractionCountersStory) { + return ((TL_stats.TL_postInteractionCountersStory) counters).reactions; } return 0; } public int getForwards() { - if (counters instanceof TLRPC.TL_postInteractionCountersMessage) { - return ((TLRPC.TL_postInteractionCountersMessage) counters).forwards; + if (counters instanceof TL_stats.TL_postInteractionCountersMessage) { + return ((TL_stats.TL_postInteractionCountersMessage) counters).forwards; } - if (counters instanceof TLRPC.TL_postInteractionCountersStory) { - return ((TLRPC.TL_postInteractionCountersStory) counters).forwards; + if (counters instanceof TL_stats.TL_postInteractionCountersStory) { + return ((TL_stats.TL_postInteractionCountersStory) counters).forwards; } return 0; } public int getId() { - if (counters instanceof TLRPC.TL_postInteractionCountersMessage) { - return ((TLRPC.TL_postInteractionCountersMessage) counters).msg_id; + if (counters instanceof TL_stats.TL_postInteractionCountersMessage) { + return ((TL_stats.TL_postInteractionCountersMessage) counters).msg_id; } - if (counters instanceof TLRPC.TL_postInteractionCountersStory) { - return ((TLRPC.TL_postInteractionCountersStory) counters).story_id; + if (counters instanceof TL_stats.TL_postInteractionCountersStory) { + return ((TL_stats.TL_postInteractionCountersStory) counters).story_id; } return 0; } @@ -2639,7 +2735,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente public D fourth; } - private Quadruple prepare(TLRPC.TL_statsAbsValueAndPrev valueAndPrev) { + private Quadruple prepare(TL_stats.TL_statsAbsValueAndPrev valueAndPrev) { int dif = (int) (valueAndPrev.current - valueAndPrev.previous); float difPercent = valueAndPrev.previous == 0 ? 0 : Math.abs(dif / (float) valueAndPrev.previous * 100f); String primary = AndroidUtilities.formatWholeNumber((int) valueAndPrev.current, 0); @@ -2656,30 +2752,30 @@ public class StatisticActivity extends BaseFragment implements NotificationCente return new Quadruple<>(primary, secondary, up, isSectionVisible); } - public OverviewChannelData(TLRPC.TL_stats_broadcastStats stats) { + public OverviewChannelData(TL_stats.TL_broadcastStats stats) { Quadruple quadrupleData = prepare(stats.reactions_per_post); - reactionsPerPostTitle = LocaleController.getString("ReactionsPerPost", R.string.ReactionsPerPost); + reactionsPerPostTitle = getString("ReactionsPerPost", R.string.ReactionsPerPost); reactionsPerPostPrimary = quadrupleData.fist; reactionsPerPostSecondary = quadrupleData.second; reactionsPerPostUp = quadrupleData.third; reactionsPerPostVisible = quadrupleData.fourth; quadrupleData = prepare(stats.reactions_per_story); - reactionsPerStoryTitle = LocaleController.getString("ReactionsPerStory", R.string.ReactionsPerStory); + reactionsPerStoryTitle = getString("ReactionsPerStory", R.string.ReactionsPerStory); reactionsPerStoryPrimary = quadrupleData.fist; reactionsPerStorySecondary = quadrupleData.second; reactionsPerStoryUp = quadrupleData.third; reactionsPerStoryVisible = quadrupleData.fourth; quadrupleData = prepare(stats.views_per_story); - viewsPerStoryTitle = LocaleController.getString("ViewsPerStory", R.string.ViewsPerStory); + viewsPerStoryTitle = getString("ViewsPerStory", R.string.ViewsPerStory); viewsPerStoryPrimary = quadrupleData.fist; viewsPerStorySecondary = quadrupleData.second; viewsPerStoryUp = quadrupleData.third; viewsPerStoryVisible = quadrupleData.fourth; quadrupleData = prepare(stats.shares_per_story); - sharesPerStoryTitle = LocaleController.getString("SharesPerStory", R.string.SharesPerStory); + sharesPerStoryTitle = getString("SharesPerStory", R.string.SharesPerStory); sharesPerStoryPrimary = quadrupleData.fist; sharesPerStorySecondary = quadrupleData.second; sharesPerStoryUp = quadrupleData.third; @@ -2687,7 +2783,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente int dif = (int) (stats.followers.current - stats.followers.previous); float difPercent = stats.followers.previous == 0 ? 0 : Math.abs(dif / (float) stats.followers.previous * 100f); - followersTitle = LocaleController.getString("FollowersChartTitle", R.string.FollowersChartTitle); + followersTitle = getString("FollowersChartTitle", R.string.FollowersChartTitle); followersPrimary = AndroidUtilities.formatWholeNumber((int) stats.followers.current, 0); if (dif == 0 || difPercent == 0) { @@ -2701,7 +2797,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente dif = (int) (stats.shares_per_post.current - stats.shares_per_post.previous); difPercent = stats.shares_per_post.previous == 0 ? 0 : Math.abs(dif / (float) stats.shares_per_post.previous * 100f); - sharesTitle = LocaleController.getString("SharesPerPost", R.string.SharesPerPost); + sharesTitle = getString("SharesPerPost", R.string.SharesPerPost); sharesPrimary = AndroidUtilities.formatWholeNumber((int) stats.shares_per_post.current, 0); if (dif == 0 || difPercent == 0) { @@ -2715,7 +2811,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente dif = (int) (stats.views_per_post.current - stats.views_per_post.previous); difPercent = stats.views_per_post.previous == 0 ? 0 : Math.abs(dif / (float) stats.views_per_post.previous * 100f); - viewsTitle = LocaleController.getString("ViewsPerPost", R.string.ViewsPerPost); + viewsTitle = getString("ViewsPerPost", R.string.ViewsPerPost); viewsPrimary = AndroidUtilities.formatWholeNumber((int) stats.views_per_post.current, 0); if (dif == 0 || difPercent == 0) { viewsSecondary = ""; @@ -2727,7 +2823,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente viewsUp = dif >= 0; difPercent = (float) (stats.enabled_notifications.part / stats.enabled_notifications.total * 100f); - notificationsTitle = LocaleController.getString("EnabledNotifications", R.string.EnabledNotifications); + notificationsTitle = getString("EnabledNotifications", R.string.EnabledNotifications); if (difPercent == (int) difPercent) { notificationsPrimary = String.format(Locale.ENGLISH, "%d%s", (int) difPercent, "%"); } else { @@ -2758,10 +2854,10 @@ public class StatisticActivity extends BaseFragment implements NotificationCente String postingMembersSecondary; boolean postingMembersUp; - public OverviewChatData(TLRPC.TL_stats_megagroupStats stats) { + public OverviewChatData(TL_stats.TL_megagroupStats stats) { int dif = (int) (stats.members.current - stats.members.previous); float difPercent = stats.members.previous == 0 ? 0 : Math.abs(dif / (float) stats.members.previous * 100f); - membersTitle = LocaleController.getString("MembersOverviewTitle", R.string.MembersOverviewTitle); + membersTitle = getString("MembersOverviewTitle", R.string.MembersOverviewTitle); membersPrimary = AndroidUtilities.formatWholeNumber((int) stats.members.current, 0); if (dif == 0 || difPercent == 0) { @@ -2775,7 +2871,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente dif = (int) (stats.viewers.current - stats.viewers.previous); difPercent = stats.viewers.previous == 0 ? 0 : Math.abs(dif / (float) stats.viewers.previous * 100f); - viewingMembersTitle = LocaleController.getString("ViewingMembers", R.string.ViewingMembers); + viewingMembersTitle = getString("ViewingMembers", R.string.ViewingMembers); viewingMembersPrimary = AndroidUtilities.formatWholeNumber((int) stats.viewers.current, 0); if (dif == 0 || difPercent == 0) { @@ -2788,7 +2884,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente dif = (int) (stats.posters.current - stats.posters.previous); difPercent = stats.posters.previous == 0 ? 0 : Math.abs(dif / (float) stats.posters.previous * 100f); - postingMembersTitle = LocaleController.getString("PostingMembers", R.string.PostingMembers); + postingMembersTitle = getString("PostingMembers", R.string.PostingMembers); postingMembersPrimary = AndroidUtilities.formatWholeNumber((int) stats.posters.current, 0); if (dif == 0 || difPercent == 0) { postingMembersSecondary = ""; @@ -2799,7 +2895,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente dif = (int) (stats.messages.current - stats.messages.previous); difPercent = stats.messages.previous == 0 ? 0 : Math.abs(dif / (float) stats.messages.previous * 100f); - messagesTitle = LocaleController.getString("MessagesOverview", R.string.MessagesOverview); + messagesTitle = getString("MessagesOverview", R.string.MessagesOverview); messagesPrimary = AndroidUtilities.formatWholeNumber((int) stats.messages.current, 0); if (dif == 0 || difPercent == 0) { messagesSecondary = ""; @@ -2826,7 +2922,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente secondary = new TextView[maxRows * 2]; title = new TextView[maxRows * 2]; setOrientation(VERTICAL); - setPadding(AndroidUtilities.dp(16), 0, AndroidUtilities.dp(16), 0); + setPadding(dp(16), 0, dp(16), 0); for (int i = 0; i < maxRows; i++) { LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(HORIZONTAL); @@ -2847,7 +2943,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente title[i * 2 + j].setGravity(Gravity.LEFT); secondary[i * 2 + j].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); - secondary[i * 2 + j].setPadding(AndroidUtilities.dp(4), 0, 0, 0); + secondary[i * 2 + j].setPadding(dp(4), 0, 0, 0); infoLayout.addView(primary[i * 2 + j]); infoLayout.addView(secondary[i * 2 + j]); @@ -2994,7 +3090,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente long user_id; public String description; - public static MemberData from(TLRPC.TL_statsGroupTopPoster poster, ArrayList users) { + public static MemberData from(TL_stats.TL_statsGroupTopPoster poster, ArrayList users) { MemberData data = new MemberData(); data.user_id = poster.user_id; data.user = find(data.user_id, users); @@ -3012,7 +3108,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente return data; } - public static MemberData from(TLRPC.TL_statsGroupTopAdmin admin, ArrayList users) { + public static MemberData from(TL_stats.TL_statsGroupTopAdmin admin, ArrayList users) { MemberData data = new MemberData(); data.user_id = admin.user_id; data.user = find(data.user_id, users); @@ -3036,7 +3132,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente return data; } - public static MemberData from(TLRPC.TL_statsGroupTopInviter inviter, ArrayList users) { + public static MemberData from(TL_stats.TL_statsGroupTopInviter inviter, ArrayList users) { MemberData data = new MemberData(); data.user_id = inviter.user_id; data.user = find(data.user_id, users); @@ -3095,10 +3191,10 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } } - items.add(LocaleController.getString("StatisticOpenProfile", R.string.StatisticOpenProfile)); + items.add(getString("StatisticOpenProfile", R.string.StatisticOpenProfile)); icons.add(R.drawable.msg_openprofile); actions.add(2); - items.add(LocaleController.getString("StatisticSearchUserHistory", R.string.StatisticSearchUserHistory)); + items.add(getString("StatisticSearchUserHistory", R.string.StatisticSearchUserHistory)); icons.add(R.drawable.msg_msgbubble3); actions.add(1); @@ -3174,7 +3270,7 @@ public class StatisticActivity extends BaseFragment implements NotificationCente } if (canEditAdmin) { isAdmin = channelParticipant.admin_rights == null; - items.add(isAdmin ? LocaleController.getString("SetAsAdmin", R.string.SetAsAdmin) : LocaleController.getString("EditAdminRights", R.string.EditAdminRights)); + items.add(isAdmin ? getString("SetAsAdmin", R.string.SetAsAdmin) : getString("EditAdminRights", R.string.EditAdminRights)); icons.add(isAdmin ? R.drawable.msg_admins : R.drawable.msg_permissions); actions.add(0); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/DarkThemeResourceProvider.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/DarkThemeResourceProvider.java index 2c76eab60..b8d907b07 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/DarkThemeResourceProvider.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/DarkThemeResourceProvider.java @@ -105,6 +105,8 @@ public class DarkThemeResourceProvider implements Theme.ResourcesProvider { // sparseIntArray.put(Theme.key_windowBackgroundGray, 0xFF1F1F1F); sparseIntArray.put(Theme.key_windowBackgroundGray, Color.BLACK); sparseIntArray.put(Theme.key_windowBackgroundWhiteBlueHeader, 0xFF1A9CFF); + sparseIntArray.put(Theme.key_windowBackgroundWhiteInputFieldActivated, -10177041); + sparseIntArray.put(Theme.key_windowBackgroundWhiteInputField, -10177041); sparseIntArray.put(Theme.key_windowBackgroundWhiteGrayText3, ColorUtils.blendARGB(Color.WHITE, Color.BLACK, 0.3f)); sparseIntArray.put(Theme.key_undo_background, 0xFF212426); sparseIntArray.put(Theme.key_undo_cancelColor, 0xFF8BC8F5); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/DialogStoriesCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/DialogStoriesCell.java index 9727efebb..45749e361 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/DialogStoriesCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/DialogStoriesCell.java @@ -1125,14 +1125,12 @@ public class DialogStoriesCell extends FrameLayout implements NotificationCenter private void createTextView() { textView = new SimpleTextView(getContext()); - textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); textView.setGravity(Gravity.CENTER); textView.setTextSize(11); textView.setTextColor(getTextColor()); NotificationCenter.listenEmojiLoading(textView); - // textView.setEllipsize(TextUtils.TruncateAt.END); textView.setMaxLines(1); - //textView.setSingleLine(true); textViewContainer.addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 1, 0, 1, 0)); avatarImage.setRoundRadius(AndroidUtilities.dp(48) / 2); @@ -1173,12 +1171,15 @@ public class DialogStoriesCell extends FrameLayout implements NotificationCenter } textView.setRightDrawable(null); if (storiesController.isLastUploadingFailed(dialogId)) { - textView.setText(LocaleController.getString("FailedStory", R.string.FailedStory)); + textView.setTextSize(10); + textView.setText(LocaleController.getString(R.string.FailedStory)); isUploadingState = false; } else if (!Utilities.isNullOrEmpty(storiesController.getUploadingStories(dialogId))) { + textView.setTextSize(10); StoriesUtilities.applyUploadingStr(textView, true, false); isUploadingState = true; } else if (storiesController.getEditingStory(dialogId) != null) { + textView.setTextSize(10); StoriesUtilities.applyUploadingStr(textView, true, false); isUploadingState = true; } else { @@ -1222,8 +1223,10 @@ public class DialogStoriesCell extends FrameLayout implements NotificationCenter } AndroidUtilities.runOnUIThread(animationRunnable, 500); isUploadingState = false; - textView.setText(LocaleController.getString("MyStory", R.string.MyStory));//, animated); + textView.setTextSize(10); + textView.setText(LocaleController.getString(R.string.MyStory)); } else if (user != null) { + textView.setTextSize(11); String name = user.first_name == null ? "" : user.first_name.trim(); int index = name.indexOf(" "); if (index > 0) { @@ -1244,6 +1247,7 @@ public class DialogStoriesCell extends FrameLayout implements NotificationCenter textView.setRightDrawable(null); }//, false); } else { + textView.setTextSize(11); CharSequence text = chat.title; text = Emoji.replaceEmoji(text, textView.getPaint().getFontMetricsInt(), false); textView.setText(text);//, false); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/PeerStoriesView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/PeerStoriesView.java index e28094195..68b075a0d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/PeerStoriesView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/PeerStoriesView.java @@ -936,15 +936,13 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica if (lastFragment == null) { return; } - if (lastFragment.getOrCreateOverlayStoryViewer().isShowing) { - return; - } - storyViewer.setOverlayVisible(true); fwdStoryItem.dialogId = reply.peerId; - lastFragment.getOrCreateOverlayStoryViewer().open(getContext(), fwdStoryItem, null); - lastFragment.getOrCreateOverlayStoryViewer().setOnCloseListener(() -> { - storyViewer.setOverlayVisible(false); + StoryViewer overlayStoryViewer = lastFragment.createOverlayStoryViewer(); + overlayStoryViewer.open(getContext(), fwdStoryItem, null); + overlayStoryViewer.setOnCloseListener(() -> { + storyViewer.updatePlayingMode(); }); + storyViewer.updatePlayingMode(); } else { BulletinFactory.of(storyContainer, resourcesProvider) .createSimpleBulletin(R.raw.story_bomb2, LocaleController.getString(R.string.StoryNotFound)) @@ -3108,11 +3106,8 @@ public class PeerStoriesView extends SizeNotifierFrameLayout implements Notifica } } } - if (storyViewer.fragment != null && storyViewer.fragment.overlayStoryViewer != null) { - storyViewer.fragment.overlayStoryViewer.instantClose(); - } - if (storyViewer.fragment != null && storyViewer.fragment.storyViewer != null) { - storyViewer.fragment.storyViewer.instantClose(); + if (storyViewer.fragment != null) { + storyViewer.fragment.clearStoryViewers(); } storyViewer.instantClose(); editOpened = false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/ProfileStoriesView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/ProfileStoriesView.java index 781014b88..d3d77f004 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/ProfileStoriesView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/ProfileStoriesView.java @@ -429,13 +429,9 @@ public class ProfileStoriesView extends View implements NotificationCenter.Notif if (SharedConfig.getDevicePerformanceClass() <= SharedConfig.PERFORMANCE_CLASS_LOW) { return; } - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(this); AndroidUtilities.runOnUIThread(() -> { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore2) {} + AndroidUtilities.vibrateCursor(this); }, 180); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/SelfStoryViewsPage.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/SelfStoryViewsPage.java index e5995d34b..b1ec27305 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/SelfStoryViewsPage.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/SelfStoryViewsPage.java @@ -15,7 +15,6 @@ import android.os.Bundle; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.util.SparseArray; -import android.util.SparseIntArray; import android.util.TypedValue; import android.view.Gravity; import android.view.HapticFeedbackConstants; @@ -243,17 +242,11 @@ public class SelfStoryViewsPage extends FrameLayout implements NotificationCente if (item.view instanceof TL_stories.TL_storyView) { storyViewer.presentFragment(ProfileActivity.of(item.view.user_id)); } else if (item.view instanceof TL_stories.TL_storyViewPublicRepost) { - if (storyViewer.fragment.getOrCreateOverlayStoryViewer().isShowing) { - return; - } - storyViewer.fragment.getOrCreateOverlayStoryViewer().open(getContext(), ((TL_stories.TL_storyViewPublicRepost) item.view).story, StoriesListPlaceProvider.of(recyclerListView)); + storyViewer.fragment.createOverlayStoryViewer().open(getContext(), ((TL_stories.TL_storyViewPublicRepost) item.view).story, StoriesListPlaceProvider.of(recyclerListView)); } else if (item.reaction instanceof TL_stories.TL_storyReaction) { storyViewer.presentFragment(ProfileActivity.of(DialogObject.getPeerDialogId(item.reaction.peer_id))); } else if (item.reaction instanceof TL_stories.TL_storyReactionPublicRepost) { - if (storyViewer.fragment.getOrCreateOverlayStoryViewer().isShowing) { - return; - } - storyViewer.fragment.getOrCreateOverlayStoryViewer().open(getContext(), ((TL_stories.TL_storyReactionPublicRepost) item.reaction).story, StoriesListPlaceProvider.of(recyclerListView)); + storyViewer.fragment.createOverlayStoryViewer().open(getContext(), ((TL_stories.TL_storyReactionPublicRepost) item.reaction).story, StoriesListPlaceProvider.of(recyclerListView)); } else if (item.reaction instanceof TL_stories.TL_storyReactionPublicForward || item.view instanceof TL_stories.TL_storyViewPublicForward) { TLRPC.Message message; if (item.reaction instanceof TL_stories.TL_storyReactionPublicForward) { @@ -794,11 +787,9 @@ public class SelfStoryViewsPage extends FrameLayout implements NotificationCente if (lastFragment == null) { return; } - if (lastFragment.getOrCreateOverlayStoryViewer().isShowing) { - return; - } - lastFragment.getOrCreateOverlayStoryViewer().doOnAnimationReady(onDone); - lastFragment.getOrCreateOverlayStoryViewer().open(getContext(), dialogId, StoriesListPlaceProvider.of(recyclerListView)); + StoryViewer storyViewer1 = lastFragment.createOverlayStoryViewer(); + storyViewer1.doOnAnimationReady(onDone); + storyViewer1.open(getContext(), dialogId, StoriesListPlaceProvider.of(recyclerListView)); } }; break; @@ -1326,9 +1317,13 @@ public class SelfStoryViewsPage extends FrameLayout implements NotificationCente if (state.contactsOnly || !TextUtils.isEmpty(state.searchQuery)) { String search1 = null; String search2 = null; + String search3 = null; + String search4 = null; if (!TextUtils.isEmpty(state.searchQuery)) { search1 = state.searchQuery.trim().toLowerCase(); search2 = LocaleController.getInstance().getTranslitString(search1); + search3 = " " + search1; + search4 = " " + search2; } for (int i = 0; i < originalViews.size(); i++) { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(originalViews.get(i).user_id); @@ -1339,7 +1334,13 @@ public class SelfStoryViewsPage extends FrameLayout implements NotificationCente if (canAdd && search1 != null) { String name = ContactsController.formatName(user.first_name, user.last_name).toLowerCase(); String username = UserObject.getPublicUsername(user); - if (!(name.contains(search1) || name.contains(search2) || (username != null && (username.contains(search1) || username.contains(search2))))) { + String translitName = AndroidUtilities.translitSafe(name); + boolean hit = ( + name != null && (name.startsWith(search1) || name.contains(search3)) || + translitName != null && (translitName.startsWith(search2) || translitName.contains(search4)) || + username != null && (username.startsWith(search2) || username.contains(search4)) + ); + if (!hit) { canAdd = false; } } @@ -1635,6 +1636,7 @@ public class SelfStoryViewsPage extends FrameLayout implements NotificationCente boolean sortByReactions = true; // converts to sortByForwards when showing channel reactions boolean contactsOnly; String searchQuery; + String q; public boolean isDefault() { return sortByReactions && !contactsOnly && TextUtils.isEmpty(searchQuery); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StealthModeAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StealthModeAlert.java index 8e1382bd1..5c750bb23 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StealthModeAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StealthModeAlert.java @@ -178,8 +178,8 @@ public class StealthModeAlert extends BottomSheet { public static void showStealthModeEnabledBulletin() { BaseFragment fragment = LaunchActivity.getLastFragment(); BulletinFactory factory; - if (fragment.storyViewer != null) { - factory = BulletinFactory.of(fragment.storyViewer.windowView, fragment.storyViewer.getResourceProvider()); + if (fragment.getLastStoryViewer() != null) { + factory = BulletinFactory.of(fragment.getLastStoryViewer().windowView, fragment.getLastStoryViewer().getResourceProvider()); } else { factory = BulletinFactory.global(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesController.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesController.java index 52bf157ea..13578ed88 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesController.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesController.java @@ -3,6 +3,7 @@ package org.telegram.ui.Stories; import android.content.Intent; import android.content.SharedPreferences; import android.text.TextUtils; +import android.util.Log; import android.util.SparseArray; import android.webkit.MimeTypeMap; @@ -1692,8 +1693,19 @@ public class StoriesController { return; } FileLog.d("StoriesController update stories from full peer " + dialogId); - peerStories.stories.clear(); - peerStories.stories.addAll(stories.stories); +// peerStories.stories.clear(); +// peerStories.stories.addAll(stories.stories); + for (int i = 0; i < peerStories.stories.size(); ++i) { + if (peerStories.stories.get(i) instanceof TL_stories.TL_storyItemSkipped) { + int storyId = peerStories.stories.get(i).id; + for (int j = 0; j < stories.stories.size(); ++j) { + if (stories.stories.get(j).id == storyId && stories.stories.get(j) instanceof TL_stories.TL_storyItem) { + peerStories.stories.set(i, stories.stories.get(j)); + break; + } + } + } + } } public class UploadingStory implements NotificationCenter.NotificationCenterDelegate { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesListPlaceProvider.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesListPlaceProvider.java index 427693c0b..9be11843e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesListPlaceProvider.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoriesListPlaceProvider.java @@ -7,6 +7,7 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.Region; import android.view.View; +import android.view.ViewGroup; import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; @@ -17,6 +18,7 @@ import org.telegram.ui.Cells.ChatActionCell; import org.telegram.ui.Cells.ChatMessageCell; import org.telegram.ui.Cells.DialogCell; import org.telegram.ui.Cells.ManageChatUserCell; +import org.telegram.ui.Cells.ProfileChannelCell; import org.telegram.ui.Cells.ProfileSearchCell; import org.telegram.ui.Cells.ReactedUserHolderView; import org.telegram.ui.Cells.SharedPhotoVideoCell2; @@ -28,6 +30,7 @@ import org.telegram.ui.Components.RecyclerListView; public class StoriesListPlaceProvider implements StoryViewer.PlaceProvider { private final RecyclerListView recyclerListView; + private final ProfileChannelCell profileChannelCell; int[] clipPoint = new int[2]; private boolean isHiddenArchive; LoadNextInterface loadNextInterface; @@ -45,6 +48,10 @@ public class StoriesListPlaceProvider implements StoryViewer.PlaceProvider { return new StoriesListPlaceProvider(recyclerListView, hiddenArchive); } + public static StoriesListPlaceProvider of(ProfileChannelCell profileChannelCell) { + return new StoriesListPlaceProvider(profileChannelCell); + } + public StoriesListPlaceProvider with(LoadNextInterface loadNextInterface) { this.loadNextInterface = loadNextInterface; return this; @@ -53,6 +60,12 @@ public class StoriesListPlaceProvider implements StoryViewer.PlaceProvider { public StoriesListPlaceProvider(RecyclerListView recyclerListView, boolean hiddenArchive) { this.recyclerListView = recyclerListView; this.isHiddenArchive = hiddenArchive; + this.profileChannelCell = null; + } + + public StoriesListPlaceProvider(ProfileChannelCell profileChannelCell) { + this.profileChannelCell = profileChannelCell; + this.recyclerListView = null; } @Override @@ -78,18 +91,19 @@ public class StoriesListPlaceProvider implements StoryViewer.PlaceProvider { holder.storyImage = null; holder.drawAbove = null; - if (recyclerListView == null) { - return false; - } - DialogStoriesCell dialogStoriesCell = null; - if (recyclerListView.getParent() instanceof DialogStoriesCell) { + if (recyclerListView != null && recyclerListView.getParent() instanceof DialogStoriesCell) { dialogStoriesCell = (DialogStoriesCell) recyclerListView.getParent(); } - RecyclerListView listView = recyclerListView; + ViewGroup listView = recyclerListView; if (dialogStoriesCell != null && !dialogStoriesCell.isExpanded()) { listView = dialogStoriesCell.listViewMini; } + if (profileChannelCell != null) { + listView = profileChannelCell; + } + if (listView == null) return false; + for (int i = 0; i < listView.getChildCount(); i++) { View child = listView.getChildAt(i); @@ -163,14 +177,14 @@ public class StoriesListPlaceProvider implements StoryViewer.PlaceProvider { updateClip(holder); return true; } - } else if (child instanceof SharedPhotoVideoCell2) { + } else if (child instanceof SharedPhotoVideoCell2 && recyclerListView != null) { SharedPhotoVideoCell2 cell = (SharedPhotoVideoCell2) child; MessageObject msg = cell.getMessageObject(); if ( cell.getStyle() == SharedPhotoVideoCell2.STYLE_CACHE && cell.storyId == storyId || msg != null && msg.isStory() && msg.getId() == storyId && msg.storyItem.dialogId == dialogId ) { - final RecyclerListView.FastScroll fastScroll = listView.getFastScroll(); + final RecyclerListView.FastScroll fastScroll = recyclerListView.getFastScroll(); final int[] loc = new int[2]; if (fastScroll != null) { fastScroll.getLocationInWindow(loc); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java index 1f1987d17..abf0fc448 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java @@ -281,17 +281,18 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat currentSpeed = speed; if (playerHolder != null) { playerHolder.setSpeed(speed); - StoryViewer otherStoryViewer = null; - if (fragment != null) { - if (fragment.overlayStoryViewer != this) { - otherStoryViewer = fragment.overlayStoryViewer; - } else if (fragment.storyViewer != this) { - otherStoryViewer = fragment.storyViewer; - } - } - if (otherStoryViewer != null && otherStoryViewer.playerHolder != null) { - otherStoryViewer.playerHolder.setSpeed(speed); - } + // TODO: storyViewerStack +// StoryViewer otherStoryViewer = null; +// if (fragment != null) { +// if (fragment.overlayStoryViewer != this) { +// otherStoryViewer = fragment.overlayStoryViewer; +// } else if (fragment.storyViewer != this) { +// otherStoryViewer = fragment.storyViewer; +// } +// } +// if (otherStoryViewer != null && otherStoryViewer.playerHolder != null) { +// otherStoryViewer.playerHolder.setSpeed(speed); +// } } } @@ -2021,7 +2022,29 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat } public boolean isPaused() { - return isPopupVisible || isTranslating || isBulletinVisible || isCaption || isWaiting || isInTouchMode || keyboardVisible || currentDialog != null || allowTouchesByViewpager || isClosed || isRecording || progressToOpen != 1f || selfStoriesViewsOffset != 0 || isHintVisible || (isSwiping && USE_SURFACE_VIEW) || isOverlayVisible || isInTextSelectionMode || isLikesReactions || progressToDismiss != 0 || storiesIntro != null; + return ( + isPopupVisible || + isTranslating || + isBulletinVisible || + isCaption || + isWaiting || + isInTouchMode || + keyboardVisible || + currentDialog != null || + allowTouchesByViewpager || + isClosed || + isRecording || + progressToOpen != 1f || + selfStoriesViewsOffset != 0 || + isHintVisible || + (isSwiping && USE_SURFACE_VIEW) || + isOverlayVisible || + isInTextSelectionMode || + isLikesReactions || + progressToDismiss != 0 || + storiesIntro != null || + ATTACH_TO_FRAGMENT && fragment != null && fragment.getLastStoryViewer() != this + ); } public void updatePlayingMode() { @@ -2372,6 +2395,9 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat MessagesController.getInstance(currentAccount).getStoriesController().stopAllPollers(); if (ATTACH_TO_FRAGMENT) { lockOrientation(false); + if (fragment != null && fragment.storyViewerStack != null) { + fragment.storyViewerStack.remove(this); + } } globalInstances.remove(this); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/ButtonWithCounterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/ButtonWithCounterView.java index 192df6b7c..b9e47e91e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/ButtonWithCounterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/ButtonWithCounterView.java @@ -117,6 +117,10 @@ public class ButtonWithCounterView extends FrameLayout implements Loadable { counterDrawable.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)); } + public void setTextColor(int color) { + text.setTextColor(color); + } + private boolean countFilled = true; public void setCountFilled(boolean filled) { countFilled = filled; @@ -350,6 +354,7 @@ public class ButtonWithCounterView extends FrameLayout implements Loadable { }); enabledAnimator.start(); } + super.setEnabled(enabled); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/DualCameraView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/DualCameraView.java index 16baca8ae..5945fff33 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/DualCameraView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/DualCameraView.java @@ -321,10 +321,7 @@ public class DualCameraView extends CameraView { allowRotation = Math.round(angle / 90f) * 90f - angle > 20f; } if (!snappedRotation) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) { - } + AndroidUtilities.vibrateCursor(this); snappedRotation = true; } } @@ -340,10 +337,7 @@ public class DualCameraView extends CameraView { if (Math.abs(rotDiff) < 5f) { finalMatrix.postRotate(rotDiff, cx, cy); if (!snappedRotation) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) { - } + AndroidUtilities.vibrateCursor(this); snappedRotation = true; } } else { @@ -585,6 +579,19 @@ public class DualCameraView extends CameraView { return MessagesController.getGlobalMainSettings().getBoolean("dual_available", dualAvailableDefault(context, true)); } + public static boolean roundDualAvailableStatic(Context context) { + return MessagesController.getGlobalMainSettings().getBoolean("rounddual_available", roundDualAvailableDefault(context)); + } + + public static boolean roundDualAvailableDefault(Context context) { + return ( + SharedConfig.getDevicePerformanceClass() >= SharedConfig.PERFORMANCE_CLASS_HIGH && + Camera.getNumberOfCameras() > 1 && + SharedConfig.allowPreparingHevcPlayers() && + context != null && context.getPackageManager().hasSystemFeature("android.hardware.camera.concurrent") + ); + } + private Matrix getSavedDualMatrix() { String str = MessagesController.getGlobalMainSettings().getString("dualmatrix", null); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/EmojiBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/EmojiBottomSheet.java index 04293febe..470beede1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/EmojiBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/EmojiBottomSheet.java @@ -29,6 +29,7 @@ import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; import android.text.TextWatcher; +import android.util.Log; import android.util.SparseArray; import android.util.SparseIntArray; import android.util.TypedValue; @@ -724,7 +725,7 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. setPadding(backgroundPaddingLeft, 0, backgroundPaddingLeft, 0); tabsStrip.setTranslationY(dp(16)); searchField.setTranslationY(dp(16 + 36)); - listView.setPadding(dp(5), dp(16 + 36 + 50), dp(5), AndroidUtilities.navigationBarHeight + dp(40)); + listView.setPadding(dp(5), dp(16 + 36 + 50), dp(5), AndroidUtilities.navigationBarHeight + dp(onlyStickers ? 0 : 40)); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @@ -733,6 +734,7 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. @Override public void bind(int type) { this.currentType = type; + listView.emoji = type == PAGE_TYPE_EMOJI; layoutManager.setSpanCount(spanCount = type == PAGE_TYPE_EMOJI ? 8 : 5); if (!resetOnce) { adapter.updateItems(null); @@ -1274,7 +1276,7 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. } public boolean hasWidgets() { - return canShowWidget(WIDGET_LOCATION) || canShowWidget(WIDGET_AUDIO) || canShowWidget(WIDGET_PHOTO) || canShowWidget(WIDGET_REACTION); + return onWidgetSelected != null && (canShowWidget(WIDGET_LOCATION) || canShowWidget(WIDGET_AUDIO) || canShowWidget(WIDGET_PHOTO) || canShowWidget(WIDGET_REACTION)); } @Override @@ -1313,19 +1315,20 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. } private final ViewPagerFixed viewPager; - private final TabsView tabsView; + private TabsView tabsView; private float maxPadding = -1; + private final boolean onlyStickers; // private final GestureDetector gestureDetector; private boolean wasKeyboardVisible; public static int savedPosition = 1; - private boolean storyIsVideo; - public EmojiBottomSheet(Context context, boolean storyIsVideo, Theme.ResourcesProvider resourcesProvider) { + public EmojiBottomSheet(Context context, boolean onlyStickers, Theme.ResourcesProvider resourcesProvider) { super(context, true, resourcesProvider); - this.storyIsVideo = storyIsVideo; + this.onlyStickers = onlyStickers; + useSmoothKeyboard = true; fixNavigationBar(Theme.getColor(Theme.key_dialogBackground, resourcesProvider)); @@ -1336,17 +1339,19 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. viewPager = new ViewPagerFixed(context) { @Override protected void onTabAnimationUpdate(boolean manual) { - tabsView.setType(viewPager.getPositionAnimated()); + if (tabsView != null) { + tabsView.setType(viewPager.getPositionAnimated()); + } containerView.invalidate(); invalidate(); savedPosition = viewPager.getCurrentPosition(); } }; - viewPager.currentPosition = savedPosition; + viewPager.currentPosition = onlyStickers ? 0 : savedPosition; viewPager.setAdapter(new ViewPagerFixed.Adapter() { @Override public int getItemCount() { - return 3; + return onlyStickers ? 1 : 3; } @Override public View createView(int viewType) { @@ -1367,7 +1372,7 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. @Override public void bindView(View view, int position, int viewType) { - ((IPage) view).bind(position); + ((IPage) view).bind(onlyStickers ? 1 : position); } }); containerView.addView(viewPager, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL)); @@ -1381,22 +1386,26 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. } }); - tabsView = new TabsView(context); - tabsView.setOnTypeSelected(type -> { - if (!viewPager.isManualScrolling() && viewPager.getCurrentPosition() != type) { - viewPager.scrollToPosition(type); - tabsView.setType(type); - } - }); - tabsView.setType(viewPager.currentPosition); - containerView.addView(tabsView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL)); + if (!onlyStickers) { + tabsView = new TabsView(context); + tabsView.setOnTypeSelected(type -> { + if (!viewPager.isManualScrolling() && viewPager.getCurrentPosition() != type) { + viewPager.scrollToPosition(type); + tabsView.setType(type); + } + }); + tabsView.setType(viewPager.currentPosition); + containerView.addView(tabsView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL)); + } NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.stickersDidLoad); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.groupStickersDidLoad); FileLog.disableGson(true); - MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_EMOJIPACKS); - MediaDataController.getInstance(currentAccount).checkFeaturedEmoji(); + if (!onlyStickers) { + MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_EMOJIPACKS); + MediaDataController.getInstance(currentAccount).checkFeaturedEmoji(); + } MediaDataController.getInstance(currentAccount).checkStickers(MediaDataController.TYPE_IMAGE); MediaDataController.getInstance(currentAccount).loadRecents(MediaDataController.TYPE_IMAGE, false, true, false); @@ -1465,7 +1474,7 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. } private void setupBlurBitmap() { - if (blurBitmap != null || drawBlurBitmap == null || SharedConfig.getDevicePerformanceClass() <= SharedConfig.PERFORMANCE_CLASS_LOW || LiteMode.isPowerSaverApplied()) { + if (blurBitmap != null || !(resourcesProvider == null ? Theme.isCurrentThemeDark() : resourcesProvider.isDark()) || drawBlurBitmap == null || SharedConfig.getDevicePerformanceClass() <= SharedConfig.PERFORMANCE_CLASS_LOW || LiteMode.isPowerSaverApplied()) { return; } final int scale = 16; @@ -1510,14 +1519,18 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. maxPadding = newMaxPadding; viewPager.setPadding(0, AndroidUtilities.statusBarHeight, 0, 0); viewPager.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); - tabsView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), 0); + if (tabsView != null) { + tabsView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), 0); + } setMeasuredDimension(width, height); } + private Boolean overStatusBar; + @Override protected void dispatchDraw(Canvas canvas) { backgroundPaint.setColor(Theme.getColor(Theme.key_dialogBackground, resourcesProvider)); - backgroundPaint.setAlpha((int) (0xFF * (blurBitmap == null ? .95f : .85f))); + backgroundPaint.setAlpha((int) (0xFF * (blurBitmap == null ? 1f : .85f))); View[] views = viewPager.getViewPages(); top = 0; for (int i = 0; i < views.length; ++i) { @@ -1541,6 +1554,12 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. blurBitmapShader.setLocalMatrix(blurBitmapMatrix); canvas.drawRoundRect(AndroidUtilities.rectTmp, dp(14), dp(14), backgroundBlurPaint); } + + boolean overStatusBar = AndroidUtilities.rectTmp.top < AndroidUtilities.statusBarHeight; + if (this.overStatusBar == null || this.overStatusBar != overStatusBar) { + this.overStatusBar = overStatusBar; + AndroidUtilities.setLightStatusBar(getWindow(), overStatusBar ? AndroidUtilities.computePerceivedBrightness(backgroundPaint.getColor()) >= .721f : false); + } canvas.drawRoundRect(AndroidUtilities.rectTmp, (1f - statusBar) * dp(14), (1f - statusBar) * dp(14), backgroundPaint); handleRect.set( (getWidth() - dp(36)) / 2f, @@ -1682,20 +1701,21 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. imageReceiver = new ImageReceiver(); imageReceiver.setLayerNum(7); imageReceiver.setAspectFit(true); - imageReceiver.setParentView(listView); if (attached) { imageReceiver.onAttachedToWindow(); } } - SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(document, Theme.key_windowBackgroundWhiteGrayIcon, 0.2f); + imageReceiver.setParentView(!emoji ? this : listView); + + SvgHelper.SvgDrawable svgThumb = null;//DocumentObject.getSvgThumb(document, Theme.key_windowBackgroundWhiteGrayIcon, 0.2f); TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(document.thumbs, 90); String filter = "80_80"; if ("video/webm".equals(document.mime_type)) { filter += "_" + ImageLoader.AUTOPLAY_FILTER; } - if (svgThumb != null) { - svgThumb.overrideWidthAndHeight(512, 512); - } +// if (svgThumb != null) { +// svgThumb.overrideWidthAndHeight(512, 512); +// } imageReceiver.setImage(ImageLocation.getForDocument(document), filter, ImageLocation.getForDocument(thumb, document), "80_80", svgThumb, 0, null, document, 0); } else if (imageReceiver != null) { documentId = 0; @@ -1749,10 +1769,10 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. @Override protected void onDraw(Canvas canvas) { if (imageReceiver != null) { - imageReceiver.setImageCoords(0, 0, getWidth(), getHeight()); + imageReceiver.setImageCoords(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom()); imageReceiver.draw(canvas); } else if (drawable != null) { - drawable.setBounds(0, 0, getWidth(), getHeight()); + drawable.setBounds(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom()); drawable.draw(canvas); } } @@ -1840,6 +1860,12 @@ public class EmojiBottomSheet extends BottomSheet implements NotificationCenter. canvas.save(); canvas.clipRect(0, topBound, getWidth(), bottomBound); + if (!emoji) { + super.dispatchDraw(canvas); + canvas.restore(); + return; + } + if (!selectorRect.isEmpty()) { selectorDrawable.setBounds(selectorRect); canvas.save(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/HintView2.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/HintView2.java index 127c9020d..2668cdf59 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/HintView2.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/HintView2.java @@ -38,6 +38,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Emoji; import org.telegram.messenger.LocaleController; import org.telegram.messenger.R; import org.telegram.messenger.Utilities; @@ -241,8 +242,17 @@ public class HintView2 extends View { } Spanned spanned = (Spanned) text; TypefaceSpan[] spans = spanned.getSpans(0, text.length(), TypefaceSpan.class); + AnimatedEmojiSpan[] animatedSpans = spanned.getSpans(0, text.length(), AnimatedEmojiSpan.class); + Emoji.EmojiSpan[] emojiSpans = spanned.getSpans(0, text.length(), Emoji.EmojiSpan.class); + int add = 0; + for (int i = 0; i < emojiSpans.length; ++i) { + add += emojiSpans[i].size; + } + for (int i = 0; i < animatedSpans.length; ++i) { + add += animatedSpans[i].size; + } if (spans == null || spans.length == 0) { - return paint.measureText(text.toString()); + return paint.measureText(text.toString()) + add; } float len = 0; int s = 0, e; @@ -268,7 +278,7 @@ public class HintView2 extends View { if (e - s > 0) { len += paint.measureText(spanned, s, e); } - return len; + return len + add; } // returns max width diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PaintView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PaintView.java index 5240f0860..e6cfdbe21 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PaintView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PaintView.java @@ -1758,7 +1758,7 @@ public class PaintView extends SizeNotifierFrameLayoutPhoto implements IPhotoPai detectFaces(); } }, 350); - EmojiBottomSheet alert = emojiPopup = new EmojiBottomSheet(getContext(), isVideo, resourcesProvider) { + EmojiBottomSheet alert = emojiPopup = new EmojiBottomSheet(getContext(), false, resourcesProvider) { @Override public void onDismissAnimationStart() { super.onDismissAnimationStart(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PreviewView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PreviewView.java index f74374c8d..4ef467a05 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PreviewView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/PreviewView.java @@ -1313,9 +1313,7 @@ public class PreviewView extends FrameLayout { allowRotation = Math.round(angle / 90f) * 90f - angle > 20f; } if (!snappedRotation) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(this); snappedRotation = true; } } @@ -1335,9 +1333,7 @@ public class PreviewView extends FrameLayout { if (Math.abs(rotDiff) < 3.5f) { finalMatrix.postRotate(rotDiff, cx, cy); if (!snappedRotation) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) {} + AndroidUtilities.vibrateCursor(this); snappedRotation = true; } } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/SliderView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/SliderView.java index eaf72d6aa..6f37b0ee1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/SliderView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/SliderView.java @@ -218,10 +218,7 @@ public class SliderView extends View { } catch (Exception ignore) { } } else if (Math.floor(pastVolume * 5) != Math.floor(volume * 5)) { - try { - performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } catch (Exception ignore) { - } + AndroidUtilities.vibrateCursor(this); } } updateText(volume); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryEntry.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryEntry.java index 12fdbfb33..f45b06892 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryEntry.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryEntry.java @@ -1033,6 +1033,7 @@ public class StoryEntry { info.startTime = (long) (left * duration) * 1000L; info.endTime = (long) (right * duration) * 1000L; info.estimatedDuration = info.endTime - info.startTime; + info.volume = videoVolume; info.muted = muted; info.estimatedSize = (long) (params[AnimatedFileDrawable.PARAM_NUM_AUDIO_FRAME_SIZE] + params[AnimatedFileDrawable.PARAM_NUM_DURATION] / 1000.0f * encoderBitrate / 8); info.estimatedSize = Math.max(file.length(), info.estimatedSize); @@ -1056,6 +1057,7 @@ public class StoryEntry { info.endTime = -1; info.muted = true; info.originalBitrate = -1; + info.volume = 1f; info.bitrate = -1; info.framerate = 30; info.estimatedSize = (long) (duration / 1000.0f * encoderBitrate / 8); @@ -1128,7 +1130,7 @@ public class StoryEntry { location.file_reference = new byte[0]; TLObject object; - if ("mp4".equals(ext)) { + if ("mp4".equals(ext) || "webm".equals(ext)) { TLRPC.VideoSize videoSize = new TLRPC.TL_videoSize_layer127(); videoSize.location = location; object = videoSize; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryPrivacyBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryPrivacyBottomSheet.java index da00f36e8..78a40c082 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryPrivacyBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryPrivacyBottomSheet.java @@ -2607,7 +2607,7 @@ public class StoryPrivacyBottomSheet extends BottomSheet implements Notification return chats; } - private static class UserCell extends FrameLayout { + public static class UserCell extends FrameLayout { private final Theme.ResourcesProvider resourcesProvider; @@ -2617,8 +2617,8 @@ public class StoryPrivacyBottomSheet extends BottomSheet implements Notification private final SimpleTextView titleTextView; private final SimpleTextView subtitleTextView; - private final CheckBox2 checkBox; - private final RadioButton radioButton; + public final CheckBox2 checkBox; + public final RadioButton radioButton; private final Paint dividerPaint = new Paint(Paint.ANTI_ALIAS_FLAG); @@ -2722,7 +2722,28 @@ public class StoryPrivacyBottomSheet extends BottomSheet implements Notification private boolean[] isOnline = new boolean[1]; + + public void set(Object object) { + if (object instanceof TLRPC.User) { + titleTextView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + titleTextView.setTranslationX(0); + setUser((TLRPC.User) object); + } else if (object instanceof TLRPC.Chat) { + titleTextView.setTypeface(AndroidUtilities.getTypeface(AndroidUtilities.TYPEFACE_ROBOTO_MEDIUM)); + titleTextView.setTranslationX(0); + setChat((TLRPC.Chat) object, 0); + } else if (object instanceof String) { + titleTextView.setTypeface(null); + titleTextView.setTranslationX(-dp(52) * (LocaleController.isRTL ? -1 : 1)); + titleTextView.setText((String) object); + } + } + + public long dialogId; + public void setUser(TLRPC.User user) { + dialogId = user == null ? 0 : user.id; + avatarDrawable.setInfo(user); imageView.setRoundRadius(dp(20)); imageView.setForUserOrChat(user, avatarDrawable); @@ -2745,6 +2766,8 @@ public class StoryPrivacyBottomSheet extends BottomSheet implements Notification } public void setChat(TLRPC.Chat chat, int participants_count) { + dialogId = chat == null ? 0 : -chat.id; + avatarDrawable.setInfo(chat); imageView.setRoundRadius(dp(ChatObject.isForum(chat) ? 12 : 20)); imageView.setForUserOrChat(chat, avatarDrawable); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TopicsFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/TopicsFragment.java index c847876d8..1c076fe50 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/TopicsFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/TopicsFragment.java @@ -572,11 +572,22 @@ public class TopicsFragment extends BaseFragment implements NotificationCenter.N bottomSheet.setDelegate((users1, fwdCount) -> { int N = users1.size(); int[] finished = new int[1]; + TLRPC.TL_messages_invitedUsers totalInvitedUsers = new TLRPC.TL_messages_invitedUsers(); + totalInvitedUsers.updates = new TLRPC.TL_updates(); for (int a = 0; a < N; a++) { TLRPC.User user = users1.get(a); - getMessagesController().addUserToChat(chatId, user, fwdCount, null, TopicsFragment.this, () -> { - if (++finished[0] == N) { - BulletinFactory.of(TopicsFragment.this).createUsersAddedBulletin(users1, getMessagesController().getChat(chatId)).show(); + getMessagesController().addUserToChat(chatId, user, fwdCount, null, TopicsFragment.this, false, () -> {}, null, invitedUsers -> { + if (invitedUsers != null) { + totalInvitedUsers.missing_invitees.addAll(invitedUsers.missing_invitees); + } + finished[0]++; + if (finished[0] == N) { + if (totalInvitedUsers.missing_invitees.isEmpty()) { + BulletinFactory.of(TopicsFragment.this).createUsersAddedBulletin(users1, getMessagesController().getChat(chatId)).show(); + } else { + TLRPC.Chat chat = getMessagesController().getChat(chatId); + AlertsCreator.checkRestrictedInviteUsers(currentAccount, chat, totalInvitedUsers); + } } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java index cfe11d56e..a9e687c82 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java @@ -133,6 +133,7 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific private RadialProgressView radialProgressView; + private int delegateType; private TwoStepVerificationActivityDelegate delegate; public interface TwoStepVerificationActivityDelegate { @@ -434,7 +435,7 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific } if (delegate != null) { titleTextView.setText(LocaleController.getString(R.string.YourPassword)); - subtitleTextView.setText(LocaleController.getString(R.string.PleaseEnterCurrentPasswordTransfer)); + subtitleTextView.setText(LocaleController.getString(delegateType == 1 ? R.string.PleaseEnterCurrentPasswordWithdraw : R.string.PleaseEnterCurrentPasswordTransfer)); subtitleTextView.setVisibility(View.VISIBLE); } else { titleTextView.setText(LocaleController.getString(R.string.YourPassword)); @@ -664,7 +665,8 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific currentPassword = password; } - public void setDelegate(TwoStepVerificationActivityDelegate twoStepVerificationActivityDelegate) { + public void setDelegate(int a, TwoStepVerificationActivityDelegate twoStepVerificationActivityDelegate) { + delegateType = a; delegate = twoStepVerificationActivityDelegate; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/UserInfoActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/UserInfoActivity.java new file mode 100644 index 000000000..c1d3862e4 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/UserInfoActivity.java @@ -0,0 +1,675 @@ +package org.telegram.ui; + +import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.getString; + +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.BotWebViewVibrationEffect; +import org.telegram.messenger.BuildVars; +import org.telegram.messenger.ChatObject; +import org.telegram.messenger.ContactsController; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.Utilities; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarMenuItem; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.EditTextCell; +import org.telegram.ui.Components.AlertsCreator; +import org.telegram.ui.Components.BottomSheetWithRecyclerListView; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.ChatAttachAlertLocationLayout; +import org.telegram.ui.Components.CircularProgressDrawable; +import org.telegram.ui.Components.CrossfadeDrawable; +import org.telegram.ui.Components.RecyclerListView; +import org.telegram.ui.Components.UItem; +import org.telegram.ui.Components.UniversalAdapter; +import org.telegram.ui.Components.UniversalFragment; + +import java.util.ArrayList; +import java.util.Calendar; + +public class UserInfoActivity extends UniversalFragment implements NotificationCenter.NotificationCenterDelegate { + + private EditTextCell firstNameEdit; + private EditTextCell lastNameEdit; + private EditTextCell bioEdit; + + private CharSequence bioInfo; + private CharSequence birthdayInfo; + + @Override + protected CharSequence getTitle() { + return getString(R.string.EditProfileInfo); + } + + private static final int done_button = 1; + private CrossfadeDrawable doneButtonDrawable; + private ActionBarMenuItem doneButton; + + @Override + public boolean onFragmentCreate() { + getNotificationCenter().addObserver(this, NotificationCenter.userInfoDidLoad); + getNotificationCenter().addObserver(this, NotificationCenter.privacyRulesUpdated); + getContactsController().loadPrivacySettings(); + return super.onFragmentCreate(); + } + + @Override + public void onFragmentDestroy() { + getNotificationCenter().removeObserver(this, NotificationCenter.userInfoDidLoad); + getNotificationCenter().removeObserver(this, NotificationCenter.privacyRulesUpdated); + super.onFragmentDestroy(); + if (!wasSaved) { + processDone(false); + } + } + + @Override + public View createView(Context context) { + firstNameEdit = new EditTextCell(context, getString(R.string.EditProfileFirstName), false, -1) { + @Override + protected void onTextChanged(CharSequence newText) { + super.onTextChanged(newText); + checkDone(true); + } + }; + firstNameEdit.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + firstNameEdit.setDivider(true); + firstNameEdit.hideKeyboardOnEnter(); + lastNameEdit = new EditTextCell(context, getString(R.string.EditProfileLastName), false, -1) { + @Override + protected void onTextChanged(CharSequence newText) { + super.onTextChanged(newText); + checkDone(true); + } + }; + lastNameEdit.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + lastNameEdit.hideKeyboardOnEnter(); + bioEdit = new EditTextCell(context, getString(R.string.EditProfileBioHint), true, getMessagesController().getAboutLimit()) { + @Override + protected void onTextChanged(CharSequence newText) { + super.onTextChanged(newText); + checkDone(true); + } + }; + bioEdit.setBackgroundColor(getThemedColor(Theme.key_windowBackgroundWhite)); + bioEdit.setShowLimitWhenEmpty(true); + + bioInfo = AndroidUtilities.replaceSingleTag(getString(R.string.EditProfileBioInfo), () -> { + presentFragment(new PrivacyControlActivity(ContactsController.PRIVACY_RULES_TYPE_BIO, true)); + }); + + super.createView(context); + + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + if (onBackPressed()) { + finishFragment(); + } + } else if (id == done_button) { + processDone(true); + } + } + }); + Drawable checkmark = context.getResources().getDrawable(R.drawable.ic_ab_done).mutate(); + checkmark.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_actionBarDefaultIcon), PorterDuff.Mode.MULTIPLY)); + doneButtonDrawable = new CrossfadeDrawable(checkmark, new CircularProgressDrawable(Theme.getColor(Theme.key_actionBarDefaultIcon))); + doneButton = actionBar.createMenu().addItemWithWidth(done_button, doneButtonDrawable, dp(56), LocaleController.getString("Done", R.string.Done)); + checkDone(false); + + setValue(); + + return fragmentView; + } + + private static final int BUTTON_BIRTHDAY = 1; + private static final int BUTTON_REMOVE_BIRTHDAY = 2; + private static final int BUTTON_CHANNEL = 3; + + @Override + protected void fillItems(ArrayList items, UniversalAdapter adapter) { + items.add(UItem.asHeader(getString(R.string.EditProfileName))); + items.add(UItem.asCustom(firstNameEdit)); + items.add(UItem.asCustom(lastNameEdit)); + items.add(UItem.asShadow(null)); + items.add(UItem.asHeader(getString(R.string.EditProfileChannel))); + items.add(UItem.asButton(BUTTON_CHANNEL, getString(R.string.EditProfileChannelTitle), channel == null ? getString(R.string.EditProfileChannelAdd) : channel.title)); + items.add(UItem.asShadow(null)); + items.add(UItem.asHeader(getString(R.string.EditProfileBio))); + items.add(UItem.asCustom(bioEdit)); + items.add(UItem.asShadow(bioInfo)); + items.add(UItem.asHeader(getString(R.string.EditProfileBirthday))); + items.add(UItem.asButton(BUTTON_BIRTHDAY, getString(R.string.EditProfileBirthdayText), birthday == null ? getString(R.string.EditProfileBirthdayAdd) : birthdayString(birthday))); + if (birthday != null) { + items.add(UItem.asButton(BUTTON_REMOVE_BIRTHDAY, getString(R.string.EditProfileBirthdayRemove)).red()); + } + if (!getContactsController().getLoadingPrivacyInfo(ContactsController.PRIVACY_RULES_TYPE_BIRTHDAY)) { + ArrayList rules = getContactsController().getPrivacyRules(ContactsController.PRIVACY_RULES_TYPE_BIRTHDAY); + if (rules != null && birthdayInfo == null) { + String string = getString(R.string.EditProfileBirthdayInfoContacts); + if (!rules.isEmpty()) { + for (int i = 0; i < rules.size(); ++i) { + if (rules.get(i) instanceof TLRPC.TL_privacyValueAllowContacts) { + string = getString(R.string.EditProfileBirthdayInfoContacts); + break; + } + if (rules.get(i) instanceof TLRPC.TL_privacyValueAllowAll || rules.get(i) instanceof TLRPC.TL_privacyValueDisallowAll) { + string = getString(R.string.EditProfileBirthdayInfo); + } + } + } + birthdayInfo = AndroidUtilities.replaceArrows(AndroidUtilities.replaceSingleTag(string, () -> { + presentFragment(new PrivacyControlActivity(PrivacyControlActivity.PRIVACY_RULES_TYPE_BIRTHDAY)); + }), true); + } + } + items.add(UItem.asShadow(birthdayInfo)); + } + + public static String birthdayString(TLRPC.TL_birthday birthday) { + if (birthday == null) { + return "โ€”"; + } + if ((birthday.flags & 1) != 0) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, birthday.year); + calendar.set(Calendar.MONTH, birthday.month - 1); + calendar.set(Calendar.DAY_OF_MONTH, birthday.day); + return LocaleController.getInstance().formatterBoostExpired.format(calendar.getTimeInMillis()); + } else { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.MONTH, birthday.month - 1); + calendar.set(Calendar.DAY_OF_MONTH, birthday.day); + return LocaleController.getInstance().formatterDayMonth.format(calendar.getTimeInMillis()); + } + } + + @Override + protected void onClick(UItem item, View view, int position, float x, float y) { + if (item.id == BUTTON_BIRTHDAY) { + showDialog(AlertsCreator.createBirthdayPickerDialog( + getContext(), + getString(R.string.EditProfileBirthdayTitle), + getString(R.string.EditProfileBirthdayButton), + birthday, + selectedBirthday -> { + birthday = selectedBirthday; + if (listView != null) { + listView.adapter.update(true); + } + checkDone(true); + }, + null, + getResourceProvider() + ).create()); + } else if (item.id == BUTTON_REMOVE_BIRTHDAY) { + birthday = null; + if (listView != null) { + listView.adapter.update(true); + } + checkDone(true); + } else if (item.id == BUTTON_CHANNEL) { + presentFragment(new ChooseChannelFragment( + channels, + (channel == null ? 0 : channel.id), chat -> { + if (channel == chat) return; + channel = chat; + if (chat != null) { + BulletinFactory.of(this).createSimpleBulletin(R.raw.contact_check, getString(R.string.EditProfileChannelSet)).show(); + } + checkDone(true); + if (listView != null) { + listView.adapter.update(true); + } + } + )); +// showDialog(new ChooseChannel(this, channels, (channel == null ? 0 : channel.id), chat -> { +// if (channel == chat) return; +// channel = chat; +// checkDone(true); +// if (listView != null) { +// listView.adapter.update(true); +// } +// })); + } + } + + @Override + protected boolean onLongClick(UItem item, View view, int position, float x, float y) { + return false; + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.userInfoDidLoad) { + setValue(); + } else if (id == NotificationCenter.privacyRulesUpdated) { + if (listView != null) { + listView.adapter.update(true); + } + } + } + + @Override + public void onResume() { + super.onResume(); + channels.invalidate(); + channels.subscribe(() -> { + if (listView != null) { + listView.adapter.update(true); + } + }); + channels.fetch(); + birthdayInfo = null; + if (listView != null) { + listView.adapter.update(true); + } + } + + private String currentFirstName; + private String currentLastName; + private String currentBio; + private TLRPC.TL_birthday currentBirthday; + private long currentChannel; + + private TLRPC.TL_birthday birthday; + private TLRPC.Chat channel; + + private AdminedChannelsFetcher channels = new AdminedChannelsFetcher(currentAccount); + + private boolean valueSet; + private void setValue() { + if (valueSet) return; + + final long selfId = getUserConfig().getClientUserId(); + TLRPC.UserFull userFull = getMessagesController().getUserFull(selfId); + if (userFull == null) { + getMessagesController().loadUserInfo(getUserConfig().getCurrentUser(), true, getClassGuid()); + return; + } + + TLRPC.User user = userFull.user; + if (user == null) { + user = getUserConfig().getCurrentUser(); + } + + if (user == null) { + return; + } + + firstNameEdit.setText(currentFirstName = user.first_name); + lastNameEdit.setText(currentLastName = user.last_name); + bioEdit.setText(currentBio = userFull.about); + birthday = currentBirthday = userFull.birthday; + if ((userFull.flags2 & 64) != 0) { + currentChannel = userFull.personal_channel_id; + channel = getMessagesController().getChat(currentChannel); + } else { + currentChannel = 0; + channel = null; + } + checkDone(true); + + if (listView != null && listView.adapter != null) { + listView.adapter.update(true); + } + valueSet = true; + } + + public boolean hasChanges() { + return ( + !TextUtils.equals(currentFirstName == null ? "" : currentFirstName, firstNameEdit.getText().toString()) || + !TextUtils.equals(currentLastName == null ? "" : currentLastName, lastNameEdit.getText().toString()) || + !TextUtils.equals(currentBio == null ? "" : currentBio, bioEdit.getText().toString()) || + !birthdaysEqual(currentBirthday, birthday) || + currentChannel != (channel != null ? channel.id : 0) + ); + } + + public static boolean birthdaysEqual(TLRPC.TL_birthday a, TLRPC.TL_birthday b) { + return !((a == null) == (b != null) || a != null && (a.day != b.day || a.month != b.month || a.year != b.year)); + } + + private void checkDone(boolean animated) { + if (doneButton == null) return; + final boolean hasChanges = hasChanges(); + doneButton.setEnabled(hasChanges); + if (animated) { + doneButton.animate().alpha(hasChanges ? 1.0f : 0.0f).scaleX(hasChanges ? 1.0f : 0.0f).scaleY(hasChanges ? 1.0f : 0.0f).setDuration(180).start(); + } else { + doneButton.setAlpha(hasChanges ? 1.0f : 0.0f); + doneButton.setScaleX(hasChanges ? 1.0f : 0.0f); + doneButton.setScaleY(hasChanges ? 1.0f : 0.0f); + } + } + + private boolean wasSaved = false; + private int shiftDp = -4; + private void processDone(boolean error) { + if (doneButtonDrawable.getProgress() > 0f) return; + + if (error && TextUtils.isEmpty(firstNameEdit.getText())) { + BotWebViewVibrationEffect.APP_ERROR.vibrate(); + AndroidUtilities.shakeViewSpring(firstNameEdit, shiftDp = -shiftDp); + return; + } + + doneButtonDrawable.animateToProgress(1f); + TLRPC.User user = getUserConfig().getCurrentUser(); + TLRPC.UserFull userFull = getMessagesController().getUserFull(getUserConfig().getClientUserId()); + if (user == null || userFull == null) return; + + ArrayList requests = new ArrayList(); + + if ( + !TextUtils.isEmpty(firstNameEdit.getText()) && + ( + !TextUtils.equals(currentFirstName, firstNameEdit.getText().toString()) || + !TextUtils.equals(currentLastName, lastNameEdit.getText().toString()) || + !TextUtils.equals(currentBio, bioEdit.getText().toString()) + ) + ) { + TLRPC.TL_account_updateProfile req1 = new TLRPC.TL_account_updateProfile(); + + req1.flags |= 1; + req1.first_name = user.first_name = firstNameEdit.getText().toString(); + + req1.flags |= 2; + req1.last_name = user.last_name = lastNameEdit.getText().toString(); + + req1.flags |= 4; + req1.about = userFull.about = bioEdit.getText().toString(); + userFull.flags = TextUtils.isEmpty(userFull.about) ? (userFull.flags & ~2) : (userFull.flags | 2); + + requests.add(req1); + } + + TLRPC.TL_birthday oldBirthday = userFull != null ? userFull.birthday : null; + if (!birthdaysEqual(currentBirthday, birthday)) { + TLRPC.TL_account_updateBirthday req = new TLRPC.TL_account_updateBirthday(); + if (birthday != null) { + userFull.flags2 |= 32; + userFull.birthday = birthday; + req.flags |= 1; + req.birthday = birthday; + } else { + userFull.flags2 &=~ 32; + userFull.birthday = null; + } + requests.add(req); + + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.premiumPromoUpdated); + } + + if (currentChannel != (channel != null ? channel.id : 0)) { + TLRPC.TL_account_updatePersonalChannel req = new TLRPC.TL_account_updatePersonalChannel(); + req.channel = MessagesController.getInputChannel(channel); + if (channel != null) { + userFull.flags |= 64; + if (userFull.personal_channel_id != channel.id) { + userFull.personal_channel_message = 0; + } + userFull.personal_channel_id = channel.id; + } else { + userFull.flags &=~ 64; + userFull.personal_channel_message = 0; + userFull.personal_channel_id = 0; + } + requests.add(req); + } + + if (requests.isEmpty()) { + finishFragment(); + return; + } + + final int[] requestsReceived = new int[] { 0 }; + for (int i = 0; i < requests.size(); ++i) { + final TLObject req = requests.get(i); + getConnectionsManager().sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (err != null) { + doneButtonDrawable.animateToProgress(0f); + if (req instanceof TLRPC.TL_account_updateBirthday && err.text != null && err.text.startsWith("FLOOD_WAIT_")) { + if (getContext() != null) { + showDialog( + new AlertDialog.Builder(getContext(), resourceProvider) + .setTitle(getString(R.string.PrivacyBirthdayTooOftenTitle)) + .setMessage(getString(R.string.PrivacyBirthdayTooOftenMessage)) + .setPositiveButton(getString(R.string.OK), null) + .create() + ); + } + } else { + BulletinFactory.showError(err); + } + if (req instanceof TLRPC.TL_account_updateBirthday) { + if (oldBirthday != null) { + userFull.flags |= 32; + } else { + userFull.flags &=~ 32; + } + userFull.birthday = oldBirthday; + getMessagesStorage().updateUserInfo(userFull, false); + } + } else if (res instanceof TLRPC.TL_boolFalse) { + doneButtonDrawable.animateToProgress(0f); + BulletinFactory.of(this).createErrorBulletin(LocaleController.getString(R.string.UnknownError)).show(); + } else { + wasSaved = true; + requestsReceived[0]++; + if (requestsReceived[0] == requests.size()) { + finishFragment(); + } + } + }), ConnectionsManager.RequestFlagDoNotWaitFloodWait); + } + getMessagesStorage().updateUserInfo(userFull, false); + getUserConfig().saveConfig(true); + + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.mainUserInfoChanged); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.updateInterfaces, MessagesController.UPDATE_MASK_NAME); + } + + private static class AdminedChannelsFetcher { + public final int currentAccount; + public AdminedChannelsFetcher(int currentAccount) { + this.currentAccount = currentAccount; + } + + public boolean loaded, loading; + public ArrayList chats = new ArrayList<>(); + + public void invalidate() { + loaded = false; + } + + public void fetch() { + if (loaded || loading) return; + loading = true; + TLRPC.TL_channels_getAdminedPublicChannels req = new TLRPC.TL_channels_getAdminedPublicChannels(); + req.for_personal = true; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TLRPC.messages_Chats) { + chats.clear(); + chats.addAll(((TLRPC.messages_Chats) res).chats); + } + MessagesController.getInstance(currentAccount).putChats(chats, false); + loading = false; + loaded = true; + for (Runnable callback : callbacks) { + callback.run(); + } + callbacks.clear(); + })); + } + + private ArrayList callbacks = new ArrayList<>(); + public void subscribe(Runnable whenDone) { + if (loaded) + whenDone.run(); + else + callbacks.add(whenDone); + } + } + + private static class ChooseChannelFragment extends UniversalFragment { + + private AdminedChannelsFetcher channels; + private long selectedChannel; + private Utilities.Callback whenSelected; + + private String query; + + public ChooseChannelFragment( + AdminedChannelsFetcher channels, + long selectedChannel, + Utilities.Callback whenSelected + ) { + super(); + this.channels = channels; + this.selectedChannel = selectedChannel; + this.whenSelected = whenSelected; + channels.subscribe(() -> { + if (listView != null) { + listView.adapter.update(true); + } + }); + } + + private ActionBarMenuItem searchItem; + + @Override + public View createView(Context context) { + searchItem = actionBar.createMenu().addItem(0, R.drawable.ic_ab_search, getResourceProvider()).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { + @Override + public void onSearchExpand() {} + @Override + public void onSearchCollapse() { + query = null; + if (listView != null) { + listView.adapter.update(true); + } + } + + @Override + public void onTextChanged(EditText editText) { + query = editText.getText().toString(); + if (listView != null) { + listView.adapter.update(true); + } + } + }); + searchItem.setSearchFieldHint(LocaleController.getString(R.string.Search)); + searchItem.setContentDescription(LocaleController.getString(R.string.Search)); + searchItem.setVisibility(View.GONE); + + super.createView(context); + return fragmentView; + } + + @Override + protected CharSequence getTitle() { + return getString(R.string.EditProfileChannelTitle); + } + + private final static int BUTTON_REMOVE = 1; + private final static int BUTTON_CREATE = 2; + + @Override + protected void fillItems(ArrayList items, UniversalAdapter adapter) { + if (TextUtils.isEmpty(query)) { + items.add(UItem.asHeader(getString(R.string.EditProfileChannelSelect))); + } + if (TextUtils.isEmpty(query) && selectedChannel != 0) { + items.add(UItem.asButton(BUTTON_REMOVE, R.drawable.msg_archive_hide, getString(R.string.EditProfileChannelHide)).accent()); + } + int count = 0; + for (TLRPC.Chat chat : channels.chats) { + if (chat == null || ChatObject.isMegagroup(chat)) continue; + count++; + if (!TextUtils.isEmpty(query)) { + String lq = query.toLowerCase(), lq2 = AndroidUtilities.translitSafe(lq); + String c = chat.title.toLowerCase(), c2 = AndroidUtilities.translitSafe(c); + if (!( + c.startsWith(lq) || c.contains(" " + lq) || + c2.startsWith(lq2) || c2.contains(" " + lq2) + )) { + continue; + } + } + items.add(UItem.asFilterChat(true, -chat.id).setChecked(selectedChannel == chat.id)); + } + if (TextUtils.isEmpty(query) && count == 0) { + items.add(UItem.asButton(BUTTON_CREATE, R.drawable.msg_channel_create, getString(R.string.EditProfileChannelStartNew)).accent()); + } + items.add(UItem.asShadow(null)); + if (searchItem != null) { + searchItem.setVisibility(count > 5 ? View.VISIBLE : View.GONE); + } + } + + private boolean invalidateAfterPause = false; + + @Override + public void onResume() { + super.onResume(); + if (invalidateAfterPause) { + channels.invalidate(); + channels.subscribe(() -> { + if (listView != null) { + listView.adapter.update(true); + } + }); + invalidateAfterPause = false; + } + } + + @Override + protected void onClick(UItem item, View view, int position, float x, float y) { + if (item.id == BUTTON_REMOVE) { + whenSelected.run(null); + finishFragment(); + } else if (item.id == BUTTON_CREATE) { + invalidateAfterPause = true; + SharedPreferences preferences = MessagesController.getGlobalMainSettings(); + if (!BuildVars.DEBUG_VERSION && preferences.getBoolean("channel_intro", false)) { + Bundle args = new Bundle(); + args.putInt("step", 0); + presentFragment(new ChannelCreateActivity(args)); + } else { + presentFragment(new ActionIntroActivity(ActionIntroActivity.ACTION_TYPE_CHANNEL_CREATE)); + preferences.edit().putBoolean("channel_intro", true).apply(); + } + } else if (item.viewType == UniversalAdapter.VIEW_TYPE_FILTER_CHAT_CHECK) { + finishFragment(); + whenSelected.run(getMessagesController().getChat(-item.dialogId)); + } + } + + @Override + protected boolean onLongClick(UItem item, View view, int position, float x, float y) { + return false; + } + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/UsersSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/UsersSelectActivity.java index cfeab417e..86de3b362 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/UsersSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/UsersSelectActivity.java @@ -1114,17 +1114,15 @@ public class UsersSelectActivity extends BaseFragment implements NotificationCen public GroupCreateAdapter(Context ctx) { context = ctx; - if (type == TYPE_PRIVATE) { + if (noChatTypes) { + usersStartRow = 0; + } else if (type == TYPE_PRIVATE) { usersStartRow = 5 + (doNotNewChats ? 0 : 1); } else if (type == TYPE_FILTER) { - if (!noChatTypes) { - if (isInclude) { - usersStartRow = 7; - } else { - usersStartRow = 5; - } + if (isInclude) { + usersStartRow = 7; } else { - usersStartRow = 0; + usersStartRow = 5; } } else { usersStartRow = 0; @@ -1200,12 +1198,12 @@ public class UsersSelectActivity extends BaseFragment implements NotificationCen count += localServerCount + globalCount; return count; } else { - if (type == TYPE_PRIVATE) { + if (noChatTypes) { + count = 0; + } else if (type == TYPE_PRIVATE) { count = 3 + (doNotNewChats ? 0 : 1); } else if (type == TYPE_FILTER) { - if (noChatTypes) { - count = 0; - } else if (isInclude) { + if (isInclude) { count = 7; } else { count = 5; @@ -1441,16 +1439,16 @@ public class UsersSelectActivity extends BaseFragment implements NotificationCen if (searching) { return 1; } else { - if (type == TYPE_PRIVATE) { + if (noChatTypes) { + if (position == 0) { + return 2; + } + } else if (type == TYPE_PRIVATE) { if (position == 0 || position == 4 + (doNotNewChats ? 0 : 1)) { return 2; } } else if (type == TYPE_FILTER) { - if (noChatTypes) { - if (position == 0) { - return 2; - } - } else if (isInclude) { + if (isInclude) { if (position == 0 || position == 6) { return 2; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/WebviewActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/WebviewActivity.java index 4f65541a3..109877e8b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/WebviewActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/WebviewActivity.java @@ -218,6 +218,7 @@ public class WebviewActivity extends BaseFragment { FrameLayout frameLayout = (FrameLayout) fragmentView; if (Build.VERSION.SDK_INT >= 19) { webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING); } if (Build.VERSION.SDK_INT >= 17) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometry.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometry.java new file mode 100644 index 000000000..c15c2e9ea --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometry.java @@ -0,0 +1,444 @@ +package org.telegram.ui.bots; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Build; +import android.security.keystore.KeyGenParameterSpec; +import android.security.keystore.KeyProperties; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.biometric.BiometricManager; +import androidx.biometric.BiometricPrompt; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; + +import org.json.JSONException; +import org.json.JSONObject; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.MessagesStorage; +import org.telegram.messenger.R; +import org.telegram.messenger.SRPHelper; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.UserObject; +import org.telegram.messenger.Utilities; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.Components.Text; +import org.telegram.ui.LaunchActivity; + +import java.nio.charset.StandardCharsets; +import java.security.KeyPairGenerator; +import java.security.KeyStore; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Map; +import java.util.concurrent.Executor; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +public class BotBiometry { + + public static final String PREF = "2botbiometry_"; + + public final Context context; + public final int currentAccount; + public final long botId; + + public boolean disabled; + public boolean access_granted; + public boolean access_requested; + + private String encrypted_token; + + public BotBiometry(Context context, int currentAccount, long botId) { + this.context = context; + this.currentAccount = currentAccount; + this.botId = botId; + load(); + } + + public void load() { + SharedPreferences prefs = context.getSharedPreferences(PREF + currentAccount, Activity.MODE_PRIVATE); + this.encrypted_token = prefs.getString(String.valueOf(botId), null); + this.access_granted = this.encrypted_token != null; + this.access_requested = this.access_granted || prefs.getBoolean(botId + "_requested", false); + this.disabled = prefs.getBoolean(botId + "_disabled", false); + } + + @Nullable + public static String getAvailableType(Context context) { + try { + BiometricManager manager = BiometricManager.from(context); + if (manager == null) return null; + if (manager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG) != BiometricManager.BIOMETRIC_SUCCESS) { + return null; + } + } catch (Exception e) { + FileLog.e(e); + return null; + } + return "unknown"; + } + + private BiometricPrompt prompt; + + public void requestToken(String reason, Utilities.Callback2 whenDecrypted) { + prompt(reason, true, null, result -> { + String token = null; + if (result != null) { + try { + BiometricPrompt.CryptoObject cryptoObject = result.getCryptoObject(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + if (!TextUtils.isEmpty(encrypted_token)) { + token = encrypted_token.split(";")[0]; + } else { + token = encrypted_token; + } + } else if (cryptoObject != null) { + token = new String(cryptoObject.getCipher().doFinal(Utilities.hexToBytes(encrypted_token.split(";")[0])), StandardCharsets.UTF_8); + } else { + if (!TextUtils.isEmpty(encrypted_token)) { + throw new RuntimeException("No cryptoObject found"); + } + } + } catch (Exception e) { + FileLog.e(e); + result = null; + } + } + whenDecrypted.run(result != null, token); + }); + } + + public void updateToken(String reason, String token, Utilities.Callback whenDone) { + prompt(reason, false, token, result -> { + boolean success = true; + if (result != null) { + try { + BiometricPrompt.CryptoObject cryptoObject = result.getCryptoObject(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + encrypted_token = token; + } else { + if (cryptoObject == null) { + cryptoObject = makeCryptoObject(false); + } + if (cryptoObject != null) { + encrypted_token = Utilities.bytesToHex(cryptoObject.getCipher().doFinal(token.getBytes(StandardCharsets.UTF_8))) + ";" + Utilities.bytesToHex(cryptoObject.getCipher().getIV()); + } else { + throw new RuntimeException("No cryptoObject found"); + } + } + save(); + } catch (Exception e) { + FileLog.e(e); + success = false; + } + } + whenDone.run(success); + }); + } + + private void initPrompt() { + if (prompt != null) return; + final Executor executor = ContextCompat.getMainExecutor(context); + prompt = new BiometricPrompt(LaunchActivity.instance, executor, new BiometricPrompt.AuthenticationCallback() { + @Override + public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { + FileLog.d("BotBiometry onAuthenticationError " + errorCode + " \"" + errString + "\""); + if (callback != null) { + Utilities.Callback thisCallback = callback; + callback = null; + thisCallback.run(null); + } + } + + @Override + public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) { + FileLog.d("BotBiometry onAuthenticationSucceeded"); + if (callback != null) { + Utilities.Callback thisCallback = callback; + callback = null; + thisCallback.run(result); + } + } + + @Override + public void onAuthenticationFailed() { + FileLog.d("BotBiometry onAuthenticationFailed"); + if (callback != null) { + Utilities.Callback thisCallback = callback; + callback = null; + thisCallback.run(null); + } + } + }); + } + + private BiometricPrompt.CryptoObject makeCryptoObject(boolean decrypt) { + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Cipher cipher = getCipher(); + SecretKey secretKey = getSecretKey(); + if (decrypt) { + cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(Utilities.hexToBytes(encrypted_token.split(";")[1]))); + } else { + cipher.init(Cipher.ENCRYPT_MODE, secretKey); + } + return new BiometricPrompt.CryptoObject(cipher); + } + } catch (Exception e) { + FileLog.e(e); + } + return null; + } + + private Utilities.Callback callback; + private void prompt( + String text, + boolean decrypt, + String token, + Utilities.Callback whenDone + ) { + this.callback = whenDone; + try { + initPrompt(); + } catch (Exception e) { + FileLog.e(e); + whenDone.run(null); + return; + } + BiometricPrompt.CryptoObject cryptoObject = makeCryptoObject(decrypt); + final TLRPC.User bot = MessagesController.getInstance(currentAccount).getUser(botId); + final BiometricPrompt.PromptInfo.Builder promptInfoBuilder = new BiometricPrompt.PromptInfo.Builder() + .setTitle(UserObject.getUserName(bot)) + .setNegativeButtonText(LocaleController.getString(R.string.Back)) + .setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_STRONG); + if (!TextUtils.isEmpty(text)) { + promptInfoBuilder.setDescription(text); + } + final BiometricPrompt.PromptInfo promptInfo = promptInfoBuilder.build(); + if (cryptoObject != null && !decrypt) { + try { + encrypted_token = Utilities.bytesToHex(cryptoObject.getCipher().doFinal(token.getBytes(StandardCharsets.UTF_8))) + ";" + Utilities.bytesToHex(cryptoObject.getCipher().getIV()); + save(); + this.callback = null; + whenDone.run(null); + return; + } catch (Exception e) { + FileLog.e(e); + } + cryptoObject = makeCryptoObject(decrypt); + } + if (cryptoObject != null) { + prompt.authenticate(promptInfo, cryptoObject); + } else { + prompt.authenticate(promptInfo); + } + } + + private static KeyStore keyStore; + + @RequiresApi(api = Build.VERSION_CODES.M) + private SecretKey getSecretKey() throws Exception { + if (keyStore == null) { + keyStore = KeyStore.getInstance("AndroidKeyStore"); + keyStore.load(null); + } + if (keyStore.containsAlias("6bot_" + botId)) { + return ((SecretKey) keyStore.getKey("6bot_" + botId, null)); + } else { + KeyGenParameterSpec.Builder keygenBuilder = new KeyGenParameterSpec.Builder( + "6bot_" + botId, + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT + ); + keygenBuilder.setBlockModes(KeyProperties.BLOCK_MODE_CBC); + keygenBuilder.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7); + keygenBuilder.setUserAuthenticationRequired(true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + keygenBuilder.setUserAuthenticationParameters(60, KeyProperties.AUTH_BIOMETRIC_STRONG); + } else { + keygenBuilder.setUserAuthenticationValidityDurationSeconds(60); + } + if (Build.VERSION.SDK_INT >= 24) { + keygenBuilder.setInvalidatedByBiometricEnrollment(true); + } + KeyGenerator keyGenerator = KeyGenerator.getInstance( + KeyProperties.KEY_ALGORITHM_AES, + "AndroidKeyStore" + ); + keyGenerator.init(keygenBuilder.build()); + return keyGenerator.generateKey(); + } + } + + private Cipher getCipher() throws Exception { + return Cipher.getInstance( + KeyProperties.KEY_ALGORITHM_AES + "/" + + KeyProperties.BLOCK_MODE_CBC + "/" + + KeyProperties.ENCRYPTION_PADDING_PKCS7 + ); + } + + public JSONObject getStatus() throws JSONException { + JSONObject object = new JSONObject(); + final String availableType = getAvailableType(context); + if (availableType != null) { + object.put("available", true); + object.put("type", availableType); + } else { + object.put("available", false); + } + object.put("access_requested", access_requested); + object.put("access_granted", access_granted && !disabled); + object.put("token_saved", !TextUtils.isEmpty(encrypted_token)); + object.put("device_id", getDeviceId(context, currentAccount, botId)); + return object; + } + + public static String getDeviceId(Context context, int currentAccount, long botId) { + final SharedPreferences prefs = context.getSharedPreferences(PREF + currentAccount, Activity.MODE_PRIVATE); + String deviceId = prefs.getString("device_id" + botId, null); + if (deviceId == null) { + byte[] bytes = new byte[32]; + new SecureRandom().nextBytes(bytes); + prefs.edit().putString("device_id" + botId, deviceId = Utilities.bytesToHex(bytes)).apply(); + } + return deviceId; + } + + public void save() { + final SharedPreferences prefs = context.getSharedPreferences(PREF + currentAccount, Activity.MODE_PRIVATE); + final SharedPreferences.Editor edit = prefs.edit(); + if (access_requested) { + edit.putBoolean(botId + "_requested", true); + } else { + edit.remove(botId + "_requested"); + } + if (access_granted) { + edit.putString(String.valueOf(botId), encrypted_token == null ? "" : encrypted_token); + } else { + edit.remove(String.valueOf(botId)); + } + if (disabled) { + edit.putBoolean(botId + "_disabled", true); + } else { + edit.remove(botId + "_disabled"); + } + edit.apply(); + } + + public static class Bot { + private Bot(TLRPC.User user, boolean disabled) { + this.user = user; + this.disabled = disabled; + } + public TLRPC.User user; + public boolean disabled; + } + + public static void getBots( + Context context, + int currentAccount, + Utilities.Callback> whenDone + ) { + if (whenDone == null) return; + + final SharedPreferences prefs = context.getSharedPreferences(PREF + currentAccount, Activity.MODE_PRIVATE); + + final ArrayList botIds = new ArrayList<>(); + final ArrayList botDisabled = new ArrayList<>(); + final Map values = prefs.getAll(); + for (Map.Entry entry : values.entrySet()) { + if (!entry.getKey().startsWith("device_id") || !(entry.getValue() instanceof String)) continue; + long botId; + boolean disabled; + try { + botId = Long.parseLong(entry.getKey().substring("device_id".length())); + Boolean disabledValue = (Boolean) values.get(botId + "_disabled"); + disabled = disabledValue != null && disabledValue; + } catch (Exception e) { + FileLog.e(e); + continue; + } + botIds.add(botId); + botDisabled.add(disabled); + } + + if (botIds.isEmpty()) { + whenDone.run(new ArrayList<>()); + return; + } + + MessagesStorage.getInstance(currentAccount).getStorageQueue().postRunnable(() -> { + ArrayList bots = MessagesStorage.getInstance(currentAccount).getUsers(botIds); + AndroidUtilities.runOnUIThread(() -> { + ArrayList result = new ArrayList<>(); + for (int i = 0; i < bots.size(); ++i) { + result.add(new Bot(bots.get(i), i < botDisabled.size() && botDisabled.get(i))); + } + whenDone.run(result); + }); + }); + } + + public static void toggleBotDisabled( + Context context, + int currentAccount, + long botId, + boolean disabled + ) { + final SharedPreferences prefs = context.getSharedPreferences(PREF + currentAccount, Activity.MODE_PRIVATE); + final SharedPreferences.Editor edit = prefs.edit(); + edit.putBoolean(botId + "_disabled", disabled); + if (!disabled && prefs.getString(String.valueOf(botId), null) == null) { + edit.putString(String.valueOf(botId), ""); + } + edit.apply(); + } + + public static void removeBot( + Context context, + int currentAccount, + long botId + ) { + final SharedPreferences prefs = context.getSharedPreferences(PREF + currentAccount, Activity.MODE_PRIVATE); + final SharedPreferences.Editor edit = prefs.edit(); + edit.remove(String.valueOf(botId)).remove(botId + "_requested"); + edit.apply(); + + try { + if (keyStore == null) { + keyStore = KeyStore.getInstance("AndroidKeyStore"); + keyStore.load(null); + } + keyStore.deleteEntry("bot_" + botId); + keyStore.deleteEntry("2bot_" + botId); + } catch (Exception e) { + FileLog.e(e); + } + } + + public static void clear() { + Context context = ApplicationLoader.applicationContext; + if (context == null) return; + for (int i = 0; i < UserConfig.MAX_ACCOUNT_COUNT; ++i) { + final SharedPreferences prefs = context.getSharedPreferences(PREF + i, Activity.MODE_PRIVATE); + prefs.edit().clear().apply(); + } + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometrySettings.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometrySettings.java new file mode 100644 index 000000000..05e577064 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotBiometrySettings.java @@ -0,0 +1,104 @@ +package org.telegram.ui.bots; + +import static org.telegram.messenger.LocaleController.formatPluralString; +import static org.telegram.messenger.LocaleController.getString; + +import android.content.Context; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.view.Gravity; +import android.view.View; +import android.widget.FrameLayout; + +import org.checkerframework.checker.guieffect.qual.UI; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import org.telegram.messenger.UserObject; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BackDrawable; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.AvatarSpan; +import org.telegram.ui.Business.QuickRepliesController; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.UItem; +import org.telegram.ui.Components.UniversalAdapter; +import org.telegram.ui.Components.UniversalRecyclerView; + +import java.util.ArrayList; +import java.util.HashMap; + +public class BotBiometrySettings extends BaseFragment { + + private UniversalRecyclerView listView; + + @Override + public View createView(Context context) { + actionBar.setBackButtonDrawable(new BackDrawable(false)); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(getString(R.string.PrivacyBiometryBots)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } + } + }); + + FrameLayout contentView = new FrameLayout(context); + contentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray, resourceProvider)); + + listView = new UniversalRecyclerView(this, this::fillItems, this::onClick, this::onLongClick); + contentView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); + + BotBiometry.getBots(getContext(), currentAccount, bots -> { + biometryBots.clear(); + biometryBots.addAll(bots); + if (listView != null && listView.adapter != null) { + listView.adapter.update(true); + } + }); + + return fragmentView = contentView; + } + + private final ArrayList biometryBots = new ArrayList<>(); + private final HashMap botName = new HashMap<>(); + + private void fillItems(ArrayList items, UniversalAdapter adapter) { + for (int i = 0; i < biometryBots.size(); ++i) { + BotBiometry.Bot bot = biometryBots.get(i); + SpannableStringBuilder name = botName.get(bot); + if (name == null) { + name = new SpannableStringBuilder(); + name.append("a "); + AvatarSpan avatarSpan = new AvatarSpan(null, currentAccount, 24); + avatarSpan.setUser(bot.user); + name.setSpan(avatarSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + name.append(UserObject.getUserName(bot.user)); + botName.put(bot, name); + } + items.add(UItem.asCheck(i, name).setChecked(!bot.disabled)); + } + items.add(UItem.asShadow(LocaleController.getString(R.string.PrivacyBiometryBotsInfo))); + } + + private void onClick(UItem item, View view, int position, float x, float y) { + if (item.viewType == UniversalAdapter.VIEW_TYPE_CHECK) { + if (item.id < 0 || item.id >= biometryBots.size()) return; + BotBiometry.Bot bot = biometryBots.get(item.id); + bot.disabled = !bot.disabled; + BotBiometry.toggleBotDisabled(getContext(), currentAccount, bot.user.id, bot.disabled); + if (listView != null && listView.adapter != null) { + listView.adapter.update(true); + } + } + } + + private boolean onLongClick(UItem item, View view, int position, float x, float y) { + return false; + } + +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotCommandsMenuContainer.java similarity index 98% rename from TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuContainer.java rename to TMessagesProj/src/main/java/org/telegram/ui/bots/BotCommandsMenuContainer.java index 604c61107..ea8916b5d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotCommandsMenuContainer.java @@ -1,4 +1,4 @@ -package org.telegram.ui.Components; +package org.telegram.ui.bots; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -22,6 +22,8 @@ import androidx.core.view.ViewCompat; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.R; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.RecyclerListView; public class BotCommandsMenuContainer extends FrameLayout implements NestedScrollingParent { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotCommandsMenuView.java similarity index 96% rename from TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java rename to TMessagesProj/src/main/java/org/telegram/ui/bots/BotCommandsMenuView.java index 2a9725307..d8e48dfeb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotCommandsMenuView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotCommandsMenuView.java @@ -1,4 +1,4 @@ -package org.telegram.ui.Components; +package org.telegram.ui.bots; import android.content.Context; import android.graphics.Canvas; @@ -31,6 +31,11 @@ import org.telegram.messenger.R; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.MenuDrawable; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.RecyclerListView; +import org.telegram.ui.Components.StaticLayoutEx; import java.util.ArrayList; @@ -59,14 +64,14 @@ public class BotCommandsMenuView extends View { invalidate(); } }; - boolean expanded; + public boolean expanded; float expandProgress; private String menuText = LocaleController.getString(R.string.BotsMenuTitle); StaticLayout menuTextLayout; boolean isOpened; - boolean isWebView; + public boolean isWebView; boolean isWebViewOpened; Drawable backgroundDrawable; @@ -179,7 +184,7 @@ public class BotCommandsMenuView extends View { canvas.save(); canvas.translate(AndroidUtilities.dp(9.5f), AndroidUtilities.dp(6)); RLottieDrawable drawable = webViewAnimation; - drawable.setBounds(0, 0, drawable.width, drawable.height); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); drawable.draw(canvas); canvas.restore(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotKeyboardView.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotKeyboardView.java similarity index 98% rename from TMessagesProj/src/main/java/org/telegram/ui/Components/BotKeyboardView.java rename to TMessagesProj/src/main/java/org/telegram/ui/bots/BotKeyboardView.java index 9e2bd50a9..6e89dd912 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotKeyboardView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotKeyboardView.java @@ -6,7 +6,7 @@ * Copyright Nikolai Kudashov, 2013-2018. */ -package org.telegram.ui.Components; +package org.telegram.ui.bots; import android.content.Context; import android.util.TypedValue; @@ -23,6 +23,7 @@ import org.telegram.messenger.Emoji; import org.telegram.messenger.R; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.LayoutHelper; import java.util.ArrayList; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewContainer.java similarity index 90% rename from TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java rename to TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewContainer.java index 5f6ae1f75..6c5ab2696 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewContainer.java @@ -1,4 +1,4 @@ -package org.telegram.ui.Components; +package org.telegram.ui.bots; import android.Manifest; import android.animation.Animator; @@ -71,10 +71,17 @@ import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenuSubItem; import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.CameraScanActivity; +import org.telegram.ui.Components.AlertsCreator; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.Bulletin; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.voip.CellFlickerDrawable; +import org.telegram.ui.LaunchActivity; import java.io.File; import java.io.UnsupportedEncodingException; @@ -142,6 +149,7 @@ public abstract class BotWebViewContainer extends FrameLayout implements Notific private boolean hasQRPending; private String lastQrText; + private BotBiometry biometry; public BotWebViewContainer(@NonNull Context context, Theme.ResourcesProvider resourcesProvider, int backgroundColor) { super(context); this.resourcesProvider = resourcesProvider; @@ -1119,6 +1127,7 @@ public abstract class BotWebViewContainer extends FrameLayout implements Notific builder.setPositiveButton(btn.text, (dialog, which) -> { dialog.dismiss(); try { + lastClickMs = System.currentTimeMillis(); notifyEvent("popup_closed", new JSONObject().put("button_id", btn.id)); notifiedClose.set(true); } catch (JSONException e) { @@ -1132,6 +1141,7 @@ public abstract class BotWebViewContainer extends FrameLayout implements Notific builder.setNegativeButton(btn.text, (dialog, which) -> { dialog.dismiss(); try { + lastClickMs = System.currentTimeMillis(); notifyEvent("popup_closed", new JSONObject().put("button_id", btn.id)); notifiedClose.set(true); } catch (JSONException e) { @@ -1145,6 +1155,7 @@ public abstract class BotWebViewContainer extends FrameLayout implements Notific builder.setNeutralButton(btn.text, (dialog, which) -> { dialog.dismiss(); try { + lastClickMs = System.currentTimeMillis(); notifyEvent("popup_closed", new JSONObject().put("button_id", btn.id)); notifiedClose.set(true); } catch (JSONException e) { @@ -1606,6 +1617,172 @@ public abstract class BotWebViewContainer extends FrameLayout implements Notific }); break; } + case "web_app_biometry_get_info": { + notifyBiometryReceived(); + break; + } + case "web_app_biometry_request_access": { + String reason = null; + try { + JSONObject jsonObject = new JSONObject(eventData); + reason = jsonObject.getString("reason"); + } catch (Exception e) {} + final String finalReason = reason; + createBiometry(); + if (biometry == null) { + return; + } + if (biometry.access_requested && biometry.disabled) { + notifyBiometryReceived(); + return; + } + if (!biometry.access_granted) { + Runnable[] cancel = new Runnable[] {() -> { + biometry.access_requested = true; + biometry.save(); + notifyBiometryReceived(); + }}; + AlertDialog.Builder alert = new AlertDialog.Builder(getContext(), resourcesProvider); + if (TextUtils.isEmpty(reason)) { + alert.setTitle(LocaleController.getString(R.string.BotAllowBiometryTitle)); + alert.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString(R.string.BotAllowBiometryMessage, UserObject.getUserName(botUser)))); + } else { + alert.setTitle(AndroidUtilities.replaceTags(LocaleController.formatString(R.string.BotAllowBiometryMessage, UserObject.getUserName(botUser)))); + alert.setMessage(reason); + } + alert.setPositiveButton(LocaleController.getString(R.string.Allow), (di, w) -> { + if (cancel[0] != null) { + cancel[0] = null; + } + biometry.access_requested = true; + biometry.save(); + biometry.requestToken(null, (status, token) -> { + if (status) { + biometry.access_granted = true; + biometry.save(); + } + notifyBiometryReceived(); + }); + }); + alert.setNegativeButton(LocaleController.getString(R.string.Cancel), (di, w) -> { + if (cancel[0] != null) { + cancel[0] = null; + } + biometry.access_requested = true; + biometry.disabled = true; + biometry.save(); + notifyBiometryReceived(); + }); + alert.setOnDismissListener(di -> { + if (cancel[0] != null) { + cancel[0].run(); + cancel[0] = null; + } + }); + alert.show(); + } else { + if (!biometry.access_requested) { + biometry.access_requested = true; + biometry.save(); + } + notifyBiometryReceived(); + } + break; + } + case "web_app_biometry_request_auth": { + String reason = null; + try { + JSONObject jsonObject = new JSONObject(eventData); + reason = jsonObject.getString("reason"); + } catch (Exception e) {} + createBiometry(); + if (biometry == null) { + return; + } + if (!biometry.access_granted) { + try { + JSONObject auth = new JSONObject(); + auth.put("status", "failed"); + notifyEvent("biometry_auth_requested", auth); + } catch (Exception e) { + FileLog.e(e); + } + return; + } + biometry.requestToken(reason, (status, token) -> { + if (status) { + biometry.access_granted = true; + } + try { + JSONObject auth = new JSONObject(); + auth.put("status", status ? "authorized" : "failed"); + auth.put("token", token); + notifyEvent("biometry_auth_requested", auth); + } catch (Exception e) { + FileLog.e(e); + } + }); + break; + } + case "web_app_biometry_update_token": { + String reason = null; + String token; + try { + JSONObject jsonObject = new JSONObject(eventData); + token = jsonObject.getString("token"); + try { + reason = jsonObject.getString("reason"); + } catch (Exception e2) {} + } catch (Exception e) { + FileLog.e(e); + if (e instanceof JSONException) { + error("JSON Parse error"); + } else { + unknownError(); + } + return; + } + createBiometry(); + if (biometry == null) { + return; + } + if (!biometry.access_granted) { + try { + JSONObject auth = new JSONObject(); + auth.put("status", "failed"); + notifyEvent("biometry_token_updated", auth); + } catch (Exception e) { + FileLog.e(e); + } + return; + } + biometry.updateToken(reason, token, status -> { + try { + JSONObject auth = new JSONObject(); + auth.put("status", status ? (TextUtils.isEmpty(token) ? "removed" : "updated") : "failed"); + notifyEvent("biometry_token_updated", auth); + } catch (Exception e) { + FileLog.e(e); + } + }); + break; + } + case "web_app_biometry_open_settings": { + if (isRequestingPageOpen || System.currentTimeMillis() - lastClickMs > 1000) { + return; + } + + lastClickMs = 0; + + BaseFragment lastFragment = LaunchActivity.getLastFragment(); + if (lastFragment == null) return; + BaseFragment.BottomSheetParams params = new BaseFragment.BottomSheetParams(); + params.transitionFromLeft = true; + params.allowNestedScroll = false; + lastFragment.showAsSheet(new BotBiometrySettings(), params); + + break; + } default: { FileLog.d("unknown webapp event " + eventType); break; @@ -1613,6 +1790,32 @@ public abstract class BotWebViewContainer extends FrameLayout implements Notific } } + private void createBiometry() { + if (botUser == null) { + return; + } + if (biometry == null) { + biometry = new BotBiometry(getContext(), currentAccount, botUser.id); + } else { + biometry.load(); + } + } + + private void notifyBiometryReceived() { + if (botUser == null) { + return; + } + createBiometry(); + if (biometry == null) { + return; + } + try { + notifyEvent("biometry_info_received", biometry.getStatus()); + } catch (Exception e) { + FileLog.e(e); + } + } + private void unknownError() { unknownError(null); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewMenuContainer.java similarity index 94% rename from TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java rename to TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewMenuContainer.java index 6abc61426..0399b1abc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewMenuContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewMenuContainer.java @@ -1,4 +1,4 @@ -package org.telegram.ui.Components; +package org.telegram.ui.bots; import static org.telegram.ui.ActionBar.Theme.key_windowBackgroundWhiteBlackText; @@ -10,6 +10,8 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.os.Build; import android.os.Bundle; import android.text.Editable; @@ -30,7 +32,6 @@ import org.json.JSONObject; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; -import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessageObject; @@ -38,6 +39,7 @@ import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.UserObject; +import org.telegram.messenger.browser.Browser; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; @@ -49,6 +51,11 @@ import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.INavigationLayout; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.ChatActivityEnterView; +import org.telegram.ui.Components.ChatAvatarContainer; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.SimpleFloatPropertyCompat; import org.telegram.ui.DialogsActivity; import org.telegram.ui.PaymentFormActivity; @@ -99,6 +106,7 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification private ActionBarMenuItem botMenuItem; private ActionBar.ActionBarMenuOnItemClick actionBarOnItemClick; private ActionBarMenuSubItem settingsItem; + private ActionBarMenuSubItem addToHomeScreenItem; private Editable savedEditText; private MessageObject savedReplyMessageObject; @@ -144,6 +152,13 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification botMenuItem.addSubItem(R.id.menu_reload_page, R.drawable.msg_retry, LocaleController.getString(R.string.BotWebViewReloadPage)); settingsItem = botMenuItem.addSubItem(R.id.menu_settings, R.drawable.msg_settings, LocaleController.getString(R.string.BotWebViewSettings)); settingsItem.setVisibility(View.GONE); + addToHomeScreenItem = botMenuItem.addSubItem(R.id.menu_add_to_home_screen_bot, R.drawable.msg_home, LocaleController.getString(R.string.AddShortcut)); + if (botId != 0 && MediaDataController.getInstance(currentAccount).canCreateAttachedMenuBotShortcut(botId)) { + addToHomeScreenItem.setVisibility(View.VISIBLE); + } else { + addToHomeScreenItem.setVisibility(View.GONE); + } + botMenuItem.addSubItem(R.id.menu_tos_bot, R.drawable.menu_intro, LocaleController.getString(R.string.BotWebViewToS)); } } @@ -256,7 +271,7 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification } else { args1.putLong("chat_id", -did); } - args1.putString("inline_query_input", "@" + UserObject.getPublicUsername(botUser) + " " + query); + args1.putString("start_text", "@" + UserObject.getPublicUsername(botUser) + " " + query); if (MessagesController.getInstance(currentAccount).checkCanOpenChat(args1, fragment)) { fragment.presentFragment(new INavigationLayout.NavigationParams(new ChatActivity(args1)).setRemoveLast(true)); @@ -435,6 +450,9 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification actionBar.setBackgroundColor(backgroundColor); actionBar.setItemsColor(ColorUtils.blendARGB(getColor(Theme.key_actionBarDefaultIcon), actionBarColors.getColor(key_windowBackgroundWhiteBlackText), actionBarTransitionProgress), false); + if (actionBar.backButtonImageView != null) { + actionBar.backButtonImageView.setColorFilter(new PorterDuffColorFilter(ColorUtils.blendARGB(getColor(Theme.key_actionBarDefaultIcon), actionBarColors.getColor(key_windowBackgroundWhiteBlackText), actionBarTransitionProgress), PorterDuff.Mode.SRC_IN)); + } actionBar.setItemsBackgroundColor(ColorUtils.blendARGB(getColor(Theme.key_actionBarDefaultSelector), actionBarColors.getColor(Theme.key_actionBarWhiteSelector), actionBarTransitionProgress), false); ChatAvatarContainer chatAvatarContainer = chatActivity.getAvatarContainer(); @@ -558,6 +576,10 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification webViewContainer.reload(); } else if (id == R.id.menu_settings) { webViewContainer.onSettingsButtonPressed(); + } else if (id == R.id.menu_add_to_home_screen_bot) { + MediaDataController.getInstance(currentAccount).installShortcut(botId, MediaDataController.SHORTCUT_TYPE_ATTACHED_BOT); + } else if (id == R.id.menu_tos_bot) { + Browser.openUrl(getContext(), LocaleController.getString(R.string.BotWebViewToSLink)); } } }); @@ -730,6 +752,14 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification this.botId = botId; this.botUrl = botUrl; + if (addToHomeScreenItem != null) { + if (MediaDataController.getInstance(currentAccount).canCreateAttachedMenuBotShortcut(botId)) { + addToHomeScreenItem.setVisibility(View.VISIBLE); + } else { + addToHomeScreenItem.setVisibility(View.GONE); + } + } + savedEditText = parentEnterView.getEditText(); parentEnterView.getEditField().setText(null); savedReplyMessageObject = parentEnterView.getReplyingMessageObject(); @@ -993,6 +1023,9 @@ public class BotWebViewMenuContainer extends FrameLayout implements Notification this.progress = progress; actionBar.setTitleColor(getColor(Theme.key_windowBackgroundWhiteBlackText)); actionBar.setItemsColor(getColor(Theme.key_windowBackgroundWhiteBlackText), false); + if (actionBar.backButtonImageView != null) { + actionBar.backButtonImageView.setColorFilter(new PorterDuffColorFilter(getColor(Theme.key_windowBackgroundWhiteBlackText), PorterDuff.Mode.SRC_IN)); + } actionBar.setItemsBackgroundColor(getColor(Theme.key_actionBarWhiteSelector), false); actionBar.setPopupBackgroundColor(getColor(Theme.key_actionBarDefaultSubmenuBackground), false); actionBar.setPopupItemsColor(getColor(Theme.key_actionBarDefaultSubmenuItem), false, false); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewSheet.java similarity index 98% rename from TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java rename to TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewSheet.java index bbfcf9d9d..d34885536 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BotWebViewSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/BotWebViewSheet.java @@ -1,4 +1,4 @@ -package org.telegram.ui.Components; +package org.telegram.ui.bots; import static org.telegram.ui.Components.Bulletin.DURATION_PROLONG; @@ -52,6 +52,7 @@ import org.telegram.messenger.R; import org.telegram.messenger.SendMessagesHelper; import org.telegram.messenger.UserObject; import org.telegram.messenger.Utilities; +import org.telegram.messenger.browser.Browser; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; @@ -64,6 +65,16 @@ import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.INavigationLayout; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.Bulletin; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.OverlayActionBarLayoutDialog; +import org.telegram.ui.Components.PasscodeView; +import org.telegram.ui.Components.RadialProgressView; +import org.telegram.ui.Components.SimpleFloatPropertyCompat; +import org.telegram.ui.Components.SizeNotifierFrameLayout; +import org.telegram.ui.Components.VerticalPositionAutoAnimator; import org.telegram.ui.DialogsActivity; import org.telegram.ui.LaunchActivity; import org.telegram.ui.PaymentFormActivity; @@ -412,7 +423,7 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi } else { args1.putLong("chat_id", -did); } - args1.putString("inline_query_input", "@" + UserObject.getPublicUsername(botUser) + " " + query); + args1.putString("start_text", "@" + UserObject.getPublicUsername(botUser) + " " + query); if (parentActivity instanceof LaunchActivity) { BaseFragment lastFragment = ((LaunchActivity) parentActivity).getActionBarLayout().getLastFragment(); @@ -917,12 +928,13 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi settingsItem = otherItem.addSubItem(R.id.menu_settings, R.drawable.msg_settings, LocaleController.getString(R.string.BotWebViewSettings)); settingsItem.setVisibility(View.GONE); otherItem.addSubItem(R.id.menu_reload_page, R.drawable.msg_retry, LocaleController.getString(R.string.BotWebViewReloadPage)); + if (currentBot != null && MediaDataController.getInstance(currentAccount).canCreateAttachedMenuBotShortcut(currentBot.bot_id)) { + otherItem.addSubItem(R.id.menu_add_to_home_screen_bot, R.drawable.msg_home, LocaleController.getString(R.string.AddShortcut)); + } + otherItem.addSubItem(R.id.menu_tos_bot, R.drawable.menu_intro, LocaleController.getString(R.string.BotWebViewToS)); if (currentBot != null && (currentBot.show_in_side_menu || currentBot.show_in_attach_menu)) { otherItem.addSubItem(R.id.menu_delete_bot, R.drawable.msg_delete, LocaleController.getString(R.string.BotWebViewDeleteBot)); } - if (currentBot != null && currentBot.show_in_side_menu && !MediaDataController.getInstance(currentAccount).isShortcutAdded(botId, MediaDataController.SHORTCUT_TYPE_ATTACHED_BOT)) { - otherItem.addSubItem(R.id.menu_add_to_home_screen_bot, R.drawable.msg_home, LocaleController.getString(R.string.AddShortcut)); - } actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { @@ -937,6 +949,8 @@ public class BotWebViewSheet extends Dialog implements NotificationCenter.Notifi ((LaunchActivity) parentActivity).presentFragment(new ChatActivity(bundle)); } dismiss(); + } else if (id == R.id.menu_tos_bot) { + Browser.openUrl(getContext(), LocaleController.getString(R.string.BotWebViewToSLink)); } else if (id == R.id.menu_reload_page) { if (webViewContainer.getWebView() != null) { webViewContainer.getWebView().animate().cancel(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityBotWebViewButton.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/ChatActivityBotWebViewButton.java similarity index 97% rename from TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityBotWebViewButton.java rename to TMessagesProj/src/main/java/org/telegram/ui/bots/ChatActivityBotWebViewButton.java index 76cadd18e..167113dba 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityBotWebViewButton.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/ChatActivityBotWebViewButton.java @@ -1,4 +1,4 @@ -package org.telegram.ui.Components; +package org.telegram.ui.bots; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -15,6 +15,9 @@ import androidx.core.graphics.ColorUtils; import org.telegram.messenger.AndroidUtilities; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.RadialProgressView; +import org.telegram.ui.Components.SimpleFloatPropertyCompat; public class ChatActivityBotWebViewButton extends FrameLayout { public final static SimpleFloatPropertyCompat PROGRESS_PROPERTY = new SimpleFloatPropertyCompat<>("progress", obj -> obj.progress, ChatActivityBotWebViewButton::setProgress) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/bots/ChatAttachAlertBotWebViewLayout.java similarity index 96% rename from TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java rename to TMessagesProj/src/main/java/org/telegram/ui/bots/ChatAttachAlertBotWebViewLayout.java index 38bfbc1e0..e3d0c5382 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertBotWebViewLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/bots/ChatAttachAlertBotWebViewLayout.java @@ -1,4 +1,4 @@ -package org.telegram.ui.Components; +package org.telegram.ui.bots; import static org.telegram.ui.Components.Bulletin.DURATION_PROLONG; @@ -42,6 +42,7 @@ import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.SendMessagesHelper; import org.telegram.messenger.UserObject; +import org.telegram.messenger.browser.Browser; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; @@ -52,6 +53,12 @@ import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChatActivity; +import org.telegram.ui.Components.Bulletin; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.ChatAttachAlert; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.SimpleFloatPropertyCompat; public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlertLayout implements NotificationCenter.NotificationCenterDelegate { private final static int POLL_PERIOD = 60000; @@ -74,6 +81,7 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert private WebViewSwipeContainer swipeContainer; private ActionBarMenuItem otherItem; public ActionBarMenuSubItem settingsItem; + private ActionBarMenuSubItem addToHomeScreenItem; private int measureOffsetY; @@ -159,6 +167,10 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert } } else if (id == R.id.menu_settings) { webViewContainer.onSettingsButtonPressed(); + } else if (id == R.id.menu_add_to_home_screen_bot) { + MediaDataController.getInstance(currentAccount).installShortcut(botId, MediaDataController.SHORTCUT_TYPE_ATTACHED_BOT); + } else if (id == R.id.menu_tos_bot) { + Browser.openUrl(getContext(), LocaleController.getString(R.string.BotWebViewToSLink)); } } @@ -171,6 +183,9 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert settingsItem = otherItem.addSubItem(R.id.menu_settings, R.drawable.msg_settings, LocaleController.getString(R.string.BotWebViewSettings)); settingsItem.setVisibility(View.GONE); otherItem.addSubItem(R.id.menu_reload_page, R.drawable.msg_retry, LocaleController.getString(R.string.BotWebViewReloadPage)); + addToHomeScreenItem = otherItem.addSubItem(R.id.menu_add_to_home_screen_bot, R.drawable.msg_home, LocaleController.getString(R.string.AddShortcut)); + addToHomeScreenItem.setVisibility(View.GONE); + otherItem.addSubItem(R.id.menu_tos_bot, R.drawable.menu_intro, LocaleController.getString(R.string.BotWebViewToS)); otherItem.addSubItem(R.id.menu_delete_bot, R.drawable.msg_delete, LocaleController.getString(R.string.BotWebViewDeleteBot)); webViewContainer = new BotWebViewContainer(context, resourcesProvider, getThemedColor(Theme.key_dialogBackground)) { @@ -460,6 +475,13 @@ public class ChatAttachAlertBotWebViewLayout extends ChatAttachAlert.AttachAlert this.silent = silent; this.replyToMsgId = replyToMsgId; this.startCommand = startCommand; + if (addToHomeScreenItem != null) { + if (MediaDataController.getInstance(currentAccount).canCreateAttachedMenuBotShortcut(botId)) { + addToHomeScreenItem.setVisibility(View.VISIBLE); + } else { + addToHomeScreenItem.setVisibility(View.GONE); + } + } webViewContainer.setBotUser(MessagesController.getInstance(currentAccount).getUser(botId)); webViewContainer.loadFlickerAndSettingsItem(currentAccount, botId, settingsItem); diff --git a/TMessagesProj/src/main/res/drawable-hdpi/filled_add_sticker.png b/TMessagesProj/src/main/res/drawable-hdpi/filled_add_sticker.png new file mode 100644 index 000000000..754a06844 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/filled_add_sticker.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/filled_chatlink_large.png b/TMessagesProj/src/main/res/drawable-hdpi/filled_chatlink_large.png new file mode 100644 index 000000000..88a4bf4c6 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/filled_chatlink_large.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/filled_directions.png b/TMessagesProj/src/main/res/drawable-hdpi/filled_directions.png new file mode 100644 index 000000000..68c556abe Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/filled_directions.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/filled_premium_chatlink.png b/TMessagesProj/src/main/res/drawable-hdpi/filled_premium_chatlink.png new file mode 100644 index 000000000..b3376a27a Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/filled_premium_chatlink.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/filled_premium_intro.png b/TMessagesProj/src/main/res/drawable-hdpi/filled_premium_intro.png new file mode 100644 index 000000000..7df7ea74c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/filled_premium_intro.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/filled_username.png b/TMessagesProj/src/main/res/drawable-hdpi/filled_username.png new file mode 100644 index 000000000..b77d0777f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/filled_username.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/large_ads_info.png b/TMessagesProj/src/main/res/drawable-hdpi/large_ads_info.png new file mode 100644 index 000000000..c49a6b53a Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/large_ads_info.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/large_monetize.png b/TMessagesProj/src/main/res/drawable-hdpi/large_monetize.png new file mode 100644 index 000000000..21f911271 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/large_monetize.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/large_username.png b/TMessagesProj/src/main/res/drawable-hdpi/large_username.png new file mode 100644 index 000000000..2a26b945f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/large_username.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/media_magic_cut.png b/TMessagesProj/src/main/res/drawable-hdpi/media_magic_cut.png new file mode 100644 index 000000000..5e38cc04f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/media_magic_cut.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_cpm.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_cpm.png new file mode 100644 index 000000000..d6c0317c6 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_cpm.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_intro.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_intro.png new file mode 100644 index 000000000..0d2ac26b8 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_intro.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_noads.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_noads.png new file mode 100644 index 000000000..dcec67463 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_noads.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_split.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_split.png new file mode 100644 index 000000000..95addc914 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_split.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_withdrawals.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_withdrawals.png new file mode 100644 index 000000000..5831602ac Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_feature_withdrawals.png differ diff --git a/TMessagesProj_AppStandalone/src/main/res/drawable-hdpi/menu_intro.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_intro.png similarity index 100% rename from TMessagesProj_AppStandalone/src/main/res/drawable-hdpi/menu_intro.png rename to TMessagesProj/src/main/res/drawable-hdpi/menu_intro.png diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_link_create.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_link_create.png new file mode 100644 index 000000000..d6f24424f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_link_create.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_premium_chatlink.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_premium_chatlink.png new file mode 100644 index 000000000..075dcae64 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_premium_chatlink.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_privacy.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_privacy.png new file mode 100644 index 000000000..299551beb Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_privacy.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_sticker_add.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_sticker_add.png new file mode 100644 index 000000000..f2cf2b02c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_sticker_add.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/menu_sticker_select.png b/TMessagesProj/src/main/res/drawable-hdpi/menu_sticker_select.png new file mode 100644 index 000000000..5791ae1f8 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/menu_sticker_select.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/mini_more_dots.png b/TMessagesProj/src/main/res/drawable-hdpi/mini_more_dots.png new file mode 100644 index 000000000..69ac5f9f6 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/mini_more_dots.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/mini_ton.png b/TMessagesProj/src/main/res/drawable-hdpi/mini_ton.png new file mode 100644 index 000000000..f2ebb0a97 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/mini_ton.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/filled_add_sticker.png b/TMessagesProj/src/main/res/drawable-mdpi/filled_add_sticker.png new file mode 100644 index 000000000..87916b847 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/filled_add_sticker.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/filled_chatlink_large.png b/TMessagesProj/src/main/res/drawable-mdpi/filled_chatlink_large.png new file mode 100644 index 000000000..437f62b43 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/filled_chatlink_large.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/filled_directions.png b/TMessagesProj/src/main/res/drawable-mdpi/filled_directions.png new file mode 100644 index 000000000..f26155df3 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/filled_directions.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/filled_premium_chatlink.png b/TMessagesProj/src/main/res/drawable-mdpi/filled_premium_chatlink.png new file mode 100644 index 000000000..34147412a Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/filled_premium_chatlink.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/filled_premium_intro.png b/TMessagesProj/src/main/res/drawable-mdpi/filled_premium_intro.png new file mode 100644 index 000000000..b7e66ab23 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/filled_premium_intro.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/filled_username.png b/TMessagesProj/src/main/res/drawable-mdpi/filled_username.png new file mode 100644 index 000000000..a5c80b4f0 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/filled_username.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/large_ads_info.png b/TMessagesProj/src/main/res/drawable-mdpi/large_ads_info.png new file mode 100644 index 000000000..b9de77b6c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/large_ads_info.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/large_monetize.png b/TMessagesProj/src/main/res/drawable-mdpi/large_monetize.png new file mode 100644 index 000000000..f6974a9c5 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/large_monetize.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/large_username.png b/TMessagesProj/src/main/res/drawable-mdpi/large_username.png new file mode 100644 index 000000000..e95e34d28 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/large_username.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/media_magic_cut.png b/TMessagesProj/src/main/res/drawable-mdpi/media_magic_cut.png new file mode 100644 index 000000000..0e6e2748a Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/media_magic_cut.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_cpm.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_cpm.png new file mode 100644 index 000000000..60ef9e761 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_cpm.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_intro.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_intro.png new file mode 100644 index 000000000..c32c3ea25 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_intro.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_noads.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_noads.png new file mode 100644 index 000000000..020884552 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_noads.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_split.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_split.png new file mode 100644 index 000000000..6ccc64490 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_split.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_withdrawals.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_withdrawals.png new file mode 100644 index 000000000..eee393e9f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_feature_withdrawals.png differ diff --git a/TMessagesProj_AppStandalone/src/main/res/drawable-mdpi/menu_intro.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_intro.png similarity index 100% rename from TMessagesProj_AppStandalone/src/main/res/drawable-mdpi/menu_intro.png rename to TMessagesProj/src/main/res/drawable-mdpi/menu_intro.png diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_link_create.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_link_create.png new file mode 100644 index 000000000..e0c640c93 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_link_create.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_premium_chatlink.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_premium_chatlink.png new file mode 100644 index 000000000..e3b14ac85 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_premium_chatlink.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_privacy.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_privacy.png new file mode 100644 index 000000000..6a811e964 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_privacy.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_sticker_add.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_sticker_add.png new file mode 100644 index 000000000..76cfaecb7 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_sticker_add.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/menu_sticker_select.png b/TMessagesProj/src/main/res/drawable-mdpi/menu_sticker_select.png new file mode 100644 index 000000000..806676102 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/menu_sticker_select.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/mini_more_dots.png b/TMessagesProj/src/main/res/drawable-mdpi/mini_more_dots.png new file mode 100644 index 000000000..c9bf1221e Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/mini_more_dots.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/mini_ton.png b/TMessagesProj/src/main/res/drawable-mdpi/mini_ton.png new file mode 100644 index 000000000..49bd35c27 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/mini_ton.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/filled_add_sticker.png b/TMessagesProj/src/main/res/drawable-xhdpi/filled_add_sticker.png new file mode 100644 index 000000000..a1dd3b502 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/filled_add_sticker.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/filled_chatlink_large.png b/TMessagesProj/src/main/res/drawable-xhdpi/filled_chatlink_large.png new file mode 100644 index 000000000..ddef1ac7b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/filled_chatlink_large.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/filled_directions.png b/TMessagesProj/src/main/res/drawable-xhdpi/filled_directions.png new file mode 100644 index 000000000..5855ce02a Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/filled_directions.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/filled_premium_chatlink.png b/TMessagesProj/src/main/res/drawable-xhdpi/filled_premium_chatlink.png new file mode 100644 index 000000000..d82e0ac2c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/filled_premium_chatlink.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/filled_premium_intro.png b/TMessagesProj/src/main/res/drawable-xhdpi/filled_premium_intro.png new file mode 100644 index 000000000..8e3a9d0a3 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/filled_premium_intro.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/filled_username.png b/TMessagesProj/src/main/res/drawable-xhdpi/filled_username.png new file mode 100644 index 000000000..ff060f08c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/filled_username.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/large_ads_info.png b/TMessagesProj/src/main/res/drawable-xhdpi/large_ads_info.png new file mode 100644 index 000000000..e68709810 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/large_ads_info.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/large_monetize.png b/TMessagesProj/src/main/res/drawable-xhdpi/large_monetize.png new file mode 100644 index 000000000..f672d4fbe Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/large_monetize.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/large_username.png b/TMessagesProj/src/main/res/drawable-xhdpi/large_username.png new file mode 100644 index 000000000..078ee90c5 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/large_username.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/media_magic_cut.png b/TMessagesProj/src/main/res/drawable-xhdpi/media_magic_cut.png new file mode 100644 index 000000000..0a83d7437 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/media_magic_cut.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_cpm.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_cpm.png new file mode 100644 index 000000000..5b790290d Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_cpm.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_intro.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_intro.png new file mode 100644 index 000000000..bc3cea83e Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_intro.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_noads.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_noads.png new file mode 100644 index 000000000..9cf76da40 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_noads.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_split.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_split.png new file mode 100644 index 000000000..496e4cde2 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_split.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_withdrawals.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_withdrawals.png new file mode 100644 index 000000000..0bb2c8f4e Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_feature_withdrawals.png differ diff --git a/TMessagesProj_AppStandalone/src/main/res/drawable-xhdpi/menu_intro.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_intro.png similarity index 100% rename from TMessagesProj_AppStandalone/src/main/res/drawable-xhdpi/menu_intro.png rename to TMessagesProj/src/main/res/drawable-xhdpi/menu_intro.png diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_link_create.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_link_create.png new file mode 100644 index 000000000..e2c5c0360 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_link_create.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_premium_chatlink.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_premium_chatlink.png new file mode 100644 index 000000000..d034483d2 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_premium_chatlink.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_privacy.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_privacy.png new file mode 100644 index 000000000..8d5eff6c2 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_privacy.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_sticker_add.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_sticker_add.png new file mode 100644 index 000000000..0de7829c6 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_sticker_add.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/menu_sticker_select.png b/TMessagesProj/src/main/res/drawable-xhdpi/menu_sticker_select.png new file mode 100644 index 000000000..58961d633 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/menu_sticker_select.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/mini_more_dots.png b/TMessagesProj/src/main/res/drawable-xhdpi/mini_more_dots.png new file mode 100644 index 000000000..0fff3789b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/mini_more_dots.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/mini_ton.png b/TMessagesProj/src/main/res/drawable-xhdpi/mini_ton.png new file mode 100644 index 000000000..265eb21a5 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/mini_ton.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/filled_add_sticker.png b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_add_sticker.png new file mode 100644 index 000000000..c80eed3b8 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_add_sticker.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/filled_chatlink_large.png b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_chatlink_large.png new file mode 100644 index 000000000..9783dac50 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_chatlink_large.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/filled_directions.png b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_directions.png new file mode 100644 index 000000000..eaf9484e1 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_directions.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/filled_premium_chatlink.png b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_premium_chatlink.png new file mode 100644 index 000000000..b149a6f6b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_premium_chatlink.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/filled_premium_intro.png b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_premium_intro.png new file mode 100644 index 000000000..e15fe4b27 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_premium_intro.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/filled_username.png b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_username.png new file mode 100644 index 000000000..842a9e2dc Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/filled_username.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/large_ads_info.png b/TMessagesProj/src/main/res/drawable-xxhdpi/large_ads_info.png new file mode 100644 index 000000000..09cead34d Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/large_ads_info.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/large_monetize.png b/TMessagesProj/src/main/res/drawable-xxhdpi/large_monetize.png new file mode 100644 index 000000000..06e019d3b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/large_monetize.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/large_username.png b/TMessagesProj/src/main/res/drawable-xxhdpi/large_username.png new file mode 100644 index 000000000..9dbe1af0f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/large_username.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/media_magic_cut.png b/TMessagesProj/src/main/res/drawable-xxhdpi/media_magic_cut.png new file mode 100644 index 000000000..a123d28d7 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/media_magic_cut.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_cpm.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_cpm.png new file mode 100644 index 000000000..5bfd721c9 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_cpm.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_intro.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_intro.png new file mode 100644 index 000000000..24d3f0aa0 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_intro.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_noads.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_noads.png new file mode 100644 index 000000000..49862e4f8 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_noads.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_split.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_split.png new file mode 100644 index 000000000..db36d1baa Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_split.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_withdrawals.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_withdrawals.png new file mode 100644 index 000000000..b1a86816e Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_feature_withdrawals.png differ diff --git a/TMessagesProj_AppStandalone/src/main/res/drawable-xxhdpi/menu_intro.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_intro.png similarity index 100% rename from TMessagesProj_AppStandalone/src/main/res/drawable-xxhdpi/menu_intro.png rename to TMessagesProj/src/main/res/drawable-xxhdpi/menu_intro.png diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_link_create.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_link_create.png new file mode 100644 index 000000000..96054886c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_link_create.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_premium_chatlink.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_premium_chatlink.png new file mode 100644 index 000000000..96615b318 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_premium_chatlink.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_privacy.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_privacy.png new file mode 100644 index 000000000..9f5272866 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_privacy.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_sticker_add.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_sticker_add.png new file mode 100644 index 000000000..2ff86bb8f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_sticker_add.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/menu_sticker_select.png b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_sticker_select.png new file mode 100644 index 000000000..7dd129288 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/menu_sticker_select.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/mini_more_dots.png b/TMessagesProj/src/main/res/drawable-xxhdpi/mini_more_dots.png new file mode 100644 index 000000000..eeb470c99 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/mini_more_dots.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/mini_ton.png b/TMessagesProj/src/main/res/drawable-xxhdpi/mini_ton.png new file mode 100644 index 000000000..feff77a7d Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/mini_ton.png differ diff --git a/TMessagesProj/src/main/res/raw/biz_links.json b/TMessagesProj/src/main/res/raw/biz_links.json new file mode 100644 index 000000000..156b24c7a --- /dev/null +++ b/TMessagesProj/src/main/res/raw/biz_links.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":125,"w":512,"h":512,"nm":"Link in Bubble","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL LINK 2","parent":9,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":38,"s":[-14]},{"t":46,"s":[0]}]},"p":{"a":0,"k":[254,226.5,0]},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":38,"s":[37,37,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":46,"s":[51.923,50,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":57,"s":[39,39,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":69,"s":[47,47,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":83,"s":[42,42,100]},{"t":100,"s":[44,44,100]}]}},"ao":0,"ip":38,"op":182,"st":2,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Cover Link 2","parent":4,"sr":1,"ks":{"r":{"a":0,"k":-45},"p":{"a":0,"k":[249.572,229.153,0]},"a":{"a":0,"k":[299.879,302.591,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[0.23,37.05],[7.53,17.366]],"o":[[-0.152,-24.502],[-7.92,-18.265]],"v":[[27.769,-53.825],[19.958,-116.707]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[5.919,36.188],[12.208,5.059]],"o":[[-5.405,-28.467],[-7.61,-7.16]],"v":[[48.236,-72.136],[30.03,-127.659]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[2.774,36.81],[40.296,-19.616]],"o":[[-1.095,-56.34],[-17.736,6.511]],"v":[[55.416,-74.099],[-16.862,-144.939]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[9.712,35.614],[35.839,-26.909]],"o":[[-11.772,-55.107],[-16.177,9.76]],"v":[[60.601,-82.74],[-25.651,-136.944]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[11.608,35.327],[41.5,-35.765]],"o":[[-10.657,-32.433],[-17.829,15.365]],"v":[[61.987,-104.972],[-30.073,-137.282]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[11.608,35.327],[30.025,-26.253]],"o":[[-10.657,-32.433],[-17.718,15.492]],"v":[[61.987,-104.972],[-16.242,-145.552]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[20.038,31.324],[25.066,0.514]],"o":[[-17.83,-27.872],[-23.531,-0.483]],"v":[[70.955,-103.478],[4.417,-149.286]],"c":false}]},{"t":66,"s":[{"i":[[13.9,23.591],[13.449,8.672]],"o":[[-9.192,-15.601],[-17.207,-11.095]],"v":[[93.096,-94.997],[58.772,-131.374]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.662745118141,0.585888981819,0.483414083719,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.843,325.871]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Strk 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-2.061,21.45],[-19.028,22.898]],"o":[[0.887,-9.235],[5.468,-6.58]],"v":[[-31.873,-33.15],[-13.753,-119.939]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[-0.035,22.006],[0.235,-5.192]],"o":[[-0.413,-14.333],[-2.302,-4.694]],"v":[[0.658,-36.119],[29.092,-113.088]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-2.957,22.219],[24.384,-27.235]],"o":[[2.109,-17.651],[-6.726,-5.271]],"v":[[7.526,-42.695],[-21.702,-96.948]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[1.315,22.377],[18.769,-31.369]],"o":[[-1.28,-17.731],[-7.605,-3.898]],"v":[[17.706,-41.19],[-21.291,-88.907]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[1.99,22.562],[13.349,4.391]],"o":[[-1.714,-19.43],[-10.22,-3.362]],"v":[[36.596,-55.813],[3.754,-106.857]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[1.99,22.562],[13.349,4.391]],"o":[[-1.714,-19.43],[-10.22,-3.362]],"v":[[29.541,-56.214],[3.754,-106.857]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[2.899,22.463],[13.349,4.391]],"o":[[-3.095,-23.984],[-10.22,-3.362]],"v":[[42.993,-54.975],[6.078,-112.202]],"c":false}]},{"t":66,"s":[{"i":[[8.04,19.241],[15.777,7.794]],"o":[[-6.924,-16.57],[-8.817,-4.356]],"v":[[64.84,-63.573],[31.458,-101.777]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.843,325.871]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Strk 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-0.474,4.02],[-12.28,32.076],[19.905,-7.422],[-2.147,-28.209]],"o":[[1.636,-31.189],[1.616,-8.404],[-8.928,24.312],[3.445,0.614]],"v":[[-10.147,-35.314],[-3.674,-109.342],[-16.825,-116.435],[-29.49,-30.681]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[-0.124,6.092],[0.598,7.942],[3.589,-0.563],[12.006,-45.307]],"o":[[-0.306,-23.651],[-0.835,-2.731],[3.464,-7.27],[2.596,-1.648]],"v":[[19.629,-40.227],[19.303,-91.479],[18.411,-93.158],[3.489,-35.051]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-1.853,10.639],[31.742,-35.712],[1.858,-5.432],[-6.45,-32.375]],"o":[[-0.25,-56.475],[-1.367,-0.75],[34.627,-40.743],[1.781,4.84]],"v":[[27.055,-47.648],[-31.64,-118.338],[-30.732,-87.192],[10.571,-41.93]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0.2,10.798],[23.825,-36.813],[0.793,-5.686],[-12.48,-30.562]],"o":[[-2.495,-32.698],[-1.485,-0.477],[26.262,-46.576],[2.668,4.414]],"v":[[35.933,-49.799],[-32.18,-113.322],[-29.516,-79.098],[20.834,-41.055]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0.227,8.164],[43.793,-25.995],[-3.03,-5.339],[-14.547,-31.032]],"o":[[-0.792,-17.982],[-2.105,1.109],[30.638,-32.101],[1.747,-3.91]],"v":[[44.151,-68.79],[-31.337,-122.859],[-26.166,-95.414],[39.874,-56.144]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[0.227,8.164],[33.134,-8.952],[-3.03,-5.339],[-14.547,-31.032]],"o":[[-3.92,-21.771],[-2.105,1.109],[26.921,-8.088],[1.181,9.446]],"v":[[47.005,-62.844],[-10.111,-139.12],[-9.129,-115.936],[32.819,-56.546]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[0.227,8.164],[20.188,3.776],[1.443,-6.775],[-15.32,-40.121]],"o":[[-11.646,-32.085],[-2.105,1.109],[20.448,-1.962],[1.747,-3.91]],"v":[[58.638,-73.722],[1.969,-135.936],[-6.374,-117.574],[47.799,-56.622]],"c":true}]},{"t":66,"s":[{"i":[[-1.875,5.625],[10.175,5.812],[3.231,-4.464],[-7.858,-21.526]],"o":[[-9.187,-24.25],[-4.7,5.625],[18.918,9.814],[2.804,-2.462]],"v":[[83,-76],[44.7,-123],[33.769,-109.911],[73.446,-61.413]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.996,326.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Whte","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-5.335,-14.36],[2.526,-27.816],[-1.369,3.376],[55.146,-24.546]],"o":[[9.863,28.671],[-0.182,2.001],[0.396,-25.825],[15.487,-4.379]],"v":[[13.108,-8.292],[17.34,57.154],[27.393,46.413],[-17.414,-17.183]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[-3.491,-6.929],[-2.997,-39.048],[-0.351,3.552],[8.691,1.002]],"o":[[4.269,4.528],[0.079,2],[-6.671,-31.796],[3.722,1.952]],"v":[[29.888,-20.893],[43.721,39.776],[48.214,28.057],[31.974,-27.67]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-2.128,-2.883],[3.994,-69.277],[-0.374,3.665],[46.489,-28.866]],"o":[[35.074,-25.763],[-0.132,2.011],[-3.034,-62.211],[1.793,-0.196]],"v":[[-23.286,-30.073],[49.11,38.06],[55.406,26.121],[-21.592,-42.027]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[-2.636,-2.426],[-9.231,-68.775],[0.328,3.67],[40.163,-37.167]],"o":[[29.545,-31.954],[0.252,2],[-14.375,-65.017],[1.723,-0.532]],"v":[[-28.952,-21.185],[55.064,31.964],[60.816,17.422],[-29.558,-33.243]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-2.097,-0.04],[-8.521,-50.279],[0.668,3.728],[37.166,-39.692]],"o":[[25.587,-26.085],[0.339,1.999],[-13.739,-37.767],[3.845,0.447]],"v":[[-24.521,-35.882],[57.427,10.477],[62.32,-4.825],[-31.987,-36.455]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-2.097,-0.04],[-8.521,-50.279],[0.668,3.728],[25.801,-27.934]],"o":[[25.587,-26.085],[0.339,1.999],[-13.739,-37.767],[3.845,0.447]],"v":[[-10.689,-44.152],[58.778,12.664],[61.58,-0.73],[-18.155,-44.725]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[-0.934,-1.878],[-14.346,-30.902],[0.668,3.728],[24.189,-0.431]],"o":[[12.306,-0.639],[0.854,1.839],[-18.032,-30.133],[1.381,3.616]],"v":[[4.76,-44.065],[66.648,10.703],[71.289,-3.332],[1.817,-50.951]],"c":true}]},{"t":66,"s":[{"i":[[0.518,-1.441],[-7.44,-18.663],[-0.277,2.64],[16.232,9.781]],"o":[[13.234,9.941],[0.535,1.343],[-9.071,-16.64],[-1.336,2.602]],"v":[[52.607,-25.309],[83.833,16.842],[93.152,4.86],[57.086,-33.727]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.816,0.702,0.553,0.5,0.816,0.702,0.553,1,0.816,0.702,0.553,0.475,1,0.737,0.5,1,0]}},"s":{"a":0,"k":[86,-16]},"e":{"a":0,"k":[73.5,2.5]},"t":1,"nm":"Gradient_Js36NDBEHR","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.435,0.239,0.271,0.5,0.435,0.239,0.271,1,0.435,0.239,0.271,0.918,1,0.959,0.56,1,0.12]}},"s":{"a":0,"k":[-9.5,79]},"e":{"a":0,"k":[107.5,125]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_037PszTUQU","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[256,256]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shad grad","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-6.341,7.042],[3.118,15.411],[6.055,-14.959],[-2.4,-51.652]],"o":[[2.58,-33.424],[-3.188,-12.768],[-8.09,31.6],[9.298,-2.605]],"v":[[27.347,-47.558],[22.593,-113.258],[-21.635,-109.372],[-31.921,-33.494]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[-4.059,8.595],[6.986,-4.989],[-3.176,-9.609],[20.09,-50.575]],"o":[[-4.813,-36.272],[-0.049,-0.805],[-11.664,7.033],[17.929,-0.616]],"v":[[47.89,-68.261],[29.667,-123.62],[33.359,-112.698],[0.501,-36.486]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-4.319,8.974],[36.754,-36.291],[-4.192,-11.834],[-1.151,-24.093]],"o":[[0.584,-64.624],[1.516,6.636],[4.049,20.743],[16.519,6.114]],"v":[[54.692,-71.878],[-25.396,-136.209],[2.496,-109.59],[7.371,-43.073]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[-2.537,9.631],[29.195,-42.609],[-6.362,-10.822],[-5.704,-23.436]],"o":[[-11.696,-63.56],[2.749,6.227],[7.914,19.597],[7.369,-7.504]],"v":[[60.305,-80.46],[-32.378,-126.791],[0.061,-105.952],[17.476,-41.57]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-1.776,10.148],[30.954,-32.175],[5.251,-10.692],[-12.492,-22.352]],"o":[[-12.206,-39.121],[3.936,10.027],[17.858,7.981],[6.983,-8.484]],"v":[[61.716,-103.489],[-29.432,-137.914],[4.4,-105.268],[36.33,-56.2]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-0.287,34.156],[22.451,-23.195],[5.251,-10.692],[-12.492,-22.352]],"o":[[-12.206,-39.121],[3.936,10.027],[17.858,7.981],[6.983,-8.484]],"v":[[61.716,-103.489],[-15.6,-146.184],[4.4,-105.268],[29.275,-56.602]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[-1.776,10.148],[14.514,-1.544],[1.271,-10.685],[-5.392,-29.063]],"o":[[-18.467,-38.127],[-1.927,11.622],[17.858,7.981],[6.983,-8.484]],"v":[[70.685,-101.996],[5.178,-148.822],[6.724,-110.613],[42.727,-55.363]],"c":true}]},{"t":66,"s":[{"i":[[-4.445,6.735],[4.952,3.085],[8.154,-6.673],[-7.056,-16.887]],"o":[[-9.445,-22.265],[-3.423,6.46],[16.277,7.706],[9.362,-4.942]],"v":[[92.445,-93.985],[59.048,-130.71],[31.721,-100.577],[63.638,-65.308]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.505882382393,0.643137276173,0.800000071526,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.996,326.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Fill","bm":0,"hd":false}],"ip":38,"op":182,"st":2,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"LINK R 2","parent":1,"sr":1,"ks":{"r":{"a":0,"k":45},"p":{"a":0,"k":[69.85,-70.136,0]},"a":{"a":0,"k":[767.798,251.015,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-1.453,2.994],[-1.804,-6.225],[-29.694,-19],[1.905,5.5]],"o":[[1.376,20.474],[-0.866,0.958],[-33.965,-1.125],[51.574,23.582]],"v":[[781.355,308.857],[784.85,347.025],[770.305,402.875],[722.019,347.625]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[-1.066,2.994],[-0.027,-5.396],[-26.193,-19],[1.398,5.5]],"o":[[1.01,20.474],[-0.013,0.831],[-29.959,-1.125],[40.735,38.021]],"v":[[804.238,314.499],[806.386,333.935],[770.591,402.875],[747.335,345.031]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[1.108,2.994],[0.028,-5.396],[-42.254,-25.87],[-1.453,5.5]],"o":[[-1.05,20.474],[0.013,0.831],[31.145,-1.125],[-42.347,38.021]],"v":[[748.544,314.499],[746.311,333.935],[783.524,402.875],[807.7,345.031]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[4.468,3.042],[4.501,-5.796],[32.389,-19],[-2.134,5.5]],"o":[[-3.699,20.8],[2.25,0.892],[37.047,-1.125],[-27.414,20.225]],"v":[[777.617,313.458],[763.669,340.295],[778.811,402.875],[825.636,345.97]],"c":true}]},{"t":70,"s":[{"i":[[11,3.125],[13,-6.5],[56.5,-19],[-3.625,5.5]],"o":[[-8.875,21.375],[6.5,1],[64.625,-1.125],[-4.875,-11.125]],"v":[[829.25,311.625],[792.75,351.5],[772.375,402.875],[864.25,347.625]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.219607858097,0.239215701234,0.254901960784,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":40},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[33.438,0],[0,99.837],[-33.438,0],[0,-99.837]],"o":[[-33.438,0],[0,-99.837],[33.438,0],[0,99.837]],"v":[[5.676,147.947],[-54.869,0],[5.676,-147.947],[66.221,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[29.495,0],[0,99.837],[-30.345,0],[0,-99.837]],"o":[[-29.495,0],[0,-99.837],[30.345,0],[0,99.837]],"v":[[5.646,147.947],[-23.926,-4.751],[6.339,-147.947],[40.284,2.858]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-30.662,0],[0,99.837],[31.546,0],[0,-99.837]],"o":[[30.662,0],[0,-99.837],[-31.546,0],[0,99.837]],"v":[[13.779,147.947],[44.521,-4.751],[13.059,-147.947],[-22.229,2.858]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-36.473,0],[0,99.837],[37.08,0],[0,-99.837]],"o":[[36.473,0],[0,-99.837],[-37.08,0],[0,99.837]],"v":[[8.602,147.947],[67.136,-3.031],[4.243,-147.532],[-52.902,1.823]],"c":true}]},{"t":70,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":39.1},"e":{"a":0,"k":46.4},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.662745118141,0.585888981819,0.483414083719,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[33.438,0],[0,99.837],[-33.438,0],[0,-99.837]],"o":[[-33.438,0],[0,-99.837],[33.438,0],[0,99.837]],"v":[[5.676,147.947],[-54.869,0],[5.676,-147.947],[66.221,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[29.495,0],[0,99.837],[-30.345,0],[0,-99.837]],"o":[[-29.495,0],[0,-99.837],[30.345,0],[0,99.837]],"v":[[5.646,147.947],[-23.926,-4.751],[6.339,-147.947],[40.284,2.858]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-30.662,0],[0,99.837],[31.546,0],[0,-99.837]],"o":[[30.662,0],[0,-99.837],[-31.546,0],[0,99.837]],"v":[[13.779,147.947],[44.521,-4.751],[13.059,-147.947],[-22.229,2.858]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-36.473,0],[0,99.837],[37.08,0],[0,-99.837]],"o":[[36.473,0],[0,-99.837],[-37.08,0],[0,99.837]],"v":[[8.602,147.947],[67.136,-3.031],[4.243,-147.532],[-52.902,1.823]],"c":true}]},{"t":70,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":46.6},"e":{"a":0,"k":83.8},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.23667819798,0.439364284277,0.635294139385,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[33.438,0],[0,99.837],[-33.438,0],[0,-99.837]],"o":[[-33.438,0],[0,-99.837],[33.438,0],[0,99.837]],"v":[[5.676,147.947],[-54.869,0],[5.676,-147.947],[66.221,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[29.495,0],[0,99.837],[-30.345,0],[0,-99.837]],"o":[[-29.495,0],[0,-99.837],[30.345,0],[0,99.837]],"v":[[5.646,147.947],[-23.926,-4.751],[6.339,-147.947],[40.284,2.858]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-30.662,0],[0,99.837],[31.546,0],[0,-99.837]],"o":[[30.662,0],[0,-99.837],[-31.546,0],[0,99.837]],"v":[[13.779,147.947],[44.521,-4.751],[13.059,-147.947],[-22.229,2.858]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-36.473,0],[0,99.837],[37.08,0],[0,-99.837]],"o":[[36.473,0],[0,-99.837],[-37.08,0],[0,99.837]],"v":[[8.602,147.947],[67.136,-3.031],[4.243,-147.532],[-52.902,1.823]],"c":true}]},{"t":70,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":75.5},"e":{"a":0,"k":95.6},"o":{"a":0,"k":63},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[33.438,0],[0,99.837],[-33.438,0],[0,-99.837]],"o":[[-33.438,0],[0,-99.837],[33.438,0],[0,99.837]],"v":[[5.676,147.947],[-54.869,0],[5.676,-147.947],[66.221,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[29.495,0],[0,99.837],[-30.345,0],[0,-99.837]],"o":[[-29.495,0],[0,-99.837],[30.345,0],[0,99.837]],"v":[[5.646,147.947],[-23.926,-4.751],[6.339,-147.947],[40.284,2.858]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-30.662,0],[0,99.837],[31.546,0],[0,-99.837]],"o":[[30.662,0],[0,-99.837],[-31.546,0],[0,99.837]],"v":[[13.779,147.947],[44.521,-4.751],[13.059,-147.947],[-22.229,2.858]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-36.473,0],[0,99.837],[37.08,0],[0,-99.837]],"o":[[36.473,0],[0,-99.837],[-37.08,0],[0,99.837]],"v":[[8.602,147.947],[67.136,-3.031],[4.243,-147.532],[-52.902,1.823]],"c":true}]},{"t":70,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.423529446125,0.427451014519,0.415686309338,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[767.298,251.015]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 111","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[8.008,-0.004],[0.428,48.036],[-8.008,0.004],[-0.428,-48.037]],"o":[[-8.008,0.004],[-0.428,-48.037],[8.008,-0.004],[0.428,48.037]],"v":[[20.477,103.781],[0.266,4.3],[15.483,-102.313],[36.538,0.366]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[0.118,-0.003],[0.006,41.636],[-0.118,0.003],[-0.006,-41.636]],"o":[[-0.118,0.003],[-0.006,-41.636],[0.118,-0.003],[0.006,41.636]],"v":[[38.639,89.656],[38.34,3.43],[36.055,-87.294],[38.877,0.02]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-0.123,-0.003],[-0.007,41.636],[0.123,0.003],[0.007,-41.636]],"o":[[0.123,0.003],[0.007,-41.636],[-0.123,-0.003],[-0.007,41.636]],"v":[[-21.539,89.656],[-21.229,3.43],[-18.853,-87.294],[-21.786,0.02]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-12.526,-0.002],[-0.004,44.718],[16.165,0.002],[0.004,-44.718]],"o":[[12.526,0.002],[0.004,-44.718],[-16.165,-0.002],[-0.004,44.718]],"v":[[-4.68,96.516],[17.134,2.259],[-5.115,-95.009],[-24.085,-0.571]],"c":true}]},{"t":70,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":9.1},"e":{"a":0,"k":38.5},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294133425,0.4392157197,0.635294139385,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[8.008,-0.004],[0.428,48.036],[-8.008,0.004],[-0.428,-48.037]],"o":[[-8.008,0.004],[-0.428,-48.037],[8.008,-0.004],[0.428,48.037]],"v":[[20.477,103.781],[0.266,4.3],[15.483,-102.313],[36.538,0.366]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[0.118,-0.003],[0.006,41.636],[-0.118,0.003],[-0.006,-41.636]],"o":[[-0.118,0.003],[-0.006,-41.636],[0.118,-0.003],[0.006,41.636]],"v":[[38.639,89.656],[38.34,3.43],[36.055,-87.294],[38.877,0.02]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-0.123,-0.003],[-0.007,41.636],[0.123,0.003],[0.007,-41.636]],"o":[[0.123,0.003],[0.007,-41.636],[-0.123,-0.003],[-0.007,41.636]],"v":[[-21.539,89.656],[-21.229,3.43],[-18.853,-87.294],[-21.786,0.02]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-12.526,-0.002],[-0.004,44.718],[16.165,0.002],[0.004,-44.718]],"o":[[12.526,0.002],[0.004,-44.718],[-16.165,-0.002],[-0.004,44.718]],"v":[[-4.68,96.516],[17.134,2.259],[-5.115,-95.009],[-24.085,-0.571]],"c":true}]},{"t":70,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":58.1},"e":{"a":0,"k":94.4},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.423529446125,0.427451014519,0.415686309338,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[8.008,-0.004],[0.428,48.036],[-8.008,0.004],[-0.428,-48.037]],"o":[[-8.008,0.004],[-0.428,-48.037],[8.008,-0.004],[0.428,48.037]],"v":[[20.477,103.781],[0.266,4.3],[15.483,-102.313],[36.538,0.366]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[0.118,-0.003],[0.006,41.636],[-0.118,0.003],[-0.006,-41.636]],"o":[[-0.118,0.003],[-0.006,-41.636],[0.118,-0.003],[0.006,41.636]],"v":[[38.639,89.656],[38.34,3.43],[36.055,-87.294],[38.877,0.02]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-0.123,-0.003],[-0.007,41.636],[0.123,0.003],[0.007,-41.636]],"o":[[0.123,0.003],[0.007,-41.636],[-0.123,-0.003],[-0.007,41.636]],"v":[[-21.539,89.656],[-21.229,3.43],[-18.853,-87.294],[-21.786,0.02]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-12.526,-0.002],[-0.004,44.718],[16.165,0.002],[0.004,-44.718]],"o":[[12.526,0.002],[0.004,-44.718],[-16.165,-0.002],[-0.004,44.718]],"v":[[-4.68,96.516],[17.134,2.259],[-5.115,-95.009],[-24.085,-0.571]],"c":true}]},{"t":70,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[767.798,251.015]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 110","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[5.337,-41.764],[-10.867,-33.78],[-0.116,1.32],[-8.138,48.625]],"o":[[-4.898,38.33],[1.082,-3.98],[-3.452,-36.335],[3.819,-22.817]],"v":[[-87.948,-88.009],[-86.146,66.477],[-88.741,78.408],[-91.882,-90.359]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[0.079,-36.199],[-0.161,-29.279],[0.002,1.144],[-0.12,42.146]],"o":[[-0.072,33.222],[0.016,-3.45],[-0.051,-31.493],[0.056,-19.777]],"v":[[-59.096,-77.672],[-59.069,56.23],[-59.107,66.571],[-59.154,-79.708]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-0.082,-36.199],[0.167,-29.279],[-0.002,1.144],[0.125,42.146]],"o":[[0.075,33.222],[-0.017,-3.45],[0.053,-31.493],[-0.059,-19.777]],"v":[[-118.947,-77.672],[-118.975,56.23],[-118.935,66.571],[-118.886,-79.708]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-6.137,-37.963],[7.234,-30.909],[0.326,1.229],[5.417,44.492]],"o":[[7.734,39.975],[-0.72,-3.642],[8.056,-33.826],[-2.542,-20.878]],"v":[[-75.258,-77.098],[-79.138,69.134],[-80.761,72.327],[-76.497,-77.877]],"c":true}]},{"t":70,"s":[{"i":[[-17.647,-41.07],[20.676,-33.78],[0.949,1.378],[15.484,48.625]],"o":[[22.288,51.87],[-2.059,-3.98],[23.261,-37.935],[-7.266,-22.817]],"v":[[3.839,-76.089],[-7.36,91.865],[-12.133,82.466],[0.144,-74.651]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.21960785985,0.239215701818,0.254901975393,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[865.372,259.218]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 9","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-0.298,48.986],[13.272,-0.007],[-0.709,-79.51],[-2.281,-25.859],[-0.671,5.385],[0.215,24.182],[-8.228,0.004],[-0.768,-44.707],[3.669,-40.223]],"o":[[0.141,-23.184],[-6.632,0.003],[0.087,9.71],[0.628,-5.027],[-1.795,-22.632],[-0.541,-60.749],[7.534,-0.004],[0.31,34.796],[-0.516,5.654]],"v":[[41.972,53.24],[23.767,-92.963],[6.222,29.649],[20.059,110.376],[21.267,100.922],[7.949,29.087],[24.489,-77.894],[45.607,21.01],[36.299,117.759]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[-0.004,42.459],[0.196,-0.006],[-0.01,-68.915],[-0.034,-22.414],[-0.01,4.668],[0.003,20.959],[-0.122,0.004],[-0.006,-38.75],[0.054,-34.864]],"o":[[0.002,-20.095],[-0.098,0.003],[0.001,8.416],[0.009,-4.357],[-0.027,-19.616],[-0.008,-52.654],[0.111,-0.003],[0.005,30.16],[-0.008,4.9]],"v":[[47.929,49.547],[44.481,-65.03],[47.4,29.099],[47.604,99.07],[47.622,90.875],[47.425,28.612],[45.318,-61.774],[47.982,21.612],[47.845,105.468]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[0.005,42.459],[-0.204,-0.006],[0.011,-68.915],[0.035,-22.414],[0.01,4.668],[-0.003,20.959],[0.127,0.004],[0.006,-38.75],[-0.056,-34.864]],"o":[[-0.002,-20.095],[0.102,0.003],[-0.001,8.416],[-0.01,-4.357],[0.028,-19.616],[0.008,-52.654],[-0.116,-0.003],[-0.005,30.16],[0.008,4.9]],"v":[[-12.624,49.547],[-9.04,-65.03],[-12.074,29.099],[-12.287,99.07],[-12.305,90.875],[-12.101,28.612],[-9.91,-61.774],[-12.68,21.612],[-12.537,105.468]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[1.887,45.602],[-26.379,4.696],[-2.469,-85.193],[5.28,-24.074],[1.852,5.013],[-0.002,22.511],[16.61,0.002],[0.952,-41.619],[-10.364,-37.444]],"o":[[-0.893,-21.583],[18.117,-3.225],[0.262,9.035],[-1.732,-4.68],[4.105,-21.069],[0.005,-56.553],[-15.209,-0.002],[-0.003,32.393],[1.457,5.263]],"v":[[-17.845,50.791],[6.237,-74.913],[33.468,24.494],[28.863,114.381],[21.546,95.76],[29.834,27.25],[4.054,-69.94],[-15.045,20.564],[-10.339,108.176]],"c":true}]},{"t":70,"s":[{"i":[[5.462,51.14],[-98.688,0],[0,-83.007],[15.245,-26.998],[5.351,5.622],[0,25.245],[61.179,0],[2.748,-46.673],[-29.946,-41.99]],"o":[[-2.585,-24.204],[49.312,0],[0,10.137],[-5.005,-5.248],[11.851,-23.628],[0,-63.421],[-56.02,0],[0,36.327],[4.209,5.902]],"v":[[-75.154,54.595],[13.996,-100.06],[108.222,25.242],[91.563,114.233],[81.957,104.364],[95.34,24.656],[9.629,-84.327],[-66.94,20.332],[-41.746,121.975]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.73,1,1,1,0.865,0.61,0.62,0.627,1,0.22,0.239,0.255]}},"s":{"a":0,"k":[156,38]},"e":{"a":0,"k":[52,-47]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_6huIHsZWBe","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[758.692,223.265]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 112","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[8.426,-0.004],[0.277,-2.478],[-2.678,-0.153],[-1.305,60.476],[17.98,-3.287],[0.185,-54.552],[-11.135,-44.334],[-0.116,1.32],[0.133,47.866],[-6.26,0.003],[-0.598,-67.134]],"o":[[-4.451,0.002],[-0.399,3.566],[4.991,0.284],[0.35,-16.23],[-8.467,1.548],[-0.155,45.633],[1.082,-1.88],[-0.808,-14.08],[-0.144,-52.009],[9.038,-0.005],[0.532,59.749]],"v":[[13.074,117.659],[7.092,113.425],[13.663,124.943],[27.445,43.164],[6.195,-125.716],[-12.27,-29.312],[4.795,83.856],[4.704,79.446],[-9.239,-6.958],[7.195,-111.361],[30.482,-2.829]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[0.125,-0.004],[0.004,-2.147],[-0.04,-0.132],[-0.019,52.417],[0.266,-2.849],[0.003,-47.283],[-0.165,-38.426],[0.001,1.145],[0.002,41.488],[-0.093,0.003],[-0.009,-58.188]],"o":[[-0.066,0.002],[-0.006,3.091],[0.074,0.246],[0.005,-14.067],[-0.125,1.341],[-0.002,39.553],[0.016,-1.629],[-0.012,-12.204],[-0.002,-45.079],[0.134,-0.004],[0.008,51.787]],"v":[[31.812,102.015],[31.723,98.346],[29.46,107.667],[32.024,37.447],[28.723,-89.305],[31.437,-25.372],[31.689,72.717],[31.688,68.894],[31.482,-5.996],[29.039,-88.917],[32.069,-2.418]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-0.13,-0.004],[-0.004,-2.147],[0.041,-0.132],[0.02,52.417],[-0.276,-2.849],[-0.003,-47.283],[0.171,-38.426],[-0.001,1.145],[-0.002,41.488],[0.096,0.003],[0.009,-58.188]],"o":[[0.068,0.002],[0.006,3.091],[-0.077,0.246],[-0.005,-14.067],[0.13,1.341],[0.002,39.553],[-0.017,-1.629],[0.012,-12.204],[0.002,-45.079],[-0.139,-0.004],[-0.008,51.787]],"v":[[-28.349,102.015],[-28.257,98.346],[-25.904,107.667],[-28.57,37.447],[-25.138,-89.305],[-27.959,-25.372],[-28.222,72.717],[-28.22,68.894],[-28.006,-5.996],[-25.467,-88.917],[-28.617,-2.418]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-13.181,-0.002],[-0.468,-2.306],[4.187,-0.143],[4.738,56.298],[-36.355,-3.056],[-0.123,-49.915],[37.468,-5.847],[0.327,1.229],[0.752,44.56],[12.637,0.002],[0.006,-62.497]],"o":[[6.963,0.001],[0.674,3.319],[-7.804,0.266],[-1.272,-15.109],[17.119,1.439],[0.103,41.755],[-0.72,-1.72],[1.758,-13.108],[-0.817,-48.417],[-18.246,-0.003],[-0.005,55.622]],"v":[[-10.92,99.525],[-1.621,95.582],[-10.835,105.883],[-37.023,39.666],[-5.795,-110.589],[28.416,-11.669],[-8.374,104.102],[7.348,74.021],[16.917,-8.05],[-8.816,-101.06],[-32.995,-3.373]],"c":true}]},{"t":70,"s":[{"i":[[-62.654,0],[-2.227,-2.586],[19.903,-0.16],[13.699,63.134],[-133.907,-3.422],[-0.352,-54.552],[21.188,-44.334],[0.949,1.378],[2.184,49.971],[46.545,0],[0,-70.087]],"o":[[33.098,0],[3.205,3.722],[-37.094,0.299],[-3.677,-16.943],[63.056,1.611],[0.294,45.634],[-2.059,-1.88],[5.074,-14.7],[-2.373,-54.296],[-67.205,0],[0,62.377]],"v":[[-1.715,122.978],[42.485,118.556],[-5.615,130.583],[-100.472,45.188],[9.827,-133.142],[108.295,-11.872],[84.946,101.303],[71.023,83.054],[88.099,-11.863],[3.339,-118.156],[-88.715,-3.444]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.435294121504,0.238985002041,0.271703183651,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[774.617,248.531]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[9.758,-0.005],[34.355,9.127],[-17.158,1.819],[-0.147,48.522],[9.9,18.404],[21.304,-29.451],[-7.169,-11.606],[-0.539,-60.539]],"o":[[-3.641,0.002],[-2.075,9.763],[43.193,-4.578],[0.207,-68.479],[-13.496,-25.088],[32.603,-20.701],[7.016,11.358],[0.532,59.749]],"v":[[56.353,51.992],[9.484,62.31],[43.785,79.983],[98.015,-64.321],[77.162,-180.462],[9.514,-191.599],[63.049,-179.013],[75.029,-71.13]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[0.144,-0.004],[30.303,9.127],[-15.135,1.819],[-0.108,48.522],[7.159,18.481],[19.333,-29.451],[-1.256,-19.888],[-0.008,-52.472]],"o":[[-0.054,0.002],[-1.83,9.763],[38.099,-4.578],[0.152,-68.479],[-19.073,-49.234],[27.821,-32.935],[0.619,9.809],[0.008,51.787]],"v":[[72.403,34.94],[13.207,62.31],[43.463,79.983],[73.099,-61.463],[68.259,-180.462],[13.118,-191.599],[70.008,-165.963],[75.04,-71.114]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[-0.15,-0.004],[-35.311,29.156],[15.734,1.819],[0.112,48.522],[-7.443,18.481],[-20.098,-29.451],[1.306,-19.888],[0.008,-52.472]],"o":[[0.056,0.002],[1.903,9.763],[-39.607,-4.578],[-0.158,-68.479],[19.828,-49.234],[-28.922,-32.935],[-0.644,9.809],[-0.008,51.787]],"v":[[17.047,34.94],[70.113,59.688],[47.132,79.983],[16.324,-61.463],[21.355,-180.462],[78.678,-191.599],[19.536,-165.963],[14.306,-71.114]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[-21.054,-24.021],[-15.913,5.615],[18.36,4.433],[0.164,48.522],[-11.02,18.453],[-8.611,-7.203],[5.328,-10.273],[0.005,-56.357]],"o":[[14.267,16.278],[1.338,4.438],[-30.028,-7.25],[-0.232,-68.479],[3.812,-8.941],[-10.944,-2.521],[-4.996,10.37],[-0.005,55.622]],"v":[[10.922,40.981],[59.749,70.979],[32.258,78.38],[-18.556,-56.495],[5.867,-191.201],[29.391,-208.842],[0.426,-186.259],[-15.931,-69.194]],"c":true}]},{"t":70,"s":[{"i":[[-72.555,0],[-2.177,-3.361],[32.647,1.819],[0.279,48.522],[-18.837,18.404],[-40.535,-29.451],[13.641,-11.606],[0,-63.202]],"o":[[27.073,0],[3.948,9.763],[-82.184,-4.578],[-0.394,-68.479],[25.679,-25.088],[-62.035,-20.701],[-13.349,11.358],[0,62.377]],"v":[[39.132,57.558],[86.382,47.936],[21.015,72.278],[-72.276,-64.321],[-32.599,-180.462],[96.115,-191.599],[-15.061,-180.944],[-57.468,-71.614]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.678,0.275,0.318,0.341,0.74,0.275,0.318,0.341,0.803,0.275,0.318,0.341,0.68,1,0.743,0.5,0.805,0]}},"s":{"a":0,"k":[53,-7]},"e":{"a":0,"k":[-61,72]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_kdxobhH00i","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1,0,1,0.5,0.6,1,0.2]}},"s":{"a":0,"k":[-66,-107]},"e":{"a":0,"k":[-32,-181]},"t":1,"nm":"Gradient_d4JFaekE2x","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[731.67,319.8]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-8.008,0.004],[0.428,48.037],[8.008,-0.004],[-0.428,-48.037]],"o":[[8.008,-0.004],[-0.428,-48.037],[-8.008,0.004],[0.428,48.037]],"v":[[20.275,103.796],[36.336,0.381],[15.281,-102.298],[0.064,4.315]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[-0.118,0.003],[0.006,41.636],[0.119,-0.003],[-0.006,-41.636]],"o":[[0.118,-0.003],[-0.006,-41.636],[-0.119,0.003],[0.006,41.636]],"v":[[38.437,89.671],[38.675,0.035],[35.853,-87.279],[38.138,3.445]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[0.123,0.003],[-0.007,41.636],[-0.123,-0.003],[0.007,-41.636]],"o":[[-0.123,-0.003],[0.007,-41.636],[0.123,0.003],[-0.007,41.636]],"v":[[-21.742,89.671],[-21.989,0.035],[-19.055,-87.279],[-21.431,3.445]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[12.526,0.002],[-0.004,44.718],[-16.165,-0.002],[0.004,-44.718]],"o":[[-12.526,-0.002],[0.004,-44.718],[16.165,0.002],[-0.004,44.718]],"v":[[-4.883,96.531],[-24.287,-0.556],[-5.318,-94.994],[16.932,2.274]],"c":true}]},{"t":70,"s":[{"i":[[59.542,0],[0,50.149],[-59.542,0],[0,-50.149]],"o":[[-59.542,0],[0,-50.149],[59.542,0],[0,50.149]],"v":[[-0.202,108.615],[-76.055,0.015],[-0.202,-108.585],[75.651,0.015]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[0,0],[0,99.837],[-33.438,0],[0,-99.837],[33.438,0]],"o":[[-33.438,0],[0,-99.837],[33.438,0],[0,99.837],[0,0]],"v":[[4.711,147.962],[-55.834,0.015],[4.711,-147.932],[65.256,0.015],[4.711,147.962]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[{"i":[[0,0],[0,99.837],[-30.345,0],[0,-99.837],[29.495,0]],"o":[[-29.495,0],[0,-99.837],[30.345,0],[0,99.837],[0,0]],"v":[[4.712,147.962],[-24.821,-4.736],[5.399,-147.932],[39.389,2.873],[4.712,147.962]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[0,0],[0,99.837],[31.546,0],[0,-99.837],[-30.662,0]],"o":[[30.662,0],[0,-99.837],[-31.546,0],[0,99.837],[0,0]],"v":[[13.318,147.962],[44.02,-4.736],[12.604,-147.932],[-22.731,2.873],[13.318,147.962]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[0,0],[0,99.837],[37.08,0],[0,-99.837],[-36.473,0]],"o":[[36.473,0],[0,-99.837],[-37.08,0],[0,99.837],[0,0]],"v":[[8.187,147.962],[66.728,-3.016],[3.832,-147.517],[-53.31,1.838],[8.187,147.962]],"c":true}]},{"t":70,"s":[{"i":[[0,0],[0,99.837],[63.623,0],[0,-99.837],[-63.623,0]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837],[0,0]],"v":[[-0.202,147.962],[114.997,0.015],[-0.202,-147.932],[-115.402,0.015],[-0.202,147.962]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.816,0.702,0.553,0.5,0.816,0.702,0.553,1,0.816,0.702,0.553,0,1,0.5,0.5,1,0]}},"s":{"a":0,"k":[55,-124]},"e":{"a":0,"k":[8.5,-62.5]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_okFE5wQCSL","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.816,0.702,0.553,0.5,0.816,0.702,0.553,1,0.816,0.702,0.553,0,1,0.5,0.5,1,0]}},"s":{"a":0,"k":[-44,117]},"e":{"a":0,"k":[-18.5,80.5]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_vdSz9LMAXW","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.506,0.643,0.8,0.239,0.506,0.643,0.8,0.477,0.506,0.643,0.8,0.739,0.496,0.571,0.651,1,0.486,0.498,0.502]}},"s":{"a":0,"k":[-55.5,-113]},"e":{"a":0,"k":[86,84.5]},"t":1,"nm":"Gradient_bctTcwQkfD","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[768,251]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 1","bm":0,"hd":false}],"ip":38,"op":182,"st":2,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"LINK L 2","parent":1,"sr":1,"ks":{"r":{"a":0,"k":45},"p":{"a":0,"k":[-69.922,70.597,0]},"a":{"a":0,"k":[186.078,326.597,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-32.432,4.085],[0,99.837],[37.323,-2.363],[0,-99.837]],"o":[[32.432,-4.085],[0,-99.837],[-37.323,2.363],[0,99.837]],"v":[[-1.236,148.474],[29.113,0],[-2.478,-147.68],[-32.2,0.298]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-44.458,2.001],[0,99.837],[46.662,-1.157],[0,-99.837]],"o":[[44.458,-2.001],[0,-99.837],[-46.662,1.157],[0,99.837]],"v":[[5.339,148.205],[73.055,0],[4.779,-147.816],[-62.655,0.146]],"c":true}]},{"t":66,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":40.9},"e":{"a":0,"k":47.1},"o":{"a":0,"k":-16},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.662745118141,0.585888981819,0.483414083719,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-32.432,4.085],[0,99.837],[37.323,-2.363],[0,-99.837]],"o":[[32.432,-4.085],[0,-99.837],[-37.323,2.363],[0,99.837]],"v":[[-1.236,148.474],[29.113,0],[-2.478,-147.68],[-32.2,0.298]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-44.458,2.001],[0,99.837],[46.662,-1.157],[0,-99.837]],"o":[[44.458,-2.001],[0,-99.837],[-46.662,1.157],[0,99.837]],"v":[[5.339,148.205],[73.055,0],[4.779,-147.816],[-62.655,0.146]],"c":true}]},{"t":66,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":46.6},"e":{"a":0,"k":83.8},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.23667819798,0.439364284277,0.635294139385,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-32.432,4.085],[0,99.837],[37.323,-2.363],[0,-99.837]],"o":[[32.432,-4.085],[0,-99.837],[-37.323,2.363],[0,99.837]],"v":[[-1.236,148.474],[29.113,0],[-2.478,-147.68],[-32.2,0.298]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-44.458,2.001],[0,99.837],[46.662,-1.157],[0,-99.837]],"o":[[44.458,-2.001],[0,-99.837],[-46.662,1.157],[0,99.837]],"v":[[5.339,148.205],[73.055,0],[4.779,-147.816],[-62.655,0.146]],"c":true}]},{"t":66,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":82},"e":{"a":0,"k":100},"o":{"a":0,"k":63},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-32.432,4.085],[0,99.837],[37.323,-2.363],[0,-99.837]],"o":[[32.432,-4.085],[0,-99.837],[-37.323,2.363],[0,99.837]],"v":[[-1.236,148.474],[29.113,0],[-2.478,-147.68],[-32.2,0.298]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-44.458,2.001],[0,99.837],[46.662,-1.157],[0,-99.837]],"o":[[44.458,-2.001],[0,-99.837],[-46.662,1.157],[0,99.837]],"v":[[5.339,148.205],[73.055,0],[4.779,-147.816],[-62.655,0.146]],"c":true}]},{"t":66,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.423529446125,0.427451014519,0.415686309338,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.843,325.871]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"STR 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-1.27,0],[0,50.149],[1.126,-0.071],[0,-50.149]],"o":[[1.27,0],[0,-50.149],[-1.126,0.071],[0,50.149]],"v":[[-25.778,105.87],[-28.934,1.143],[-23.528,-107.801],[-31.86,0.099]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-20.613,0],[0,50.149],[23.016,-0.035],[0,-50.149]],"o":[[20.613,0],[0,-50.149],[-23.016,0.035],[0,50.149]],"v":[[-5.643,107.263],[28.447,0.56],[0.889,-108.208],[-31.528,-1.599]],"c":true}]},{"t":66,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":87.4},"e":{"a":0,"k":92.4},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.662745118141,0.584313750267,0.482352972031,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-1.27,0],[0,50.149],[1.126,-0.071],[0,-50.149]],"o":[[1.27,0],[0,-50.149],[-1.126,0.071],[0,50.149]],"v":[[-25.778,105.87],[-28.934,1.143],[-23.528,-107.801],[-31.86,0.099]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-20.613,0],[0,50.149],[23.016,-0.035],[0,-50.149]],"o":[[20.613,0],[0,-50.149],[-23.016,0.035],[0,50.149]],"v":[[-5.643,107.263],[28.447,0.56],[0.889,-108.208],[-31.528,-1.599]],"c":true}]},{"t":66,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":0,"k":42.9},"o":{"a":0,"k":-28},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294133425,0.4392157197,0.635294139385,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-1.27,0],[0,50.149],[1.126,-0.071],[0,-50.149]],"o":[[1.27,0],[0,-50.149],[-1.126,0.071],[0,50.149]],"v":[[-25.778,105.87],[-28.934,1.143],[-23.528,-107.801],[-31.86,0.099]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-20.613,0],[0,50.149],[23.016,-0.035],[0,-50.149]],"o":[[20.613,0],[0,-50.149],[-23.016,0.035],[0,50.149]],"v":[[-5.643,107.263],[28.447,0.56],[0.889,-108.208],[-31.528,-1.599]],"c":true}]},{"t":66,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":58.1},"e":{"a":0,"k":94.4},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.423529446125,0.427451014519,0.415686309338,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-1.27,0],[0,50.149],[1.126,-0.071],[0,-50.149]],"o":[[1.27,0],[0,-50.149],[-1.126,0.071],[0,50.149]],"v":[[-25.778,105.87],[-28.934,1.143],[-23.528,-107.801],[-31.86,0.099]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-20.613,0],[0,50.149],[23.016,-0.035],[0,-50.149]],"o":[[20.613,0],[0,-50.149],[-23.016,0.035],[0,50.149]],"v":[[-5.643,107.263],[28.447,0.56],[0.889,-108.208],[-31.528,-1.599]],"c":true}]},{"t":66,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.843,325.871]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"STR 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-11.603,4.806],[5.493,-21.891],[-1.3,-2.423],[-5.281,-17],[-6.942,12.875]],"o":[[-17.588,-12.664],[1.044,11.958],[2.08,-10.152],[-1.142,-18.333],[4.343,-8.055]],"v":[[17.449,-44.246],[-23.029,-21.854],[-26.658,11.898],[-26.918,11.581],[-13.049,-25.343]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-31.264,0.059],[13.734,-21.691],[-2.462,-2.462],[-24.311,-17],[-0.735,12.866]],"o":[[-21.293,-13.218],[0.939,11.979],[5.394,-10.074],[-19.515,-23.775],[0.337,-8.386]],"v":[[29.456,-43.738],[-37.217,-23.587],[-29.118,10.547],[12.284,4.143],[-18.787,-24.554]],"c":true}]},{"t":66,"s":[{"i":[[-55.5,-4.5],[24,-21.5],[-4,-2.5],[-46.75,-17],[5.1,12.857]],"o":[[-28.5,-13.75],[1,12],[9.5,-10],[-40.5,-29],[-3.452,-8.704]],"v":[[33.5,-43.25],[-69.75,-25.25],[-49,9.25],[39.5,-3],[-40.048,-23.796]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.21960785985,0.239215701818,0.254901975393,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":30},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[256,256]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shad","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[2.262,0],[0,65],[-2.73,0.173],[0,-65.5]],"o":[[-1.799,0],[0,-55.413],[2.73,-0.173],[0,55.413]],"v":[[-26.088,108.872],[-32.873,1.099],[-21.93,-116.064],[-28.777,2.143]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[23.695,0],[0,65],[-25.53,0.085],[0,-65.5]],"o":[[-18.846,0],[0,-55.413],[25.53,-0.085],[0,55.413]],"v":[[-8.076,115.059],[-40.045,-0.599],[-1.114,-117.562],[31.925,1.56]],"c":true}]},{"t":66,"s":[{"i":[[67.675,0],[0,65],[-64.622,0],[0,-65.5]],"o":[[-53.825,0],[0,-55.413],[64.622,0],[0,55.413]],"v":[[-6.675,121],[-93,1],[-6.675,-119],[83.151,1]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-15.304,-0.684],[0,93.125],[8.925,15.225],[0,-93.125]],"o":[[-9.418,-5.632],[0,-93.125],[-19.978,5.78],[0,103.5]],"v":[[-9.248,140.887],[-9.959,-0.574],[-8.929,-136.847],[-30.282,1.298]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[-32.814,-0.335],[0,93.125],[31.226,7.458],[0,-93.125]],"o":[[16.17,-2.759],[0,-93.125],[-36.205,2.831],[0,103.5]],"v":[[-1.454,139.924],[46.899,0.229],[-0.958,-136.925],[-57.96,1.146]],"c":true}]},{"t":66,"s":[{"i":[[-55.25,0],[0,93.125],[57.99,0],[0,-93.125]],"o":[[43.511,0],[0,-93.125],[-57.99,0],[0,103.5]],"v":[[-6.75,139],[97,1],[-6,-137],[-107,1]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.996,326.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Big White","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[53.131,-7.371],[-0.252,-103.5],[22.964,-9.027],[8.58,23],[-33.769,3.245],[-0.125,75.058]],"o":[[42.805,6.357],[0.195,80.002],[-23.626,9.288],[2.776,21],[39.406,-3.787],[0.126,-75.5]],"v":[[-7.228,-47.945],[24.806,97.324],[1.509,233.046],[-24.081,188],[1.344,248.185],[28.912,99]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[66.626,-5.651],[-0.583,-103.5],[27.468,-4.422],[19.816,23],[-46.176,1.079],[-0.29,75.058]],"o":[[49.073,8.726],[0.45,80.002],[-34.142,4.55],[6.411,21],[53.884,-1.26],[0.291,-75.5]],"v":[[-1.13,-48.228],[62.326,96.648],[10.781,233.022],[-49.537,188],[8.83,248.091],[72.854,99]],"c":true}]},{"t":66,"s":[{"i":[[91,-4],[-1,-103.5],[36.5,0],[34,23],[-66,-1],[-0.497,75.058]],"o":[[63.5,11],[0.773,80.003],[-50.09,0],[11,21],[77.017,1.167],[0.5,-75.5]],"v":[[-8,-48.5],[96.5,96],[9,233],[-95,188],[5,248],[115,99]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.816,0.702,0.553,0.5,0.816,0.702,0.553,1,0.816,0.702,0.553,0.475,1,0.737,0.5,1,0]}},"s":{"a":0,"k":[86,-16]},"e":{"a":0,"k":[73.5,2.5]},"t":1,"nm":"Gradient_Qcjyo3CF0T","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.435,0.239,0.271,0.5,0.435,0.239,0.271,1,0.435,0.239,0.271,0.918,1,0.959,0.56,1,0.12]}},"s":{"a":0,"k":[-9.5,79]},"e":{"a":0,"k":[107.5,125]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_kZrD8G5gQu","hd":false},{"ty":"fl","c":{"a":0,"k":[0.21960785985,0.239215701818,0.254901975393,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 2","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[256,256]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Big Shad","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[1.27,0],[0,50.149],[-1.126,0.071],[0,-50.149]],"o":[[-1.27,0],[0,-50.149],[1.126,-0.071],[0,50.149]],"v":[[-25.98,105.885],[-32.062,0.114],[-23.73,-107.785],[-29.136,1.158]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[20.613,0],[0,50.149],[-23.016,0.035],[0,-50.149]],"o":[[-20.613,0],[0,-50.149],[23.016,-0.035],[0,50.149]],"v":[[-5.845,107.278],[-31.73,-1.584],[0.687,-108.193],[28.245,0.575]],"c":true}]},{"t":66,"s":[{"i":[[59.542,0],[0,50.149],[-59.542,0],[0,-50.149]],"o":[[-59.542,0],[0,-50.149],[59.542,0],[0,50.149]],"v":[[-0.202,108.615],[-76.055,0.015],[-0.202,-108.585],[75.651,0.015]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[0,0],[0,99.837],[37.323,-2.363],[0,-99.837],[-32.432,4.085]],"o":[[32.432,-4.085],[0,-99.837],[-37.323,2.363],[0,99.837],[0,0]],"v":[[-1.438,148.489],[28.911,0.015],[-2.681,-147.665],[-32.402,0.313],[-1.438,148.489]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[0,99.837],[46.661,-1.157],[0,-99.837],[-44.458,2.001]],"o":[[44.458,-2.001],[0,-99.837],[-46.661,1.157],[0,99.837],[0,0]],"v":[[5.137,148.22],[72.853,0.015],[4.577,-147.801],[-62.857,0.161],[5.137,148.22]],"c":true}]},{"t":66,"s":[{"i":[[0,0],[0,99.837],[63.623,0],[0,-99.837],[-63.623,0]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837],[0,0]],"v":[[-0.202,147.962],[114.997,0.015],[-0.202,-147.932],[-115.402,0.015],[-0.202,147.962]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.435,0.239,0.271,0.5,0.435,0.239,0.271,1,0.435,0.239,0.271,0,0,0.08,0.5,0.16,1,0.397,1,0.635,1,0.817,0.5,1,0]}},"s":{"a":0,"k":[-98.707,53.707]},"e":{"a":0,"k":[-60.207,56.707]},"t":1,"nm":"Gradient_reZGvEuwkZ","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0.315,0.816,0.702,0.553,0.412,0.673,0.729,0.776,0.51,0.529,0.757,1,0.755,0.529,0.757,1,1,0.529,0.757,1,0.517,1,0.759,0.5,1,0]}},"s":{"a":0,"k":[-43.146,75.475]},"e":{"a":0,"k":[-77.889,131.218]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_XVg6oUUhDr","hd":false},{"ty":"fl","c":{"a":0,"k":[0.505882382393,0.643137276173,0.800000071526,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.996,326.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"FILL","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[186.078,326.597]},"a":{"a":0,"k":[186.078,326.597]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":-45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":38,"op":182,"st":2,"bm":0},{"ddd":0,"ind":5,"ty":3,"nm":"NULL LINK","sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[1]},"o":{"x":[0.411],"y":[0]},"t":0,"s":[-18]},{"t":37,"s":[10]}]},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[254,228.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.8,"y":1},"o":{"x":0.8,"y":0},"t":19,"s":[254,240.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":37,"s":[275,246.5,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[5,5,100]},{"i":{"x":[0.8,0.8,0.8],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":19,"s":[78,78,100]},{"t":37,"s":[20,20,100]}]}},"ao":0,"ip":1,"op":38,"st":2,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Cover Link","parent":8,"sr":1,"ks":{"r":{"a":0,"k":-45},"p":{"a":0,"k":[249.572,229.153,0]},"a":{"a":0,"k":[299.879,302.591,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[13.9,23.591],[13.449,8.672]],"o":[[-9.192,-15.601],[-17.207,-11.095]],"v":[[93.096,-94.997],[58.772,-131.374]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[0.174,27.381],[1.036,11.649]],"o":[[-0.115,-18.107],[-1.814,-20.393]],"v":[[27.739,-51.379],[24.229,-104.1]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0.174,27.381],[1.036,11.649]],"o":[[-0.115,-18.107],[-1.814,-20.393]],"v":[[26.547,-50.717],[22.11,-127.93]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[0.174,27.381],[1.036,11.649]],"o":[[-0.115,-18.107],[-1.814,-20.393]],"v":[[30.227,-51.859],[21.73,-135.671]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-4.542,27.454],[-29.828,0.448]],"o":[[3.003,-18.156],[19.466,-0.292]],"v":[[-34.937,-54.832],[-3.409,-147.965]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-5.43,24.316],[-27.136,-0.62]],"o":[[3.591,-16.08],[17.112,-6.025]],"v":[[-41.82,-68.841],[-7.552,-144.065]],"c":false}]},{"i":{"x":0.71,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[-7.207,18.038],[-30.564,-9.634]],"o":[[4.766,-11.929],[10.834,-6.21]],"v":[[-55.587,-96.86],[-1.035,-145.934]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[-9.358,20.024],[-37.622,-0.349]],"o":[[6.189,-13.242],[15.135,-4.336]],"v":[[-69.1,-100.242],[2.743,-148.327]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[-12.341,22.447],[-25.927,4.668]],"o":[[8.161,-14.845],[17.921,-6.014]],"v":[[-85.86,-96.241],[-21.894,-145.604]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.436,"y":0},"t":25,"s":[{"i":[[-13.814,23.644],[-20.152,7.146]],"o":[[9.136,-15.636],[19.297,-6.843]],"v":[[-94.135,-94.266],[-42.91,-140.134]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.2,"y":0},"t":31,"s":[{"i":[[-8.297,25.506],[-20.052,21.477]],"o":[[5.701,-18.607],[12.533,-13.424]],"v":[[-63.744,-68.566],[-33.824,-133.225]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.02},"t":34,"s":[{"i":[[-3.34,27.179],[-6.576,20.345]],"o":[[2.615,-21.276],[6.297,-19.482]],"v":[[-33.88,-54.293],[-22.533,-123.891]],"c":false}]},{"t":68,"s":[{"i":[[13.9,23.591],[13.449,8.672]],"o":[[-9.192,-15.601],[-17.207,-11.095]],"v":[[93.096,-94.997],[58.772,-131.374]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.662745118141,0.585888981819,0.483414083719,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.843,325.871]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Strk 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[8.04,19.241],[15.777,7.794]],"o":[[-6.924,-16.57],[-8.817,-4.356]],"v":[[64.84,-63.573],[31.458,-101.777]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-2.709,20.677],[4.312,16.479]],"o":[[2.333,-17.806],[-2.489,-9.514]],"v":[[-13.67,-42.867],[-14.552,-96.697]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[1.261,20.815],[-8.678,26.939]],"o":[[-0.691,-11.4],[3.015,-9.36]],"v":[[-30.351,-47.898],[-25.408,-132.971]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[1.261,20.815],[-16.264,15.683]],"o":[[-0.691,-11.4],[7.079,-6.826]],"v":[[-30.351,-47.898],[-12.465,-142.107]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-0.446,21.225],[-12.959,28.483]],"o":[[0.236,-11.228],[3.661,-8.046]],"v":[[-32.488,-59.168],[-22.911,-136.282]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-1.677,18.934],[4.631,16.681]],"o":[[1.346,-11.606],[-4.692,0.256]],"v":[[4.004,-52.374],[-3.472,-141.059]],"c":false}]},{"i":{"x":0.71,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[-4.14,14.353],[-17.942,-0.538]],"o":[[3.565,-12.36],[4.951,-1.167]],"v":[[-19.702,-60.4],[1.392,-115.436]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[-5.355,16.092],[-22.892,-1.303]],"o":[[4.611,-13.858],[7.322,0.417]],"v":[[-37.346,-68.366],[7.14,-106.823]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[-5.517,18.765],[-29.321,5.832]],"o":[[6.865,-23.352],[8.557,-2.248]],"v":[[-60.861,-57.363],[-8.329,-107.386]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.436,"y":0},"t":25,"s":[{"i":[[-7.968,19.276],[-21.979,8.546]],"o":[[6.862,-16.6],[9.167,-3.564]],"v":[[-65.253,-66.256],[-22.404,-106.255]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.2,"y":0},"t":31,"s":[{"i":[[-4.486,20.086],[-18.925,-3.544]],"o":[[4.05,-20.157],[3.314,-6.739]],"v":[[-38.442,-51.263],[0.402,-104.909]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.02},"t":34,"s":[{"i":[[-1.358,20.814],[3.916,19.233]],"o":[[1.523,-23.353],[-1.962,-9.638]],"v":[[35.699,-42.344],[30.221,-107.759]],"c":false}]},{"t":68,"s":[{"i":[[8.04,19.241],[15.777,7.794]],"o":[[-6.924,-16.57],[-8.817,-4.356]],"v":[[64.84,-63.573],[31.458,-101.777]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.843,325.871]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Strk 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-1.875,5.625],[10.175,5.812],[3.231,-4.464],[-7.858,-21.526]],"o":[[-9.187,-24.25],[-4.7,5.625],[18.918,9.814],[2.804,-2.462]],"v":[[83,-76],[44.7,-123],[33.769,-109.911],[73.446,-61.413]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-4.446,3.923],[-0.376,16.458],[5.036,-2.238],[4.014,-22.561]],"o":[[1.74,-21.639],[0.967,-7.561],[1.627,21.369],[2.26,4.11]],"v":[[6.316,-36.486],[6.194,-104.866],[-10.13,-116.043],[-8.675,-36.127]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-4.446,3.923],[-4.605,27.842],[5.497,-7.449],[-0.725,-12.698]],"o":[[1.74,-21.639],[-2.355,0.967],[-6.815,28.693],[2.26,4.11]],"v":[[-8.379,-40.854],[-5.192,-141.669],[-19.265,-128.884],[-21.913,-41.423]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[-4.446,3.923],[-4.605,27.842],[5.497,-7.449],[-0.725,-12.698]],"o":[[1.74,-21.639],[-2.355,0.967],[-6.815,28.693],[2.26,4.11]],"v":[[2.66,-38.951],[7.498,-140.908],[-6.322,-138.021],[-19.756,-39.519]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[3.856,4.505],[-7.786,17.568],[-4.353,-8.178],[-0.711,-20.059]],"o":[[1.696,-21.937],[1.538,0.688],[2.294,29.664],[-2.933,3.835]],"v":[[-14.505,-40.607],[-9.19,-146.251],[5.523,-132.896],[9.958,-32.592]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[2.91,4.249],[-11.797,18.483],[-1.718,-6.788],[0.061,-19.417]],"o":[[1.749,-22.376],[1.811,2.234],[-2.638,21.062],[-2.452,2.084]],"v":[[-23.296,-52.305],[-5.302,-142.238],[-1.38,-135.901],[-0.438,-41.282]],"c":true}]},{"i":{"x":0.71,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[1.017,3.736],[-27.206,3.939],[5.313,-3.997],[0.56,-19.559]],"o":[[1.854,-23.255],[5.95,-0.389],[-11.468,4.891],[-1.491,-1.419]],"v":[[-42.076,-77.947],[-1.072,-144.145],[1.714,-116.067],[-23.047,-59.041]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[1.354,4.397],[-28.267,-0.064],[-0.646,-4.011],[5.205,-17.92]],"o":[[6.095,-20.212],[1.227,5.196],[-19.986,1.91],[-1.963,-1.781]],"v":[[-59.174,-84.041],[4.25,-137.345],[5.732,-116.035],[-41.086,-67.36]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[1.719,5.218],[-17.457,3.439],[-2.39,-4.31],[9.452,-19.505]],"o":[[13.263,-24.767],[1.213,4.615],[-22.021,7.328],[-2.534,-2.233]],"v":[[-77.689,-79.338],[-18.022,-133.359],[-12.937,-116.275],[-64.797,-66.985]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.436,"y":0},"t":25,"s":[{"i":[[1.899,5.624],[-12.119,5.168],[-3.251,-4.458],[9.436,-20.043]],"o":[[11.852,-25.879],[1.206,4.328],[-15.788,7.345],[-2.816,-2.456]],"v":[[-84.477,-74.924],[-33.504,-128.896],[-27.908,-112.107],[-72.46,-65.152]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.2,"y":0},"t":31,"s":[{"i":[[3.459,4.457],[-17.74,27.162],[-3.019,-15.731],[4.11,-19.342]],"o":[[3.015,-22.898],[1.821,-1.853],[-13.746,7.572],[-3.294,-1.327]],"v":[[-46.008,-53.482],[-19.261,-126.612],[-7.226,-113.163],[-41.524,-51.432]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.02},"t":34,"s":[{"i":[[4.86,3.408],[-2.15,22.21],[-2.81,-25.86],[-0.675,-18.712]],"o":[[-0.498,-22.938],[2.374,-7.406],[2.332,16.302],[-3.724,-0.312]],"v":[[-8.962,-44.801],[-4.637,-125.529],[13.916,-110.983],[15.277,-38.537]],"c":true}]},{"t":68,"s":[{"i":[[-1.875,5.625],[10.175,5.812],[3.231,-4.464],[-7.858,-21.526]],"o":[[-9.187,-24.25],[-4.7,5.625],[18.918,9.814],[2.804,-2.462]],"v":[[83,-76],[44.7,-123],[33.769,-109.911],[73.446,-61.413]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.996,326.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Whte","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[0.518,-1.441],[-7.44,-18.663],[-0.277,2.64],[16.232,9.781]],"o":[[13.234,9.941],[0.535,1.343],[-9.071,-16.64],[-1.336,2.602]],"v":[[52.607,-25.309],[83.833,16.842],[93.152,4.86],[57.086,-33.727]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[1.171,-0.986],[0.911,-18.671],[-1.565,2.144],[2.677,12.534]],"o":[[0.409,12.799],[-0.07,1.444],[0.511,-18.945],[-2.462,1.58]],"v":[[12.048,-3.773],[13.41,56.265],[27.336,48.494],[23.43,-7.014]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[1.171,-0.986],[0.911,-18.671],[-1.565,2.144],[2.677,12.534]],"o":[[0.409,12.799],[-0.07,1.444],[0.511,-18.945],[-2.462,1.58]],"v":[[20.256,-29.457],[21.486,49.248],[26.145,49.156],[21.312,-30.844]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[1.171,-0.986],[0.911,-18.671],[-1.565,2.144],[2.677,12.534]],"o":[[2.711,9.027],[-0.07,1.444],[0.511,-18.945],[-2.462,1.58]],"v":[[19.876,-37.197],[25.166,48.106],[29.825,48.014],[20.931,-38.584]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-0.586,-0.762],[2.059,-18.853],[1.236,2.351],[-34.254,10.258]],"o":[[-9.702,24.43],[-0.159,1.458],[2.506,-19.077],[-22.183,11.25]],"v":[[-2.1,-49.481],[-18.855,58.522],[-35.074,45.07],[-2.452,-50.582]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-0.652,-1.09],[3.737,-21.718],[0.877,2.174],[-26.224,2.461]],"o":[[-20.553,21.332],[-0.193,1.306],[3.236,-16.932],[-9.052,9.167]],"v":[[-5.63,-44.84],[-27.686,43.915],[-42.089,31.087],[-6.788,-46.532]],"c":true}]},{"i":{"x":0.71,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0.198,-0.883],[7.095,-27.449],[0.16,1.819],[-31.619,-7.26]],"o":[[-31.271,6.071],[-0.259,1.003],[4.697,-12.643],[-0.185,1.609]],"v":[[1.134,-46.123],[-45.346,14.699],[-56.118,3.12],[-0.201,-47.688]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[0.137,-1.176],[4.946,-15.583],[0.219,2.107],[-39.969,0.551]],"o":[[-11.984,4.317],[-0.356,1.121],[6.094,-14.071],[0.016,2.214]],"v":[[6.306,-48.179],[-57.288,13.501],[-69.591,-0.3],[3.969,-49.982]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[2.858,-2.977],[6.569,-17.667],[0.265,2.464],[-22.325,-1.143]],"o":[[-11.114,9.607],[-0.473,1.271],[9.003,-21.013],[0.707,2.563]],"v":[[-32.633,-32.383],[-77.634,20.309],[-86.328,3.645],[-18.367,-43.837]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.436,"y":0},"t":25,"s":[{"i":[[4.202,-3.866],[7.37,-18.696],[0.288,2.641],[-13.613,-1.979]],"o":[[-10.684,12.22],[-0.53,1.345],[10.44,-24.44],[1.048,2.735]],"v":[[-51.86,-24.584],[-83.537,18.279],[-94.591,5.593],[-38.246,-36.676]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.2,"y":0},"t":31,"s":[{"i":[[2.566,-4.782],[0.786,-19.083],[1.082,2.281],[-9.15,1.729]],"o":[[-5.78,14.302],[-0.057,1.373],[6.109,-26.624],[-0.857,5.422]],"v":[[-37.784,-16.323],[-54.587,38.481],[-63.911,31.286],[-29.151,-30.531]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.02},"t":34,"s":[{"i":[[1.097,-5.604],[-5.13,-19.43],[1.795,1.958],[-5.14,5.06]],"o":[[-1.374,16.173],[0.369,1.398],[2.217,-28.585],[-2.569,7.837]],"v":[[-25.138,-8.901],[-28.577,48.099],[-33.787,45.553],[-20.98,-25.01]],"c":true}]},{"t":68,"s":[{"i":[[0.518,-1.441],[-7.44,-18.663],[-0.277,2.64],[16.232,9.781]],"o":[[13.234,9.941],[0.535,1.343],[-9.071,-16.64],[-1.336,2.602]],"v":[[52.607,-25.309],[83.833,16.842],[93.152,4.86],[57.086,-33.727]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.816,0.702,0.553,0.5,0.816,0.702,0.553,1,0.816,0.702,0.553,0.475,1,0.737,0.5,1,0]}},"s":{"a":0,"k":[86,-16]},"e":{"a":0,"k":[73.5,2.5]},"t":1,"nm":"Gradient_X0SwmbIa0N","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.435,0.239,0.271,0.5,0.435,0.239,0.271,1,0.435,0.239,0.271,0.918,1,0.959,0.56,1,0.12]}},"s":{"a":0,"k":[-9.5,79]},"e":{"a":0,"k":[107.5,125]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_Q22T2kVqvV","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[256,256]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shad grad","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-4.445,6.735],[4.952,3.085],[8.154,-6.673],[-7.056,-16.887]],"o":[[-9.445,-22.265],[-3.423,6.46],[16.277,7.706],[9.362,-4.942]],"v":[[92.445,-93.985],[59.048,-130.71],[31.721,-100.577],[63.638,-65.308]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-7.226,3.592],[2.733,5.155],[10.402,-1.676],[2.378,-18.146]],"o":[[3.012,-23.997],[-6.204,3.868],[10.207,14.838],[10.578,0.427]],"v":[[26.647,-50.727],[24.114,-103.284],[-14.947,-95.424],[-13.858,-44.868]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-24.264,17.921],[2.733,5.155],[10.402,-1.676],[-1.367,-13.754]],"o":[[3.012,-23.997],[-6.204,3.868],[-3.984,18.003],[10.151,9.414]],"v":[[25.456,-50.065],[21.996,-127.114],[-25.539,-133.022],[-30.539,-49.899]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[-24.264,17.921],[2.733,5.155],[10.402,-1.676],[-1.367,-13.754]],"o":[[3.012,-23.997],[-7.784,-8.431],[-3.984,18.003],[10.151,9.414]],"v":[[29.136,-51.207],[21.615,-134.855],[-12.595,-142.158],[-30.539,-49.899]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[21.601,21.086],[-18.864,6.457],[-7.715,-0.882],[3.571,-13.627]],"o":[[0.79,-24.466],[9.204,-7.388],[-21.784,21.469],[-11.734,8.149]],"v":[[-34.344,-54.064],[-3.965,-147.28],[-14.788,-146.835],[-35.574,-50.868]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[15.193,15.468],[-25.31,-1.822],[-7.637,-3.745],[3.592,-13.284]],"o":[[2.149,-21.852],[6.177,-3.456],[-2.588,13.463],[-9.476,4.619]],"v":[[-41.478,-67.992],[-8.03,-143.399],[-0.426,-130.134],[-2.855,-51.106]],"c":true}]},{"i":{"x":0.71,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[2.378,4.233],[-26.653,-7.88],[-1.555,-4.292],[3.633,-12.597]],"o":[[4.865,-16.624],[-0.414,3.998],[-9.238,4.053],[-4.961,-2.442]],"v":[[-55.744,-95.849],[-1.632,-145.546],[-13.901,-105.346],[-34.107,-73.195]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[3.141,5.105],[-28.6,-0.03],[-3.149,-6.746],[4.699,-14.123]],"o":[[6.294,-18.631],[0.111,5.521],[-22.523,-0.807],[-6.52,-3.303]],"v":[[-69.101,-99.227],[2.012,-147.943],[8.27,-107.387],[-36.875,-69.834]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[4.034,6.191],[-12.974,1.682],[-6.521,-6.685],[6.235,-15.993]],"o":[[8.348,-21.091],[1.849,6.378],[-24.686,4.258],[-8.44,-4.386]],"v":[[-85.692,-95.228],[-22.636,-145.07],[-8.399,-106.768],[-59.221,-66.191]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.436,"y":0},"t":25,"s":[{"i":[[4.475,6.728],[-5.259,2.528],[-8.186,-6.656],[6.993,-16.917]],"o":[[9.362,-22.305],[2.707,6.801],[-16.258,7.754],[-9.388,-4.921]],"v":[[-93.883,-93.254],[-43.657,-139.525],[-23.067,-105.053],[-64.461,-67.995]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.2,"y":0},"t":31,"s":[{"i":[[6.116,4.644],[-3.116,4.205],[-9.425,-3.422],[1.002,-17.368]],"o":[[3.842,-23.291],[4.993,4.264],[-20.513,-4.071],[-9.963,-1.49]],"v":[[-63.228,-67.798],[-34.211,-132.512],[0.59,-103.468],[-38.299,-53.133]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.02},"t":34,"s":[{"i":[[7.59,2.772],[-1.19,5.712],[-10.538,-0.516],[-4.381,-17.773]],"o":[[-1.117,-24.176],[7.046,1.985],[5.435,21.5],[-10.479,1.593]],"v":[[-33.126,-53.743],[-22.596,-123.082],[31.173,-106.103],[35.259,-44.33]],"c":true}]},{"t":68,"s":[{"i":[[-4.445,6.735],[4.952,3.085],[8.154,-6.673],[-7.056,-16.887]],"o":[[-9.445,-22.265],[-3.423,6.46],[16.277,7.706],[9.362,-4.942]],"v":[[92.445,-93.985],[59.048,-130.71],[31.721,-100.577],[63.638,-65.308]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.505882382393,0.643137276173,0.800000071526,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.996,326.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Fill","bm":0,"hd":false}],"ip":1,"op":38,"st":2,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"LINK R","parent":5,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[45]},{"t":37,"s":[37]}]},"p":{"a":0,"k":[-38.342,35.543,0]},"a":{"a":0,"k":[769.575,402.245,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[11,3.125],[13,-6.5],[56.5,-19],[-3.625,5.5]],"o":[[-8.875,21.375],[6.5,1],[64.625,-1.125],[-4.875,-11.125]],"v":[[829.25,311.625],[792.75,351.5],[772.375,402.875],[864.25,347.625]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[3.742,3.125],[4.423,-6.5],[24.191,-19],[-1.233,5.5]],"o":[[-3.019,21.375],[2.211,1],[27.669,-1.125],[-1.659,-11.125]],"v":[[790.515,311.625],[778.097,351.5],[769.42,401.893],[802.422,347.625]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[3.222,3.125],[3.808,-6.5],[28.845,-19],[-1.062,5.5]],"o":[[-2.6,21.375],[1.904,1],[32.993,-1.125],[-1.428,-11.125]],"v":[[796.729,306.929],[787.654,342.108],[770.229,401.893],[796.872,347.625]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[-2.985,3.125],[-3.528,-6.5],[-24.804,-19],[0.984,5.5]],"o":[[2.409,21.375],[-1.764,1],[-28.371,-1.125],[1.323,-11.125]],"v":[[740.487,303.743],[742.974,351.5],[762.918,401.893],[738.407,347.625]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[-10.874,3.125],[-12.852,-6.5],[-55.855,-19],[3.584,5.5]],"o":[[8.774,21.375],[-6.426,1],[-63.887,-1.125],[4.819,-11.125]],"v":[[707.062,311.625],[743.146,351.5],[763.288,402.875],[672.462,347.625]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[-6.287,3.125],[-9.478,-6.5],[-43.611,-19],[2.643,5.5]],"o":[[5.072,21.375],[-4.739,1],[-49.883,-1.125],[3.554,-11.125]],"v":[[733.402,311.625],[758.149,351.5],[773.854,402.42],[706.018,347.625]],"c":true}]},{"t":72,"s":[{"i":[[11,3.125],[13,-6.5],[56.5,-19],[-3.625,5.5]],"o":[[-8.875,21.375],[6.5,1],[64.625,-1.125],[-4.875,-11.125]],"v":[[829.25,311.625],[792.75,351.5],[772.375,402.875],[864.25,347.625]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.219607858097,0.239215701234,0.254901960784,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":40},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-27.24,0],[0,99.837],[26.907,0],[0,-99.837]],"o":[[27.24,0],[0,-99.837],[-26.907,0],[0,99.837]],"v":[[-0.052,146.965],[38.371,-0.491],[2.12,-147.947],[-32.821,-0.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-32.481,0],[0,99.837],[29.909,0],[0,-99.837]],"o":[[32.481,0],[0,-99.837],[-29.909,0],[0,99.837]],"v":[[0.339,146.965],[27.214,-1.078],[1.13,-147.947],[-26.099,-0.491]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[27.931,0],[0,99.837],[-27.607,0],[0,-99.837]],"o":[[-27.931,0],[0,-99.837],[27.607,0],[0,99.837]],"v":[[-2.151,146.965],[-31.481,-0.491],[-2.539,-147.947],[25.31,-0.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[62.897,0],[0,99.837],[-62.897,0],[0,-99.837]],"o":[[-62.897,0],[0,-99.837],[62.897,0],[0,99.837]],"v":[[1.009,147.947],[-112.875,0],[1.009,-147.947],[114.893,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[49.11,0],[0,99.837],[-48.947,0],[0,-99.837]],"o":[[-49.11,0],[0,-99.837],[48.947,0],[0,99.837]],"v":[[10.475,147.492],[-73.143,-0.227],[9.418,-147.947],[91.342,-0.227]],"c":true}]},{"t":72,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":39.1},"e":{"a":0,"k":46.4},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.662745118141,0.585888981819,0.483414083719,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-27.24,0],[0,99.837],[26.907,0],[0,-99.837]],"o":[[27.24,0],[0,-99.837],[-26.907,0],[0,99.837]],"v":[[-0.052,146.965],[38.371,-0.491],[2.12,-147.947],[-32.821,-0.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-32.481,0],[0,99.837],[29.909,0],[0,-99.837]],"o":[[32.481,0],[0,-99.837],[-29.909,0],[0,99.837]],"v":[[0.339,146.965],[27.214,-1.078],[1.13,-147.947],[-26.099,-0.491]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[27.931,0],[0,99.837],[-27.607,0],[0,-99.837]],"o":[[-27.931,0],[0,-99.837],[27.607,0],[0,99.837]],"v":[[-2.151,146.965],[-31.481,-0.491],[-2.539,-147.947],[25.31,-0.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[62.897,0],[0,99.837],[-62.897,0],[0,-99.837]],"o":[[-62.897,0],[0,-99.837],[62.897,0],[0,99.837]],"v":[[1.009,147.947],[-112.875,0],[1.009,-147.947],[114.893,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[49.11,0],[0,99.837],[-48.947,0],[0,-99.837]],"o":[[-49.11,0],[0,-99.837],[48.947,0],[0,99.837]],"v":[[10.475,147.492],[-73.143,-0.227],[9.418,-147.947],[91.342,-0.227]],"c":true}]},{"t":72,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":46.6},"e":{"a":0,"k":83.8},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.23667819798,0.439364284277,0.635294139385,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-27.24,0],[0,99.837],[26.907,0],[0,-99.837]],"o":[[27.24,0],[0,-99.837],[-26.907,0],[0,99.837]],"v":[[-0.052,146.965],[38.371,-0.491],[2.12,-147.947],[-32.821,-0.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-32.481,0],[0,99.837],[29.909,0],[0,-99.837]],"o":[[32.481,0],[0,-99.837],[-29.909,0],[0,99.837]],"v":[[0.339,146.965],[27.214,-1.078],[1.13,-147.947],[-26.099,-0.491]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[27.931,0],[0,99.837],[-27.607,0],[0,-99.837]],"o":[[-27.931,0],[0,-99.837],[27.607,0],[0,99.837]],"v":[[-2.151,146.965],[-31.481,-0.491],[-2.539,-147.947],[25.31,-0.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[62.897,0],[0,99.837],[-62.897,0],[0,-99.837]],"o":[[-62.897,0],[0,-99.837],[62.897,0],[0,99.837]],"v":[[1.009,147.947],[-112.875,0],[1.009,-147.947],[114.893,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[49.11,0],[0,99.837],[-48.947,0],[0,-99.837]],"o":[[-49.11,0],[0,-99.837],[48.947,0],[0,99.837]],"v":[[10.475,147.492],[-73.143,-0.227],[9.418,-147.947],[91.342,-0.227]],"c":true}]},{"t":72,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":75.5},"e":{"a":0,"k":95.6},"o":{"a":0,"k":63},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-27.24,0],[0,99.837],[26.907,0],[0,-99.837]],"o":[[27.24,0],[0,-99.837],[-26.907,0],[0,99.837]],"v":[[-0.052,146.965],[38.371,-0.491],[2.12,-147.947],[-32.821,-0.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-32.481,0],[0,99.837],[29.909,0],[0,-99.837]],"o":[[32.481,0],[0,-99.837],[-29.909,0],[0,99.837]],"v":[[0.339,146.965],[27.214,-1.078],[1.13,-147.947],[-26.099,-0.491]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[27.931,0],[0,99.837],[-27.607,0],[0,-99.837]],"o":[[-27.931,0],[0,-99.837],[27.607,0],[0,99.837]],"v":[[-2.151,146.965],[-31.481,-0.491],[-2.539,-147.947],[25.31,-0.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[62.897,0],[0,99.837],[-62.897,0],[0,-99.837]],"o":[[-62.897,0],[0,-99.837],[62.897,0],[0,99.837]],"v":[[1.009,147.947],[-112.875,0],[1.009,-147.947],[114.893,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[49.11,0],[0,99.837],[-48.947,0],[0,-99.837]],"o":[[-49.11,0],[0,-99.837],[48.947,0],[0,99.837]],"v":[[10.475,147.492],[-73.143,-0.227],[9.418,-147.947],[91.342,-0.227]],"c":true}]},{"t":72,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.423529446125,0.427451014519,0.415686309338,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[767.298,251.015]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 111","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-4.112,0.411],[0,50.149],[3.5,-0.1],[0,-50.149]],"o":[[4.112,-0.411],[0,-50.149],[-3.5,0.1],[0,50.149]],"v":[[-2.801,104.456],[6.878,-2.754],[-2.07,-106.937],[-6.155,-4.173]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-0.228,0.378],[0,46.119],[0.194,-0.092],[0,-46.119]],"o":[[0.228,-0.378],[0,-46.119],[-0.194,0.092],[0,46.119]],"v":[[-25.082,94.528],[-21.715,-4.066],[-22.008,-96.354],[-22.437,-5.371]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[1.805,0.411],[0,50.149],[-1.536,-0.1],[0,-50.149]],"o":[[-1.805,-0.411],[0,-50.149],[1.536,0.1],[0,50.149]],"v":[[9.69,103.76],[5.441,-3.45],[9.369,-107.633],[11.162,-4.868]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[58.862,0],[0,50.149],[-58.862,0],[0,-50.149]],"o":[[-58.862,0],[0,-50.149],[58.862,0],[0,50.149]],"v":[[0.015,108.6],[-74.972,0],[0.015,-108.6],[75.002,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[27.872,0.19],[0,50.149],[-27.639,-0.046],[0,-50.149]],"o":[[-27.872,-0.19],[0,-50.149],[27.639,0.046],[0,50.149]],"v":[[2.483,106.68],[-34.718,-1.276],[2.204,-107.83],[37.271,-1.933]],"c":true}]},{"t":72,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":9.1},"e":{"a":0,"k":38.5},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294133425,0.4392157197,0.635294139385,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-4.112,0.411],[0,50.149],[3.5,-0.1],[0,-50.149]],"o":[[4.112,-0.411],[0,-50.149],[-3.5,0.1],[0,50.149]],"v":[[-2.801,104.456],[6.878,-2.754],[-2.07,-106.937],[-6.155,-4.173]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-0.228,0.378],[0,46.119],[0.194,-0.092],[0,-46.119]],"o":[[0.228,-0.378],[0,-46.119],[-0.194,0.092],[0,46.119]],"v":[[-25.082,94.528],[-21.715,-4.066],[-22.008,-96.354],[-22.437,-5.371]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[1.805,0.411],[0,50.149],[-1.536,-0.1],[0,-50.149]],"o":[[-1.805,-0.411],[0,-50.149],[1.536,0.1],[0,50.149]],"v":[[9.69,103.76],[5.441,-3.45],[9.369,-107.633],[11.162,-4.868]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[58.862,0],[0,50.149],[-58.862,0],[0,-50.149]],"o":[[-58.862,0],[0,-50.149],[58.862,0],[0,50.149]],"v":[[0.015,108.6],[-74.972,0],[0.015,-108.6],[75.002,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[27.872,0.19],[0,50.149],[-27.639,-0.046],[0,-50.149]],"o":[[-27.872,-0.19],[0,-50.149],[27.639,0.046],[0,50.149]],"v":[[2.483,106.68],[-34.718,-1.276],[2.204,-107.83],[37.271,-1.933]],"c":true}]},{"t":72,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":58.1},"e":{"a":0,"k":94.4},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.423529446125,0.427451014519,0.415686309338,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-4.112,0.411],[0,50.149],[3.5,-0.1],[0,-50.149]],"o":[[4.112,-0.411],[0,-50.149],[-3.5,0.1],[0,50.149]],"v":[[-2.801,104.456],[6.878,-2.754],[-2.07,-106.937],[-6.155,-4.173]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-0.228,0.378],[0,46.119],[0.194,-0.092],[0,-46.119]],"o":[[0.228,-0.378],[0,-46.119],[-0.194,0.092],[0,46.119]],"v":[[-25.082,94.528],[-21.715,-4.066],[-22.008,-96.354],[-22.437,-5.371]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[1.805,0.411],[0,50.149],[-1.536,-0.1],[0,-50.149]],"o":[[-1.805,-0.411],[0,-50.149],[1.536,0.1],[0,50.149]],"v":[[9.69,103.76],[5.441,-3.45],[9.369,-107.633],[11.162,-4.868]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[58.862,0],[0,50.149],[-58.862,0],[0,-50.149]],"o":[[-58.862,0],[0,-50.149],[58.862,0],[0,50.149]],"v":[[0.015,108.6],[-74.972,0],[0.015,-108.6],[75.002,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[27.872,0.19],[0,50.149],[-27.639,-0.046],[0,-50.149]],"o":[[-27.872,-0.19],[0,-50.149],[27.639,0.046],[0,50.149]],"v":[[2.483,106.68],[-34.718,-1.276],[2.204,-107.83],[37.271,-1.933]],"c":true}]},{"t":72,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[767.798,251.015]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 110","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-17.647,-41.07],[20.676,-33.78],[0.949,1.378],[15.484,48.625]],"o":[[22.288,51.87],[-2.059,-3.98],[23.261,-37.935],[-7.266,-22.817]],"v":[[3.839,-76.089],[-7.36,91.865],[-12.133,82.466],[0.144,-74.651]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-6.004,-41.07],[7.034,-33.78],[0.323,1.378],[5.268,48.625]],"o":[[7.583,51.87],[-0.701,-3.98],[7.914,-37.935],[-2.472,-22.817]],"v":[[-61.262,-76.089],[-65.072,91.865],[-66.696,82.466],[-62.519,-74.651]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-0.771,-41.497],[6.057,-33.78],[0.278,1.378],[2.137,48.847]],"o":[[0.705,37.95],[-0.603,-3.98],[2.498,-42.874],[-1.003,-22.921]],"v":[[-69.36,-75.503],[-70.327,91.865],[-71.725,82.466],[-70.512,-74.139]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[4.789,-41.07],[-5.611,-33.78],[-0.258,1.378],[-4.202,48.625]],"o":[[-6.049,51.87],[0.559,-3.98],[-6.313,-37.935],[1.972,-22.817]],"v":[[-128.312,-76.089],[-125.273,91.865],[-123.977,82.466],[-127.309,-74.651]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[17.446,-41.07],[-20.44,-33.78],[-0.938,1.378],[-15.307,48.625]],"o":[[-22.034,51.87],[2.036,-3.98],[-22.995,-37.935],[7.183,-22.817]],"v":[[-197.815,-76.089],[-186.744,91.865],[-182.025,82.466],[-194.162,-74.651]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[12.867,-41.07],[-15.075,-33.78],[-0.542,1.378],[-11.29,48.625]],"o":[[-16.25,51.87],[1.501,-3.98],[-13.294,-37.935],[5.298,-22.817]],"v":[[-162.972,-76.089],[-154.807,91.865],[-145.681,82.466],[-160.277,-74.651]],"c":true}]},{"t":72,"s":[{"i":[[-17.647,-41.07],[20.676,-33.78],[0.949,1.378],[15.484,48.625]],"o":[[22.288,51.87],[-2.059,-3.98],[23.261,-37.935],[-7.266,-22.817]],"v":[[3.839,-76.089],[-7.36,91.865],[-12.133,82.466],[0.144,-74.651]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.21960785985,0.239215701818,0.254901975393,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[865.372,259.218]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 9","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[5.462,51.14],[-98.688,0],[0,-83.007],[15.245,-26.998],[5.351,5.622],[0,25.245],[61.179,0],[2.748,-46.673],[-29.946,-41.99]],"o":[[-2.585,-24.204],[49.312,0],[0,10.137],[-5.005,-5.248],[11.851,-23.628],[0,-63.421],[-56.02,0],[0,36.327],[4.209,5.902]],"v":[[-75.154,54.595],[13.996,-100.06],[108.222,25.242],[91.563,114.233],[81.957,104.364],[95.34,24.656],[9.629,-84.327],[-66.94,20.332],[-41.746,121.975]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[0.411,51.14],[-5.801,0.165],[0,-83.007],[0.803,-27.212],[1.782,5.472],[0,25.245],[3.596,-0.102],[0,-46.673],[-1.821,-42.152]],"o":[[-0.195,-24.204],[2.899,-0.083],[0,10.137],[-1.666,-5.107],[0.362,-23.782],[0,-63.421],[-3.293,0.094],[0,36.327],[0.265,6.134]],"v":[[-1.534,52.632],[6.106,-93.626],[16.219,22.488],[9.837,114.066],[6.66,104.465],[16.089,21.902],[6.846,-81.8],[2.949,16.159],[3.035,120.799]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0.023,47.03],[-0.321,0.152],[0,-76.336],[0.044,-25.025],[0.099,5.032],[0,23.216],[0.199,-0.094],[0,-42.922],[-0.101,-38.764]],"o":[[-0.011,-22.258],[0.161,-0.076],[0,9.322],[-0.092,-4.697],[0.02,-21.871],[0,-58.324],[-0.182,0.086],[0,33.407],[0.015,5.641]],"v":[[-13.579,49.099],[-12.954,-81.883],[-12.596,21.378],[-15.78,105.596],[-15.956,96.767],[-12.603,20.838],[-12.913,-71.007],[-13.331,15.557],[-16.157,111.788]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[-0.18,51.14],[2.546,0.165],[0,-83.007],[-0.353,-27.212],[-0.782,5.472],[0,25.245],[-1.578,-0.102],[0,-46.673],[0.799,-42.152]],"o":[[0.085,-24.204],[-1.272,-0.083],[0,10.137],[0.731,-5.107],[-0.159,-23.782],[0,-63.421],[1.445,0.094],[0,36.327],[-0.116,6.134]],"v":[[22.237,51.936],[18.883,-94.322],[14.444,21.792],[17.246,113.371],[18.64,103.77],[14.501,21.206],[18.558,-82.495],[20.269,15.463],[20.231,120.104]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[-5.4,51.14],[97.561,0],[0,-83.007],[-15.071,-26.998],[-5.29,5.622],[0,25.245],[-60.481,0],[-2.717,-46.673],[29.604,-41.99]],"o":[[2.556,-24.204],[-48.749,0],[0,10.137],[4.948,-5.248],[-11.715,-23.628],[0,-63.421],[55.381,0],[0,36.327],[-4.161,5.902]],"v":[[92.419,54.595],[4.287,-100.06],[-88.863,25.242],[-72.395,114.233],[-62.899,104.364],[-83.352,26.629],[8.337,-98.984],[84.299,20.332],[59.392,121.975]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[-2.57,51.14],[45.81,0.077],[0,-83.007],[-7.041,-27.097],[-3.043,5.552],[0,25.245],[-28.399,-0.048],[-1.214,-46.673],[17.763,-42.065]],"o":[[1.216,-24.204],[-22.89,-0.038],[0,10.137],[2.846,-5.183],[-5.373,-23.7],[0,-63.421],[26.004,0.043],[0,36.327],[-2.501,6.01]],"v":[[51.802,53.686],[9.504,-97.079],[-40.791,23.966],[-26.185,114.156],[-20.73,104.411],[-30.238,23.38],[11.151,-83.156],[46.464,18.399],[39.162,117.422]],"c":true}]},{"t":72,"s":[{"i":[[5.462,51.14],[-98.688,0],[0,-83.007],[15.245,-26.998],[5.351,5.622],[0,25.245],[61.179,0],[2.748,-46.673],[-29.946,-41.99]],"o":[[-2.585,-24.204],[49.312,0],[0,10.137],[-5.005,-5.248],[11.851,-23.628],[0,-63.421],[-56.02,0],[0,36.327],[4.209,5.902]],"v":[[-75.154,54.595],[13.996,-100.06],[108.222,25.242],[91.563,114.233],[81.957,104.364],[95.34,24.656],[9.629,-84.327],[-66.94,20.332],[-41.746,121.975]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.73,1,1,1,0.865,0.61,0.62,0.627,1,0.22,0.239,0.255]}},"s":{"a":0,"k":[156,38]},"e":{"a":0,"k":[52,-47]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_btZVnqsKTD","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[758.692,223.265]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 112","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-62.654,0],[-2.227,-2.586],[19.903,-0.16],[13.699,63.134],[-133.907,-3.422],[-0.352,-54.552],[21.188,-44.334],[0.949,1.378],[2.184,49.971],[46.545,0],[0,-70.087]],"o":[[33.098,0],[3.205,3.722],[-37.094,0.299],[-3.677,-16.943],[63.056,1.611],[0.294,45.634],[-2.059,-1.88],[5.074,-14.7],[-2.373,-54.296],[-67.205,0],[0,62.377]],"v":[[-1.715,122.978],[42.485,118.556],[-5.615,130.583],[-100.472,45.188],[9.827,-133.142],[108.295,-11.872],[84.946,101.303],[71.023,83.054],[88.099,-11.863],[3.339,-118.156],[-88.715,-3.444]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-1.423,0],[-0.051,-2.586],[4.022,1.385],[0.337,40.694],[-17.328,0.424],[-0.004,-54.552],[0.439,-44.598],[0.354,1.35],[0.022,49.971],[2.736,-0.078],[0,-70.087]],"o":[[0.752,0],[0.073,3.722],[-3.341,-1.151],[-0.323,-39.09],[4.221,-0.103],[0.003,45.634],[-0.658,-1.823],[-0.3,-14.743],[-0.024,-54.296],[-3.95,0.113],[0,62.377]],"v":[[-9.442,118.56],[-8.438,114.137],[-12.598,122.36],[-23.982,21.746],[-10.89,-120.12],[0.456,-14.626],[-2.734,100.863],[-7.731,83.021],[0.252,-14.618],[-9.055,-113.515],[-13.035,-7.617]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-0.079,0],[-0.003,-2.379],[0.223,1.274],[0.019,37.424],[-0.96,0.39],[0,-50.168],[0.024,-41.014],[0.02,1.242],[0.001,45.956],[0.152,-0.072],[0,-64.454]],"o":[[0.042,0],[0.004,3.423],[-0.185,-1.058],[-0.018,-35.948],[0.234,-0.095],[0,41.966],[-0.036,-1.677],[-0.017,-13.558],[-0.001,-49.933],[-0.219,0.104],[0,57.364]],"v":[[-31.89,107.698],[-31.835,103.631],[-32.065,111.193],[-29.866,18.665],[-28.938,-108.278],[-28.511,-14.784],[-31.519,91.423],[-31.796,75.016],[-28.523,-14.776],[-28.836,-102.204],[-29.259,-8.339]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0.625,0],[0.022,-2.586],[-1.766,1.385],[-0.148,40.694],[7.606,0.424],[0.002,-54.552],[-0.193,-44.598],[-0.155,1.35],[-0.01,49.971],[-1.201,-0.078],[0,-70.087]],"o":[[-0.33,0],[-0.032,3.722],[1.467,-1.151],[0.142,-39.09],[-1.853,-0.103],[-0.001,45.634],[0.289,-1.823],[0.132,-14.743],[0.01,-54.296],[1.734,0.113],[0,62.377]],"v":[[2.793,117.864],[2.352,113.442],[4.178,121.665],[9.175,21.051],[3.428,-120.816],[-1.552,-15.321],[-0.151,100.167],[2.042,82.326],[-1.462,-15.313],[2.623,-114.21],[4.37,-8.313]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[61.939,0],[2.201,-2.586],[-19.676,-0.161],[-13.543,63.134],[132.378,-3.422],[0.347,-54.552],[-20.946,-44.334],[-0.938,1.379],[-2.159,49.971],[-46.013,0],[0,-70.087]],"o":[[-32.72,0],[-3.168,3.722],[36.67,0.299],[3.635,-16.943],[-62.336,1.611],[-0.291,45.633],[2.036,-1.88],[-5.016,-14.7],[2.346,-54.296],[66.438,0],[0,62.377]],"v":[[-11.85,122.978],[-55.545,118.556],[-7.994,130.583],[85.78,45.188],[-23.26,-133.142],[-120.603,-11.872],[-97.521,101.303],[-83.756,83.054],[-100.638,-11.863],[-16.845,-118.156],[74.157,-3.444]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[28.222,0],[1.28,-2.586],[-10.326,0.556],[-6.18,52.738],[65.765,-1.64],[0.157,-54.552],[-9.528,-44.456],[-0.554,1.365],[-0.973,49.971],[-21.605,-0.036],[0,-70.087]],"o":[[-14.909,0],[-1.842,3.722],[17.661,-0.372],[1.748,-27.204],[-29.466,0.817],[-0.131,45.634],[1.16,-1.854],[-2.127,-14.72],[1.057,-54.296],[31.196,0.052],[0,62.377]],"v":[[-6.659,120.931],[-24.394,116.509],[-3.732,126.774],[42.514,34.328],[-11.206,-127.109],[-59.033,-13.148],[-47.501,101.099],[-39.445,83.039],[-50.033,-13.139],[-9.039,-116.005],[33.146,-5.377]],"c":true}]},{"t":72,"s":[{"i":[[-62.654,0],[-2.227,-2.586],[19.903,-0.16],[13.699,63.134],[-133.907,-3.422],[-0.352,-54.552],[21.188,-44.334],[0.949,1.378],[2.184,49.971],[46.545,0],[0,-70.087]],"o":[[33.098,0],[3.205,3.722],[-37.094,0.299],[-3.677,-16.943],[63.056,1.611],[0.294,45.634],[-2.059,-1.88],[5.074,-14.7],[-2.373,-54.296],[-67.205,0],[0,62.377]],"v":[[-1.715,122.978],[42.485,118.556],[-5.615,130.583],[-100.472,45.188],[9.827,-133.142],[108.295,-11.872],[84.946,101.303],[71.023,83.054],[88.099,-11.863],[3.339,-118.156],[-88.715,-3.444]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.435294121504,0.238985002041,0.271703183651,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[774.617,248.531]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[-72.555,0],[-2.177,-3.361],[32.647,1.819],[0.279,48.522],[-18.837,18.404],[-40.535,-29.451],[13.641,-11.606],[0,-63.202]],"o":[[27.073,0],[3.948,9.763],[-82.184,-4.578],[-0.394,-68.479],[25.679,-25.088],[-62.035,-20.701],[-13.349,11.358],[0,62.377]],"v":[[39.132,57.558],[86.382,47.936],[21.015,72.278],[-72.276,-64.321],[-32.599,-180.462],[96.115,-191.599],[-15.061,-180.944],[-57.468,-71.614]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-1.648,0],[-0.049,-3.361],[13.978,1.819],[0.095,48.522],[-6.409,18.404],[-4.248,-22.057],[2.891,-8.822],[0,-63.202]],"o":[[0.615,0],[0.09,9.763],[-35.188,-4.578],[-0.134,-68.479],[8.736,-25.088],[-4.958,-15.447],[-2.829,8.633],[0,62.377]],"v":[[33.457,53.14],[34.531,43.518],[29.319,71.296],[4.655,-65.058],[14.98,-183.898],[36.683,-186.501],[32.82,-179.251],[29.794,-75.787]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-0.091,0],[-0.002,-3.091],[-16.625,-7.753],[0.082,48.522],[-5.518,18.404],[-0.235,-20.284],[0.16,-8.113],[0,-58.122]],"o":[[0.034,0],[0.005,8.979],[-41.958,-4.578],[-0.115,-68.479],[7.522,-25.088],[-0.275,-14.206],[-0.157,7.94],[0,57.364]],"v":[[11.054,41.808],[11.113,32.959],[32.03,76.697],[11.12,-65.058],[17.585,-179.672],[14.265,-175.052],[14.051,-168.384],[13.682,-76.757]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0.724,0],[0.014,-3.362],[8.724,-14.668],[-0.076,48.522],[5.112,18.404],[1.865,-22.057],[-1.269,-8.822],[0,-63.202]],"o":[[-0.27,0],[-0.039,9.763],[36.08,-4.578],[0.107,-68.479],[-6.969,-25.088],[2.176,-15.447],[1.242,8.633],[0,62.377]],"v":[[45.761,52.444],[45.29,42.822],[37.227,75.353],[59.465,-65.058],[51.228,-183.898],[44.345,-187.197],[46.041,-179.946],[47.369,-76.482]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[71.726,0],[2.152,-3.361],[-32.275,1.819],[-0.276,48.522],[18.622,18.404],[40.072,-29.451],[-13.485,-11.606],[0,-63.202]],"o":[[-26.764,0],[-3.903,9.763],[81.246,-4.578],[0.389,-68.479],[-25.386,-25.088],[61.326,-20.701],[13.197,11.358],[0,62.377]],"v":[[33.174,57.558],[-13.537,47.936],[51.084,72.278],[143.31,-64.321],[104.086,-180.462],[-23.159,-191.599],[86.748,-180.944],[128.671,-71.614]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[32.681,0],[1.251,-3.361],[-23.477,9.336],[-0.159,48.522],[10.766,18.404],[19.527,-26.025],[-7.129,-10.317],[0,-63.202]],"o":[[-12.195,0],[-2.269,9.763],[37.166,-14.78],[0.225,-68.479],[-14.676,-25.088],[29.296,-18.267],[6.976,10.096],[0,62.377]],"v":[[37.234,55.511],[18.007,45.889],[57.383,71.823],[103.71,-75.121],[75.969,-182.054],[10.831,-189.237],[61.418,-180.159],[81.307,-73.547]],"c":true}]},{"t":72,"s":[{"i":[[-72.555,0],[-2.177,-3.361],[32.647,1.819],[0.279,48.522],[-18.837,18.404],[-40.535,-29.451],[13.641,-11.606],[0,-63.202]],"o":[[27.073,0],[3.948,9.763],[-82.184,-4.578],[-0.394,-68.479],[25.679,-25.088],[-62.035,-20.701],[-13.349,11.358],[0,62.377]],"v":[[39.132,57.558],[86.382,47.936],[21.015,72.278],[-72.276,-64.321],[-32.599,-180.462],[96.115,-191.599],[-15.061,-180.944],[-57.468,-71.614]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.678,0.275,0.318,0.341,0.74,0.275,0.318,0.341,0.803,0.275,0.318,0.341,0.68,1,0.743,0.5,0.805,0]}},"s":{"a":0,"k":[53,-7]},"e":{"a":0,"k":[-61,72]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_gLWNxEIQIq","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1,0,1,0.5,0.6,1,0.2]}},"s":{"a":0,"k":[-66,-107]},"e":{"a":0,"k":[-32,-181]},"t":1,"nm":"Gradient_NZOa4ZOSai","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[731.67,319.8]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[59.542,0],[0,50.149],[-59.542,0],[0,-50.149]],"o":[[-59.542,0],[0,-50.149],[59.542,0],[0,50.149]],"v":[[-0.202,108.615],[-76.055,0.015],[-0.202,-108.585],[75.651,0.015]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[4.111,-0.411],[0,50.149],[-3.5,0.1],[0,-50.149]],"o":[[-4.111,0.411],[0,-50.149],[3.5,-0.1],[0,50.149]],"v":[[-3.003,104.471],[-6.357,-4.158],[-2.272,-106.922],[6.676,-2.739]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0.228,-0.378],[0,46.119],[-0.194,0.092],[0,-46.119]],"o":[[-0.228,0.378],[0,-46.119],[0.194,-0.092],[0,46.119]],"v":[[-25.284,94.543],[-22.639,-5.356],[-22.21,-96.339],[-21.917,-4.051]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[-1.805,-0.411],[0,50.149],[1.536,0.1],[0,-50.149]],"o":[[1.805,0.411],[0,-50.149],[-1.536,-0.1],[0,50.149]],"v":[[9.488,103.775],[10.96,-4.853],[9.167,-107.618],[5.239,-3.435]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[-58.862,0],[0,50.149],[58.862,0],[0,-50.149]],"o":[[58.862,0],[0,-50.149],[-58.862,0],[0,50.149]],"v":[[-0.187,108.615],[74.8,0.015],[-0.187,-108.585],[-75.174,0.015]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[-27.872,-0.19],[0,50.149],[27.638,0.046],[0,-50.149]],"o":[[27.872,0.19],[0,-50.149],[-27.638,-0.046],[0,50.149]],"v":[[2.281,106.695],[37.069,-1.918],[2.002,-107.815],[-34.92,-1.261]],"c":true}]},{"t":72,"s":[{"i":[[59.542,0],[0,50.149],[-59.542,0],[0,-50.149]],"o":[[-59.542,0],[0,-50.149],[59.542,0],[0,50.149]],"v":[[-0.202,108.615],[-76.055,0.015],[-0.202,-108.585],[75.651,0.015]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":7,"s":[{"i":[[0,0],[0,99.837],[63.623,0],[0,-99.837],[-63.623,0]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837],[0,0]],"v":[[-0.202,147.962],[114.997,0.015],[-0.202,-147.932],[-115.402,0.015],[-0.202,147.962]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[0,0],[0,99.837],[26.907,0],[0,-99.837],[-27.24,0]],"o":[[27.24,0],[0,-99.837],[-26.907,0],[0,99.837],[0,0]],"v":[[-0.54,146.98],[37.839,-0.476],[1.629,-147.932],[-33.353,-0.476],[-0.54,146.98]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,0],[0,99.837],[29.909,0],[0,-99.837],[-32.481,0]],"o":[[32.481,0],[0,-99.837],[-29.909,0],[0,99.837],[0,0]],"v":[[-0.108,146.98],[26.659,-1.063],[0.663,-147.932],[-26.655,-0.476],[-0.108,146.98]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0,0],[0,99.837],[-27.607,0],[0,-99.837],[27.931,0]],"o":[[-27.931,0],[0,-99.837],[27.607,0],[0,99.837],[0,0]],"v":[[-3.072,146.98],[-32.319,-0.476],[-3.458,-147.932],[24.472,-0.476],[-3.072,146.98]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":30,"s":[{"i":[[0,0],[0,99.837],[-62.896,0],[0,-99.837],[62.896,0]],"o":[[-62.896,0],[0,-99.837],[62.896,0],[0,99.837],[0,0]],"v":[[-0.187,147.962],[-114.071,0.015],[-0.187,-147.932],[113.697,0.015],[-0.187,147.962]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[0,0],[0,99.837],[-48.947,0],[0,-99.837],[49.109,0]],"o":[[-49.109,0],[0,-99.837],[48.947,0],[0,99.837],[0,0]],"v":[[9.387,147.507],[-74.21,-0.212],[8.331,-147.932],[90.275,-0.212],[9.387,147.507]],"c":true}]},{"t":72,"s":[{"i":[[0,0],[0,99.837],[63.623,0],[0,-99.837],[-63.623,0]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837],[0,0]],"v":[[-0.202,147.962],[114.997,0.015],[-0.202,-147.932],[-115.402,0.015],[-0.202,147.962]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.816,0.702,0.553,0.5,0.816,0.702,0.553,1,0.816,0.702,0.553,0,1,0.5,0.5,1,0]}},"s":{"a":0,"k":[55,-124]},"e":{"a":0,"k":[8.5,-62.5]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_e0b9FplC79","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.816,0.702,0.553,0.5,0.816,0.702,0.553,1,0.816,0.702,0.553,0,1,0.5,0.5,1,0]}},"s":{"a":0,"k":[-44,117]},"e":{"a":0,"k":[-18.5,80.5]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_6gBd4ppTZG","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.506,0.643,0.8,0.239,0.506,0.643,0.8,0.477,0.506,0.643,0.8,0.739,0.496,0.571,0.651,1,0.486,0.498,0.502]}},"s":{"a":0,"k":[-55.5,-113]},"e":{"a":0,"k":[86,84.5]},"t":1,"nm":"Gradient_6ErmQfSO7M","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[768,251]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"ะกะปะพะน 1","bm":0,"hd":false}],"ip":1,"op":38,"st":2,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"LINK L","parent":5,"sr":1,"ks":{"r":{"a":0,"k":45},"p":{"a":0,"k":[-69.922,70.597,0]},"a":{"a":0,"k":[186.078,326.597,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-23.652,0],[0,99.837],[23.81,0],[0,-99.837]],"o":[[23.652,0],[0,-99.837],[-23.81,0],[0,99.837]],"v":[[-1.059,147.947],[27.527,0],[-1.138,-147.947],[-30.127,0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-27.096,0],[0,99.837],[31.021,0],[0,-99.837]],"o":[[27.096,0],[0,-99.837],[-31.021,0],[0,99.837]],"v":[[-1.562,147.947],[27.527,0],[-2.238,-147.947],[-30.127,0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[29.838,0],[0,99.837],[-28.288,0],[0,-99.837]],"o":[[-29.838,0],[0,-99.837],[28.288,0],[0,99.837]],"v":[[1.962,147.947],[-30.947,0],[1.81,-147.947],[19.49,-0.508]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[25.637,0],[0,99.837],[-26.097,0],[0,-99.837]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837]],"v":[[1.177,147.947],[-35.597,0],[1.284,-147.947],[36.257,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[64.208,0],[0,99.837],[-64.208,0],[0,-99.837]],"o":[[-64.208,0],[0,-99.837],[64.208,0],[0,99.837]],"v":[[0.505,147.947],[-115.754,0],[0.505,-147.947],[116.764,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[25.637,0],[0,99.837],[-26.097,0],[0,-99.837]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837]],"v":[[1.177,147.947],[-35.597,0],[1.284,-147.947],[36.257,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[29.838,0],[0,99.837],[-28.288,0],[0,-99.837]],"o":[[-29.838,0],[0,-99.837],[28.288,0],[0,99.837]],"v":[[1.962,147.947],[-30.947,0],[1.81,-147.947],[31.164,0]],"c":true}]},{"t":68,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":40.9},"e":{"a":0,"k":47.1},"o":{"a":0,"k":-16},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.662745118141,0.585888981819,0.483414083719,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-23.652,0],[0,99.837],[23.81,0],[0,-99.837]],"o":[[23.652,0],[0,-99.837],[-23.81,0],[0,99.837]],"v":[[-1.059,147.947],[27.527,0],[-1.138,-147.947],[-30.127,0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-27.096,0],[0,99.837],[31.021,0],[0,-99.837]],"o":[[27.096,0],[0,-99.837],[-31.021,0],[0,99.837]],"v":[[-1.562,147.947],[27.527,0],[-2.238,-147.947],[-30.127,0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[29.838,0],[0,99.837],[-28.288,0],[0,-99.837]],"o":[[-29.838,0],[0,-99.837],[28.288,0],[0,99.837]],"v":[[1.962,147.947],[-30.947,0],[1.81,-147.947],[31.164,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[25.637,0],[0,99.837],[-26.097,0],[0,-99.837]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837]],"v":[[1.177,147.947],[-35.597,0],[1.284,-147.947],[36.257,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[64.208,0],[0,99.837],[-64.208,0],[0,-99.837]],"o":[[-64.208,0],[0,-99.837],[64.208,0],[0,99.837]],"v":[[0.505,147.947],[-115.754,0],[0.505,-147.947],[116.764,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[25.637,0],[0,99.837],[-26.097,0],[0,-99.837]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837]],"v":[[1.177,147.947],[-35.597,0],[1.284,-147.947],[36.257,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[29.838,0],[0,99.837],[-28.288,0],[0,-99.837]],"o":[[-29.838,0],[0,-99.837],[28.288,0],[0,99.837]],"v":[[1.962,147.947],[-30.947,0],[1.81,-147.947],[31.164,0]],"c":true}]},{"t":68,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":46.6},"e":{"a":0,"k":83.8},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.23667819798,0.439364284277,0.635294139385,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-23.652,0],[0,99.837],[23.81,0],[0,-99.837]],"o":[[23.652,0],[0,-99.837],[-23.81,0],[0,99.837]],"v":[[-1.059,147.947],[27.527,0],[-1.138,-147.947],[-30.127,0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-27.096,0],[0,99.837],[31.021,0],[0,-99.837]],"o":[[27.096,0],[0,-99.837],[-31.021,0],[0,99.837]],"v":[[-1.562,147.947],[27.527,0],[-2.238,-147.947],[-30.127,0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[29.838,0],[0,99.837],[-28.288,0],[0,-99.837]],"o":[[-29.838,0],[0,-99.837],[28.288,0],[0,99.837]],"v":[[1.962,147.947],[-30.947,0],[1.81,-147.947],[31.164,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[25.637,0],[0,99.837],[-26.097,0],[0,-99.837]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837]],"v":[[1.177,147.947],[-35.597,0],[1.284,-147.947],[36.257,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[64.208,0],[0,99.837],[-64.208,0],[0,-99.837]],"o":[[-64.208,0],[0,-99.837],[64.208,0],[0,99.837]],"v":[[0.505,147.947],[-115.754,0],[0.505,-147.947],[116.764,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[25.637,0],[0,99.837],[-26.097,0],[0,-99.837]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837]],"v":[[1.177,147.947],[-35.597,0],[1.284,-147.947],[36.257,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[29.838,0],[0,99.837],[-28.288,0],[0,-99.837]],"o":[[-29.838,0],[0,-99.837],[28.288,0],[0,99.837]],"v":[[1.962,147.947],[-30.947,0],[1.81,-147.947],[31.164,0]],"c":true}]},{"t":68,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":82},"e":{"a":0,"k":100},"o":{"a":0,"k":63},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-23.652,0],[0,99.837],[23.81,0],[0,-99.837]],"o":[[23.652,0],[0,-99.837],[-23.81,0],[0,99.837]],"v":[[-1.059,147.947],[27.527,0],[-1.138,-147.947],[-30.127,0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-27.096,0],[0,99.837],[31.021,0],[0,-99.837]],"o":[[27.096,0],[0,-99.837],[-31.021,0],[0,99.837]],"v":[[-1.562,147.947],[27.527,0],[-2.238,-147.947],[-30.127,0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[29.838,0],[0,99.837],[-28.288,0],[0,-99.837]],"o":[[-29.838,0],[0,-99.837],[28.288,0],[0,99.837]],"v":[[1.962,147.947],[-30.947,0],[1.81,-147.947],[31.164,0]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[25.637,0],[0,99.837],[-26.097,0],[0,-99.837]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837]],"v":[[1.177,147.947],[-35.597,0],[1.284,-147.947],[36.257,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[64.208,0],[0,99.837],[-64.208,0],[0,-99.837]],"o":[[-64.208,0],[0,-99.837],[64.208,0],[0,99.837]],"v":[[0.505,147.947],[-115.754,0],[0.505,-147.947],[116.764,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[25.637,0],[0,99.837],[-26.097,0],[0,-99.837]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837]],"v":[[1.177,147.947],[-35.597,0],[1.284,-147.947],[36.257,0]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[29.838,0],[0,99.837],[-28.288,0],[0,-99.837]],"o":[[-29.838,0],[0,-99.837],[28.288,0],[0,99.837]],"v":[[1.962,147.947],[-30.947,0],[1.81,-147.947],[31.164,0]],"c":true}]},{"t":68,"s":[{"i":[[-63.623,0],[0,99.837],[63.623,0],[0,-99.837]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837]],"v":[[0,147.947],[115.199,0],[0,-147.947],[-115.199,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.423529446125,0.427451014519,0.415686309338,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.843,325.871]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"STR 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-1.194,0],[0,50.149],[0.936,0],[0,-50.149]],"o":[[1.194,0],[0,-50.149],[-0.936,0],[0,50.149]],"v":[[-13.762,109.048],[-12.096,0.746],[-14.075,-108.153],[-14.848,-0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-1.194,0],[0,50.149],[0.936,0],[0,-50.149]],"o":[[1.194,0],[0,-50.149],[-0.936,0],[0,50.149]],"v":[[-24.088,105.87],[-27.056,1.143],[-21.754,-109.476],[-29.807,0.099]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[1.719,0],[0,47.228],[-1.719,0],[0,-47.228]],"o":[[-1.719,0],[0,-47.228],[1.719,0],[0,47.228]],"v":[[26.159,101.308],[31.021,-0.712],[24.404,-106.285],[30.643,-0.712]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[1.989,0],[0,47.228],[-1.989,0],[0,-47.228]],"o":[[-1.989,0],[0,-47.228],[1.989,0],[0,47.228]],"v":[[15.747,102.577],[14.221,0.303],[15.747,-101.971],[17.213,0.303]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[60.09,0],[0,50.149],[-60.09,0],[0,-50.149]],"o":[[-60.09,0],[0,-50.149],[60.09,0],[0,50.149]],"v":[[0.505,108.6],[-76.045,0],[0.505,-108.6],[77.056,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[1.989,0],[0,47.228],[-1.989,0],[0,-47.228]],"o":[[-1.989,0],[0,-47.228],[1.989,0],[0,47.228]],"v":[[-12.841,101.96],[-16.835,0.097],[-12.841,-102.588],[-13.843,0.097]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[1.719,0],[0,47.228],[-1.719,0],[0,-47.228]],"o":[[-1.719,0],[0,-47.228],[1.719,0],[0,47.228]],"v":[[-26.482,101.656],[-21.62,-0.364],[-28.237,-105.937],[-21.998,-0.364]],"c":true}]},{"t":68,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":87.4},"e":{"a":0,"k":92.4},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.662745118141,0.584313750267,0.482352972031,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-1.194,0],[0,50.149],[0.936,0],[0,-50.149]],"o":[[1.194,0],[0,-50.149],[-0.936,0],[0,50.149]],"v":[[-13.762,109.048],[-12.096,0.746],[-14.075,-108.153],[-14.848,-0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-1.194,0],[0,50.149],[0.936,0],[0,-50.149]],"o":[[1.194,0],[0,-50.149],[-0.936,0],[0,50.149]],"v":[[-24.088,105.87],[-27.056,1.143],[-21.754,-109.476],[-29.807,0.099]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[1.719,0],[0,47.228],[-1.719,0],[0,-47.228]],"o":[[-1.719,0],[0,-47.228],[1.719,0],[0,47.228]],"v":[[26.159,101.308],[31.021,-0.712],[24.842,-106.793],[30.643,-0.712]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[1.989,0],[0,47.228],[-1.989,0],[0,-47.228]],"o":[[-1.989,0],[0,-47.228],[1.989,0],[0,47.228]],"v":[[15.747,102.577],[14.221,0.303],[15.747,-101.971],[17.213,0.303]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[60.09,0],[0,50.149],[-60.09,0],[0,-50.149]],"o":[[-60.09,0],[0,-50.149],[60.09,0],[0,50.149]],"v":[[0.505,108.6],[-76.045,0],[0.505,-108.6],[77.056,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[1.989,0],[0,47.228],[-1.989,0],[0,-47.228]],"o":[[-1.989,0],[0,-47.228],[1.989,0],[0,47.228]],"v":[[-12.841,101.96],[-16.835,0.097],[-12.841,-102.588],[-13.843,0.097]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[1.719,0],[0,47.228],[-1.719,0],[0,-47.228]],"o":[[-1.719,0],[0,-47.228],[1.719,0],[0,47.228]],"v":[[-26.482,101.656],[-21.62,-0.364],[-27.798,-106.444],[-21.998,-0.364]],"c":true}]},{"t":68,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":0,"k":42.9},"o":{"a":0,"k":-28},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.235294133425,0.4392157197,0.635294139385,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-1.194,0],[0,50.149],[0.936,0],[0,-50.149]],"o":[[1.194,0],[0,-50.149],[-0.936,0],[0,50.149]],"v":[[-13.762,109.048],[-12.096,0.746],[-14.075,-108.153],[-14.848,-0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-1.194,0],[0,50.149],[0.936,0],[0,-50.149]],"o":[[1.194,0],[0,-50.149],[-0.936,0],[0,50.149]],"v":[[-24.088,105.87],[-27.056,1.143],[-21.754,-109.476],[-29.807,0.099]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[1.719,0],[0,47.228],[-1.719,0],[0,-47.228]],"o":[[-1.719,0],[0,-47.228],[1.719,0],[0,47.228]],"v":[[26.159,101.308],[31.021,-0.712],[24.842,-107.047],[30.643,-0.712]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[1.989,0],[0,47.228],[-1.989,0],[0,-47.228]],"o":[[-1.989,0],[0,-47.228],[1.989,0],[0,47.228]],"v":[[15.747,102.577],[14.221,0.303],[15.747,-101.971],[17.213,0.303]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[60.09,0],[0,50.149],[-60.09,0],[0,-50.149]],"o":[[-60.09,0],[0,-50.149],[60.09,0],[0,50.149]],"v":[[0.505,108.6],[-76.045,0],[0.505,-108.6],[77.056,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[1.989,0],[0,47.228],[-1.989,0],[0,-47.228]],"o":[[-1.989,0],[0,-47.228],[1.989,0],[0,47.228]],"v":[[-12.841,101.96],[-16.835,0.097],[-12.841,-102.588],[-13.843,0.097]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[1.719,0],[0,47.228],[-1.719,0],[0,-47.228]],"o":[[-1.719,0],[0,-47.228],[1.719,0],[0,47.228]],"v":[[-26.482,101.656],[-21.62,-0.364],[-27.798,-106.698],[-21.998,-0.364]],"c":true}]},{"t":68,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":58.1},"e":{"a":0,"k":94.4},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.423529446125,0.427451014519,0.415686309338,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-1.194,0],[0,50.149],[0.936,0],[0,-50.149]],"o":[[1.194,0],[0,-50.149],[-0.936,0],[0,50.149]],"v":[[-13.762,109.048],[-12.096,0.746],[-14.075,-108.153],[-14.848,-0.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-1.194,0],[0,50.149],[0.936,0],[0,-50.149]],"o":[[1.194,0],[0,-50.149],[-0.936,0],[0,50.149]],"v":[[-24.088,105.87],[-27.056,1.143],[-21.754,-109.476],[-29.807,0.099]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[1.719,0],[0,47.228],[-1.719,0],[0,-47.228]],"o":[[-1.719,0],[0,-47.228],[1.719,0],[0,47.228]],"v":[[26.159,101.308],[31.021,-0.712],[24.184,-107.301],[30.643,-0.712]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[1.989,0],[0,47.228],[-1.989,0],[0,-47.228]],"o":[[-1.989,0],[0,-47.228],[1.989,0],[0,47.228]],"v":[[15.747,102.577],[14.221,0.303],[15.747,-101.971],[17.213,0.303]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[60.09,0],[0,50.149],[-60.09,0],[0,-50.149]],"o":[[-60.09,0],[0,-50.149],[60.09,0],[0,50.149]],"v":[[0.505,108.6],[-76.045,0],[0.505,-108.6],[77.056,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[1.989,0],[0,47.228],[-1.989,0],[0,-47.228]],"o":[[-1.989,0],[0,-47.228],[1.989,0],[0,47.228]],"v":[[-12.841,101.96],[-16.835,0.097],[-12.841,-102.588],[-13.843,0.097]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[1.719,0],[0,47.228],[-1.719,0],[0,-47.228]],"o":[[-1.719,0],[0,-47.228],[1.719,0],[0,47.228]],"v":[[-26.482,101.656],[-21.62,-0.364],[-28.456,-106.952],[-21.998,-0.364]],"c":true}]},{"t":68,"s":[{"i":[[-59.542,0],[0,50.149],[59.542,0],[0,-50.149]],"o":[[59.542,0],[0,-50.149],[-59.542,0],[0,50.149]],"v":[[0,108.6],[75.853,0],[0,-108.6],[-75.853,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.211764723063,0.200000017881,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":1,"ml":22.93,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.843,325.871]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"STR 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-55.5,-4.5],[24,-21.5],[-4,-2.5],[-46.75,-17],[5.1,12.857]],"o":[[-28.5,-13.75],[1,12],[9.5,-10],[-40.5,-29],[-3.452,-8.704]],"v":[[33.5,-43.25],[-69.75,-25.25],[-49,9.25],[39.5,-3],[-40.048,-23.796]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-20.77,-4.5],[5.695,-21.5],[-0.949,-2.5],[-4.966,-17],[1.21,12.857]],"o":[[-10.666,-13.75],[0.237,12],[2.254,-10],[-1.074,-18.333],[-0.819,-8.704]],"v":[[11.273,-43.25],[-20.69,-23.46],[-25.463,9.996],[-11.934,-1.657],[-9.465,-23.796]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-9.857,4.063],[5.695,-21.5],[-0.949,-2.5],[-4.966,-17],[-6.421,12.411]],"o":[[-13.896,-13.75],[0.237,12],[2.254,-10],[-1.074,-18.333],[4.017,-7.765]],"v":[[13.992,-43.25],[-20.69,-23.46],[-25.463,9.996],[-25.172,11.581],[-12.245,-26.311]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[24.676,-4.5],[-6.47,-21.5],[1.078,-2.5],[6.561,-11.154],[-2.267,12.857]],"o":[[12.671,-13.75],[1.981,8.246],[-2.561,-10],[2.064,-22.701],[1.535,-8.704]],"v":[[-13.377,-43.25],[19.423,-26.138],[24.03,2.144],[7.275,9.631],[12.324,-34.106]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[22.765,-4.5],[-7.485,-21.5],[1.247,-2.5],[14.58,-17],[-2.092,12.857]],"o":[[11.69,-13.75],[-0.312,12],[-2.963,-10],[-1.246,-21.301],[1.416,-8.704]],"v":[[-12.742,-43.25],[21.818,-25.25],[15.346,9.25],[7.383,13.692],[10.969,-34.106]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[56.01,-4.5],[-24.221,-21.5],[4.037,-2.5],[47.18,-17],[-5.147,12.857]],"o":[[28.762,-13.75],[-1.009,12],[-9.587,-10],[40.872,-29],[3.484,-8.704]],"v":[[-33.709,-43.25],[70.49,-25.25],[49.55,9.25],[-39.764,-3],[40.515,-23.796]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[22.765,-4.5],[-7.485,-21.5],[1.247,-2.5],[14.58,-17],[-2.092,12.857]],"o":[[11.69,-13.75],[-0.312,12],[-2.963,-10],[-1.246,-21.301],[1.416,-8.704]],"v":[[-12.742,-43.25],[21.818,-25.25],[15.346,9.25],[7.383,13.692],[10.969,-34.106]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[24.676,-4.5],[-6.47,-21.5],[1.078,-2.5],[6.561,-11.154],[-2.267,12.857]],"o":[[12.671,-13.75],[1.981,8.246],[-2.561,-10],[2.064,-22.701],[1.535,-8.704]],"v":[[-13.377,-43.25],[19.423,-26.138],[24.03,2.144],[7.275,9.631],[12.324,-34.106]],"c":true}]},{"t":68,"s":[{"i":[[-55.5,-4.5],[24,-21.5],[-4,-2.5],[-46.75,-17],[5.1,12.857]],"o":[[-28.5,-13.75],[1,12],[9.5,-10],[-40.5,-29],[-3.452,-8.704]],"v":[[33.5,-43.25],[-69.75,-25.25],[-49,9.25],[39.5,-3],[-40.048,-23.796]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.21960785985,0.239215701818,0.254901975393,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":30},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[256,256]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shad","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[67.675,0],[0,65],[-64.622,0],[0,-65.5]],"o":[[-53.825,0],[0,-55.413],[64.622,0],[0,55.413]],"v":[[-6.675,121],[-93,1],[-6.675,-119],[83.151,1]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[2.127,0],[0,65],[-2.269,0],[0,-65.5]],"o":[[-1.692,0],[0,-55.413],[2.269,0],[0,55.413]],"v":[[-14.066,112.049],[-15.812,0.702],[-6.197,-119],[-11.961,1.746]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[2.127,0],[0,65],[-2.269,0],[0,-65.5]],"o":[[-1.692,0],[0,-55.413],[2.269,0],[0,55.413]],"v":[[-24.392,108.872],[-30.772,1.099],[-20.031,-117.61],[-26.921,2.143]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[-1.954,0],[0,61.214],[1.866,0],[0,-61.685]],"o":[[1.554,0],[0,-52.185],[-1.866,0],[0,52.185]],"v":[[23.292,110.448],[30.399,0.23],[23.95,-114.81],[30.837,0.23]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-2.26,0],[0,61.214],[2.158,0],[0,-61.685]],"o":[[1.798,0],[0,-52.185],[-2.158,0],[0,52.185]],"v":[[15.761,114.255],[17.345,1.245],[15.761,-111.764],[13.871,1.245]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[-68.297,0],[0,65],[65.217,0],[0,-65.5]],"o":[[54.32,0],[0,-55.413],[-65.217,0],[0,55.413]],"v":[[6.835,121],[93.954,1],[6.835,-119],[-83.816,1]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[-2.26,0],[0,61.214],[2.158,0],[0,-61.685]],"o":[[1.798,0],[0,-52.185],[-2.158,0],[0,52.185]],"v":[[-12.827,113.638],[-13.711,1.04],[-12.827,-112.381],[-17.185,1.04]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-1.954,0],[0,61.214],[1.866,0],[0,-61.685]],"o":[[1.554,0],[0,-52.185],[-1.866,0],[0,52.185]],"v":[[-29.349,110.797],[-22.242,0.579],[-28.691,-114.461],[-21.804,0.579]],"c":true}]},{"t":68,"s":[{"i":[[67.675,0],[0,65],[-64.622,0],[0,-65.5]],"o":[[-53.825,0],[0,-55.413],[64.622,0],[0,55.413]],"v":[[-6.675,121],[-93,1],[-6.675,-119],[83.151,1]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[-55.25,0],[0,93.125],[57.99,0],[0,-93.125]],"o":[[43.511,0],[0,-93.125],[-57.99,0],[0,103.5]],"v":[[-6.75,139],[97,1],[-6,-137],[-107,1]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[-10.925,-2.591],[0,93.125],[15.892,-0.041],[0,-93.125]],"o":[[15.739,3.733],[0,-93.125],[-21.702,0.056],[0,103.5]],"v":[[-10.11,137.061],[5.072,-0.044],[-3.51,-137],[-28.335,1.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[-12.516,-2.591],[0,93.125],[6.591,15.759],[0,-93.125]],"o":[[-7.162,-6.765],[0,-93.125],[-16.842,4.506],[0,103.5]],"v":[[-7.4,139.444],[-9.226,-0.574],[-8.18,-137.53],[-28.335,1.298]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[8.906,-1.575],[0,87.7],[-15.143,-2.29],[0,-93.125]],"o":[[-13.206,2.336],[0,-87.7],[11.296,1.709],[0,103.5]],"v":[[-2.782,138.492],[-19.261,-7.167],[-2.159,-140.807],[1.034,-2.299]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[22.263,0],[0,87.7],[-23.787,0],[0,-93.125]],"o":[[-17.533,0],[0,-87.7],[23.787,0],[0,103.5]],"v":[[3.613,139],[-13.895,-5.137],[3.46,-137],[33.435,1]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[55.758,0],[0,93.125],[-58.523,0],[0,-93.125]],"o":[[-43.912,0],[0,-93.125],[58.523,0],[0,103.5]],"v":[[6.911,139],[-97.793,1],[6.154,-137],[108.083,1]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[13.869,0.367],[0,87.7],[-15.667,5.11],[0,-93.125]],"o":[[-6.507,-0.172],[0,-87.7],[14.021,-4.573],[0,103.5]],"v":[[-7.287,135.915],[-15.129,-1.023],[3.46,-137],[14.102,-1.468]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[25.794,2.119],[0,87.7],[-15.304,-0.576],[0,-93.125]],"o":[[-8.636,-0.71],[0,-87.7],[25.762,0.969],[0,103.5]],"v":[[4.831,139],[-1.693,1.772],[4.185,-137],[28.697,1]],"c":true}]},{"t":68,"s":[{"i":[[-55.25,0],[0,93.125],[57.99,0],[0,-93.125]],"o":[[43.511,0],[0,-93.125],[-57.99,0],[0,103.5]],"v":[[-6.75,139],[97,1],[-6,-137],[-107,1]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.996,326.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Big White","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[91,-4],[-1,-103.5],[36.5,0],[34,23],[-66,-1],[-0.497,75.058]],"o":[[63.5,11],[0.773,80.003],[-50.09,0],[11,21],[77.017,1.167],[0.5,-75.5]],"v":[[-8,-48.5],[96.5,96],[9,233],[-95,188],[5,248],[115,99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[34.056,-4],[-0.237,-103.5],[7.089,0.022],[8.068,23],[-24.536,-1],[-0.118,75.058]],"o":[[14.999,9.713],[0.183,80.003],[-18.621,-0.058],[2.61,21],[28.632,1.167],[0.119,-75.5]],"v":[[-4.258,-48.5],[14.134,96.448],[2.16,233],[-22.504,188],[0.673,248],[27.325,99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[44.37,-4],[-0.237,-103.5],[19.821,-6.087],[8.068,23],[-28.109,-1],[-0.118,75.058]],"o":[[35.103,9.048],[0.183,80.002],[-20.393,6.263],[2.61,21],[32.801,1.167],[0.119,-75.5]],"v":[[-6.242,-48.5],[23.465,97.324],[2.155,233],[-22.504,188],[0.451,248],[27.325,99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[-40.46,-4],[0.27,-103.5],[-17.118,0],[-9.166,23],[30.953,-1],[0.134,75.058]],"o":[[-28.233,11],[-0.208,80.002],[23.491,0],[-2.965,21],[-36.12,1.167],[-0.135,-75.5]],"v":[[5.075,-48.5],[-19.057,94.985],[-2.555,233],[25.462,188],[-0.679,248],[-31.15,99]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-37.327,-4],[0.312,-103.5],[-14.708,0],[-10.604,23],[26.595,-1],[0.155,75.058]],"o":[[-26.047,11],[-0.241,80.003],[20.184,0],[-3.431,21],[-31.034,1.167],[-0.156,-75.5]],"v":[[4.281,-48.5],[-19.967,93.791],[-2.733,233],[29.692,188],[-1.122,248],[-35.8,99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[-91.837,-4],[1.009,-103.5],[-36.836,0],[-34.313,23],[66.607,-1],[0.502,75.058]],"o":[[-64.084,11],[-0.78,80.003],[50.551,0],[-11.101,21],[-77.725,1.167],[-0.505,-75.5]],"v":[[8.173,-48.5],[-97.289,96],[-8.984,233],[95.973,188],[-4.947,248],[-115.959,99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[-37.327,-4],[0.312,-103.5],[-14.708,0],[-10.604,23],[26.595,-1],[0.155,75.058]],"o":[[-26.047,11],[-0.241,80.003],[20.184,0],[-3.431,21],[-31.034,1.167],[-0.156,-75.5]],"v":[[4.281,-48.5],[-30.031,96],[-2.733,233],[29.692,188],[-1.122,248],[-35.8,99]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-40.46,-4],[0.27,-103.5],[-17.118,0],[-9.166,23],[30.953,-1],[0.134,75.058]],"o":[[-28.233,11],[-0.208,80.003],[23.491,0],[-2.965,21],[-36.12,1.167],[-0.135,-75.5]],"v":[[5.075,-48.5],[-26.163,96],[-2.555,233],[25.462,188],[-0.679,248],[-31.15,99]],"c":true}]},{"t":68,"s":[{"i":[[91,-4],[-1,-103.5],[36.5,0],[34,23],[-66,-1],[-0.497,75.058]],"o":[[63.5,11],[0.773,80.003],[-50.09,0],[11,21],[77.017,1.167],[0.5,-75.5]],"v":[[-8,-48.5],[96.5,96],[9,233],[-95,188],[5,248],[115,99]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.816,0.702,0.553,0.5,0.816,0.702,0.553,1,0.816,0.702,0.553,0.475,1,0.737,0.5,1,0]}},"s":{"a":0,"k":[86,-16]},"e":{"a":0,"k":[73.5,2.5]},"t":1,"nm":"Gradient_9HnbnjCVhC","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.435,0.239,0.271,0.5,0.435,0.239,0.271,1,0.435,0.239,0.271,0.918,1,0.959,0.56,1,0.12]}},"s":{"a":0,"k":[-9.5,79]},"e":{"a":0,"k":[107.5,125]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_VNflvBjTtI","hd":false},{"ty":"fl","c":{"a":0,"k":[0.21960785985,0.239215701818,0.254901975393,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 2","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[256,256]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Big Shad","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[59.542,0],[0,50.149],[-59.542,0],[0,-50.149]],"o":[[-59.542,0],[0,-50.149],[59.542,0],[0,50.149]],"v":[[-0.202,108.615],[-76.055,0.015],[-0.202,-108.585],[75.651,0.015]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[1.194,0],[0,50.149],[-0.936,0],[0,-50.149]],"o":[[-1.194,0],[0,-50.149],[0.936,0],[0,50.149]],"v":[[-13.964,109.063],[-15.05,-0.283],[-14.277,-108.138],[-12.298,0.761]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[1.194,0],[0,50.149],[-0.936,0],[0,-50.149]],"o":[[-1.194,0],[0,-50.149],[0.936,0],[0,50.149]],"v":[[-24.29,105.885],[-30.01,0.114],[-21.956,-109.461],[-27.258,1.158]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[-1.719,0],[0,47.228],[1.719,0],[0,-47.228]],"o":[[1.719,0],[0,-47.228],[-1.719,0],[0,47.228]],"v":[[25.957,101.323],[30.441,-0.697],[24.421,-106.778],[30.818,-0.697]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[-1.989,0],[0,47.228],[1.989,0],[0,-47.228]],"o":[[1.989,0],[0,-47.228],[-1.989,0],[0,47.228]],"v":[[15.545,102.592],[17.011,0.318],[15.545,-101.956],[14.019,0.318]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[-60.089,0],[0,50.149],[60.089,0],[0,-50.149]],"o":[[60.089,0],[0,-50.149],[-60.089,0],[0,50.149]],"v":[[0.303,108.615],[76.853,0.015],[0.303,-108.585],[-76.247,0.015]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[-1.989,0],[0,47.228],[1.989,0],[0,-47.228]],"o":[[1.989,0],[0,-47.228],[-1.989,0],[0,47.228]],"v":[[-13.043,101.975],[-14.045,0.112],[-13.043,-102.573],[-17.037,0.112]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[-1.719,0],[0,47.228],[1.719,0],[0,-47.228]],"o":[[1.719,0],[0,-47.228],[-1.719,0],[0,47.228]],"v":[[-26.684,101.672],[-22.2,-0.349],[-28.22,-106.429],[-21.822,-0.349]],"c":true}]},{"t":68,"s":[{"i":[[59.542,0],[0,50.149],[-59.542,0],[0,-50.149]],"o":[[-59.542,0],[0,-50.149],[59.542,0],[0,50.149]],"v":[[-0.202,108.615],[-76.055,0.015],[-0.202,-108.585],[75.651,0.015]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":2,"s":[{"i":[[0,0],[0,99.837],[63.623,0],[0,-99.837],[-63.623,0]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837],[0,0]],"v":[[-0.202,147.962],[114.997,0.015],[-0.202,-147.932],[-115.402,0.015],[-0.202,147.962]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[0,0],[0,99.837],[23.81,0],[0,-99.837],[-23.652,0]],"o":[[23.652,0],[0,-99.837],[-23.81,0],[0,99.837],[0,0]],"v":[[-1.261,147.962],[27.325,0.015],[-1.34,-147.932],[-30.329,0.313],[-1.261,147.962]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,99.837],[31.021,0],[0,-99.837],[-27.096,0]],"o":[[27.096,0],[0,-99.837],[-31.021,0],[0,99.837],[0,0]],"v":[[-1.764,147.962],[27.325,0.015],[-2.44,-147.932],[-30.329,0.313],[-1.764,147.962]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[0,0],[0,99.837],[-28.287,0],[0,-99.837],[29.838,0]],"o":[[-29.838,0],[0,-99.837],[28.287,0],[0,99.837],[0,0]],"v":[[1.76,147.962],[-31.149,0.015],[1.607,-147.932],[30.962,0.015],[1.76,147.962]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[0,0],[0,99.837],[-26.097,0],[0,-99.837],[25.637,0]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837],[0,0]],"v":[[0.975,147.962],[-35.8,0.015],[1.082,-147.932],[36.055,0.015],[0.975,147.962]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[0,0],[0,99.837],[-64.208,0],[0,-99.837],[64.208,0]],"o":[[-64.208,0],[0,-99.837],[64.208,0],[0,99.837],[0,0]],"v":[[0.303,147.962],[-115.956,0.015],[0.303,-147.932],[116.562,0.015],[0.303,147.962]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[0,0],[0,99.837],[-26.097,0],[0,-99.837],[25.637,0]],"o":[[-25.637,0],[0,-99.837],[26.097,0],[0,99.837],[0,0]],"v":[[0.975,147.962],[-35.8,0.015],[1.082,-147.932],[36.055,0.015],[0.975,147.962]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[0,0],[0,99.837],[-28.287,0],[0,-99.837],[29.838,0]],"o":[[-29.838,0],[0,-99.837],[28.287,0],[0,99.837],[0,0]],"v":[[1.76,147.962],[-31.149,0.015],[1.607,-147.932],[30.962,0.015],[1.76,147.962]],"c":true}]},{"t":68,"s":[{"i":[[0,0],[0,99.837],[63.623,0],[0,-99.837],[-63.623,0]],"o":[[63.623,0],[0,-99.837],[-63.623,0],[0,99.837],[0,0]],"v":[[-0.202,147.962],[114.997,0.015],[-0.202,-147.932],[-115.402,0.015],[-0.202,147.962]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.435,0.239,0.271,0.5,0.435,0.239,0.271,1,0.435,0.239,0.271,0,0,0.08,0.5,0.16,1,0.397,1,0.635,1,0.817,0.5,1,0]}},"s":{"a":0,"k":[-98.707,53.707]},"e":{"a":0,"k":[-60.207,56.707]},"t":1,"nm":"Gradient_Hy6M6L02ec","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0.315,0.816,0.702,0.553,0.412,0.673,0.729,0.776,0.51,0.529,0.757,1,0.755,0.529,0.757,1,1,0.529,0.757,1,0.517,1,0.759,0.5,1,0]}},"s":{"a":0,"k":[-43.146,75.475]},"e":{"a":0,"k":[-77.889,131.218]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_4evG0lsH8C","hd":false},{"ty":"fl","c":{"a":0,"k":[0.505882382393,0.643137276173,0.800000071526,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[185.996,326.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"FILL","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[186.078,326.597]},"a":{"a":0,"k":[186.078,326.597]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":-45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":1,"op":38,"st":2,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"BODY Bubble","parent":10,"sr":1,"ks":{"p":{"a":0,"k":[154.02,380.499,0]},"a":{"a":0,"k":[154.02,380.499,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.387,-2.132],[-70.058,22.506],[-3.837,72.844]],"o":[[3.883,1.887],[79.467,-25.528],[0,0]],"v":[[-69.281,44.377],[101.519,40.439],[217.807,-113.151]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.466666668653,0.466666668653,0.466666668653,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-12.655,-20.292],[-10.619,-3.956]],"o":[[2.332,42.118],[11.602,18.604],[0,0]],"v":[[-217.807,-113.176],[-191.477,-25.646],[-149.351,10.669]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.466666668653,0.466666668653,0.466666668653,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[254.017,354.888]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 8","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-68.816,21.924],[11.435,100.018],[142.983,0],[-0.105,-111.016],[-14.184,-22.743]],"o":[[98.763,-31.464],[-11.012,-96.322],[-146.477,0],[0.049,52.004],[11.602,18.604]],"v":[[101.546,145.257],[215.761,-64.07],[-5.99,-217.994],[-218.218,-24.382],[-191.45,79.172]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.607843160629,0.607843160629,0.607843160629,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[253.992,257.493]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 7","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[92.161,-29.367],[0,0],[0,0],[11.604,18.599],[0.051,52.005],[0,0],[-179.831,-7.96],[-0.969,48.466]],"o":[[-68.809,21.923],[0,0],[-7.352,-2.977],[-14.184,-22.749],[0,0],[2.131,37.668],[222.466,9.847],[5.761,90.468]],"v":[[101.543,58.42],[-59.834,64.507],[-156.247,25.953],[-191.447,-7.667],[-218.214,-111.228],[-218.214,-111.911],[-8.028,33.265],[217.524,-131.153]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588235318661,0.588235318661,0.588235318661,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[253.991,338.185]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":20},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 115","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-15.716],[57.535,0],[0,15.716],[-57.535,0]],"o":[[0,15.716],[-57.535,0],[0,-15.716],[57.535,0]],"v":[[104.176,0],[0,28.457],[-104.176,0],[0,-28.457]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[254.017,82.87]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":40},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[24.218,-38.025],[5.7,51.474],[138.536,0],[-0.102,-111.015],[-10.89,-21.098],[0.051,51.413],[-146.48,0],[-11.013,-96.321]],"o":[[18.416,-36.434],[-10.666,-96.321],[-141.922,0],[0.031,43.674],[-13.99,-22.627],[-0.102,-111.015],[142.982,0],[6.475,56.644]],"v":[[192.203,149.065],[209.049,15.556],[-5.802,-138.368],[-211.425,55.242],[-191.928,147.331],[-218.215,44.546],[-5.985,-149.065],[215.758,4.859]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[253.992,193.443]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-68.816,21.924],[11.435,100.018],[142.983,0],[-0.105,-111.016],[-14.184,-22.743],[-7.35,-2.981]],"o":[[0,0],[98.763,-31.464],[-11.012,-96.322],[-146.477,0],[0.049,52.004],[11.602,18.604],[0,0]],"v":[[-59.838,151.347],[101.546,145.257],[215.761,-64.07],[-5.99,-217.994],[-218.218,-24.382],[-191.45,79.172],[-156.253,112.796]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.303,0.988,0.988,0.988,0.909,0.796,0.796,0.796,1,0.604,0.604,0.604]}},"s":{"a":0,"k":[-0.306,-33.251]},"e":{"a":0,"k":[226.698,-32.932]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_rM7mD7EyFu","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[253.992,257.493]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 1","bm":0,"hd":false}],"ip":36,"op":182,"st":2,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Tail Bubble","sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.597],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":33,"s":[20]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":49,"s":[-8]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":72,"s":[-5]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":86,"s":[1]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":102,"s":[-1]},{"t":124,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.49,"y":0},"t":33,"s":[197.276,249.05,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.5,"y":0},"t":45,"s":[72.526,480.55,0],"to":[0,0,0],"ti":[0,0,0]},{"t":56,"s":[83.026,460.05,0]}]},"a":{"a":0,"k":[83.026,460.05,0]},"s":{"a":1,"k":[{"i":{"x":[0.597,0.597,0.5],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.7],"y":[0,0,0]},"t":30,"s":[29.167,10,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":46,"s":[103,110,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":57,"s":[100,92,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":69,"s":[99,106,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":83,"s":[102,97,100]},{"i":{"x":[0.5,0.5,0.5],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":100,"s":[99,101,100]},{"t":122,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-7.35,-2.981],[7.701,-28.541],[0.317,-3.808],[-36.225,24.19],[0,0]],"o":[[0,0],[-7.136,26.447],[-0.317,3.808],[38.943,-26.006],[0,0]],"v":[[-156.212,8.214],[-157.429,59.013],[-184.018,111.305],[-109.444,90.996],[-60.2,46.798]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.466666668653,0.466666668653,0.466666668653,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[254.017,354.888]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 114","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-38.799,26.074],[0,0],[3.273,-2.182],[-0.316,3.814],[-7.138,26.451],[1.376,6.169],[-3.385,-1.438],[37.004,-48.301]],"o":[[0,0],[-2.875,2.07],[-36.23,24.187],[0.316,-3.803],[6.322,-23.433],[2.325,0.632],[0,0],[0,0]],"v":[[41.9,22.995],[41.9,23.006],[32.682,29.389],[-41.898,49.691],[-15.305,-2.599],[-13.643,-51.565],[-5.128,-48.516],[-29.815,44.786]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[121.959,412.136]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":30},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[37.393,-7.677],[0.041,-0.01],[2.101,-0.408],[-1.866,0.357],[0.612,-0.133],[-0.163,1.917],[-8.107,15.877],[-14.281,-7.027]],"o":[[-0.041,0.01],[-2.263,0.571],[-0.031,0.01],[-0.632,0.102],[-14.265,2.57],[0.224,-2.672],[9.738,-16.723],[13.713,6.748]],"v":[[-6.292,25.466],[-5.223,28.089],[-6.689,28.344],[-3.357,27.733],[-5.223,28.089],[-29.013,27.773],[-11.168,-2.451],[21.926,-27.934]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.752941012383,0.752941012383,0.752941012383,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[109.986,432.502]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[38.942,-26.012],[-0.316,3.814],[-7.138,26.451],[0,0]],"o":[[0,0],[-36.23,24.187],[0.316,-3.803],[7.699,-28.541],[-7.352,-2.977]],"v":[[-59.734,64.205],[-109.412,108.976],[-183.993,129.279],[-157.4,76.988],[-156.247,25.482]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588235318661,0.588235318661,0.588235318661,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[253.991,338.185]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":20},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-7.35,-2.981],[7.701,-28.541],[0.317,-3.808],[-36.225,24.19]],"o":[[0,0],[0,0],[-7.136,26.447],[-0.317,3.808],[38.943,-26.006]],"v":[[-59.737,151.044],[-156.253,112.325],[-157.403,163.831],[-183.991,216.124],[-109.418,195.814]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.303,0.988,0.988,0.988,0.909,0.796,0.796,0.796,1,0.604,0.604,0.604]}},"s":{"a":0,"k":[-0.306,-33.251]},"e":{"a":0,"k":[226.698,-32.932]},"t":2,"h":{"a":0,"k":0},"a":{"a":0,"k":0},"nm":"Gradient_jTToeIIZIT","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[253.992,257.493]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[92.918,92.918]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Layer 116","bm":0,"hd":false}],"ip":36,"op":182,"st":2,"bm":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/fragment_phone.json b/TMessagesProj/src/main/res/raw/fragment_phone.json new file mode 100644 index 000000000..d9a764851 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/fragment_phone.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":59,"w":512,"h":512,"nm":"1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"1","sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.05,"y":0},"t":1,"s":[256,368.474,0],"to":[0,4,0],"ti":[0,3.5,0]},{"i":{"x":0.85,"y":1},"o":{"x":0.8,"y":0},"t":13,"s":[256,392.474,0],"to":[0,-3.5,0],"ti":[0,1.917,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.5,"y":0},"t":28,"s":[256,347.474,0],"to":[0,-1.917,0],"ti":[0,-2.167,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.29,"y":0},"t":39,"s":[256,380.974,0],"to":[0,2.167,0],"ti":[0,2.083,0]},{"i":{"x":0.71,"y":1},"o":{"x":0.29,"y":0},"t":49,"s":[256,360.474,0],"to":[0,-2.083,0],"ti":[0,-1.333,0]},{"t":58,"s":[256,368.474,0]}]},"a":{"a":0,"k":[256,368.474,0]},"s":{"a":1,"k":[{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.85,0.85,0.85],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":11,"s":[108,92,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":26,"s":[90,117,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":37,"s":[105,92,100]},{"i":{"x":[0.71,0.71,0.71],"y":[1,1,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":47,"s":[99,102,100]},{"t":57,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":0.905},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,-1.866],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.2,-0.112],[-0.575,-1.109]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.506,0.844],[0.63,1.214]],"v":[[-9.813,-21.949],[-10.061,104.985],[-23.595,107.964],[-126.478,-51.435],[-128.685,-54.854],[-130.559,-57.758],[-130.614,-57.843],[-141.378,-74.519],[-131.648,-82.56],[-14.286,-29.675],[-13.656,-29.342],[-10.631,-26.481]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.014},"t":8,"s":[{"i":[[0.656,-2.458],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.216,-0.078],[-0.917,-0.848]],"o":[[0,0],[-1.939,6.784],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.125,0.405],[1.162,1.075]],"v":[[53.969,-13.324],[15.439,104.466],[-5.595,107.925],[-120.842,-24.689],[-123.512,-27.737],[-125.78,-30.326],[-125.846,-30.402],[-138.871,-45.269],[-129.141,-53.31],[47.527,-21.925],[48.469,-21.717],[52.057,-20.012]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,-1.866],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.2,-0.112],[-0.575,-1.109]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.506,0.844],[0.63,1.214]],"v":[[-9.813,-21.949],[-10.061,104.985],[-23.595,107.964],[-126.478,-51.435],[-128.685,-54.854],[-130.559,-57.758],[-130.614,-57.843],[-141.378,-74.519],[-131.648,-82.56],[-14.286,-29.675],[-13.656,-29.342],[-10.631,-26.481]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[0,0],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0,0],[0,0],[0,0]],"v":[[-67.338,-27.899],[-13.561,104.877],[-24.095,107.857],[-109.118,-67.827],[-110.748,-71.594],[-112.134,-74.796],[-112.174,-74.889],[-120.128,-93.269],[-110.398,-101.31],[-70.686,-35.625],[-70.62,-35.475],[-68.969,-31.663]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0],[5.095,6.214],[1.198,3.378],[0,0],[0,0],[0,0],[0,0],[-2.33,-0.621],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.067,4.276],[0,0],[-1.698,-5.003],[0,0],[0,0],[0,0],[0.006,-9.162],[0,0],[0,0],[0,0],[0,0]],"v":[[-85.763,-31.242],[-16.061,109.224],[-24.845,103.342],[-94.552,-28.372],[-90.984,-32.654],[-97.345,-52.21],[-101.503,-52.724],[-107.756,-96.338],[-99.545,-107.504],[-91.923,-55.657],[-97.366,-52.192],[-91.024,-32.662]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[0,0],[0,0],[5.095,6.214],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.08,0.379],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.067,4.276],[0,0],[0,0],[0,0],[0,0],[0,0],[1.006,-3.662],[0,0],[0,0],[0,0],[0,0]],"v":[[-98.638,-29.985],[-10.936,108.232],[-16.845,102.224],[-102.177,-28.24],[-102.909,-31.699],[-97.505,-60.262],[-98.235,-60.89],[-78.381,-112.581],[-73.42,-118.997],[-96.048,-59.961],[-97.487,-60.236],[-102.932,-31.77]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[0,0],[4.904,4.808],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.08,0.379],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.308,2.522],[0,0],[0,0],[0,0],[0,0],[0,0],[1.006,-3.662],[0,0],[0,0],[0,0],[0,0]],"v":[[-93.513,-26.86],[-14.74,108.357],[-25.032,103.849],[-97.052,-25.115],[-97.784,-28.574],[-96.13,-60.2],[-96.86,-60.828],[-79.693,-106.831],[-74.733,-113.247],[-94.673,-59.899],[-96.112,-60.173],[-97.807,-28.645]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,0],[0,0],[2.263,3.401],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.08,0.379],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.395,0.768],[0,0],[0,0],[0,0],[0,0],[0,0],[1.006,-3.662],[0,0],[0,0],[0,0],[0,0]],"v":[[-88.388,-23.735],[-12.186,108.482],[-18.47,104.974],[-91.927,-21.99],[-92.659,-25.449],[-94.755,-60.137],[-95.485,-60.765],[-81.006,-101.081],[-76.045,-107.497],[-93.298,-59.836],[-94.737,-60.111],[-92.682,-25.52]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[0,0],[5.095,6.214],[1.198,3.378],[0,0],[0,0],[0,0],[0,0],[-2.33,-0.621],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.067,4.276],[0,0],[-1.698,-5.003],[0,0],[0,0],[0,0],[0.006,-9.162],[0,0],[0,0],[0,0],[0,0]],"v":[[-78.263,-22.992],[-10.561,106.974],[-21.095,101.842],[-87.052,-20.122],[-83.484,-24.404],[-87.845,-48.46],[-92.003,-48.974],[-101.631,-87.838],[-93.42,-99.004],[-82.423,-51.907],[-87.866,-48.442],[-83.524,-24.412]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[0,0],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.559,-0.44],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0,0],[0,0],[0,0]],"v":[[-49.588,-20.649],[-14.811,103.877],[-25.595,105.857],[-100.118,-66.077],[-101.748,-69.844],[-103.134,-73.046],[-103.174,-73.139],[-106.878,-81.519],[-103.148,-96.06],[-52.936,-28.375],[-52.87,-28.225],[-51.219,-24.413]],"c":true}]},{"t":58,"s":[{"i":[[0,-1.866],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.2,-0.112],[-0.575,-1.109]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.506,0.844],[0.63,1.214]],"v":[[-12.813,-21.897],[-13.061,105.036],[-26.595,108.016],[-129.478,-51.384],[-131.685,-54.802],[-133.559,-57.707],[-133.614,-57.791],[-144.378,-74.468],[-134.648,-82.509],[-17.286,-29.624],[-16.656,-29.291],[-13.631,-26.429]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":1,"k":[{"t":0,"s":[179.897,270.405],"h":1},{"t":31,"s":[329.897,270.405],"h":1}]},"a":{"a":0,"k":[-76.103,14.405]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"h":1},{"t":31,"s":[-100,100],"h":1}]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":21,"s":[0],"h":1},{"t":31,"s":[100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"L","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":0.905},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[7.775,-3.676],[0,0]],"o":[[0,0],[0.133,8.553],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[9.813,-21.949],[10.061,104.985],[23.595,107.964],[141.378,-74.519],[131.648,-82.56],[14.286,-29.675]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.014},"t":8,"s":[{"i":[[0.5,-1.926],[0,0],[-4.884,7.121],[0,0],[4.977,-6.565],[0,0]],"o":[[0,0],[0.133,8.553],[0,0],[3.122,-7.481],[0,0],[-1.098,1.55]],"v":[[69.125,-20.949],[28.061,98.403],[31.845,105.383],[108.503,-99.644],[103.898,-103.685],[73.598,-31.425]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[7.775,-3.676],[0,0]],"o":[[0,0],[0.133,8.553],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[9.813,-21.949],[10.061,104.985],[23.595,107.964],[141.378,-74.519],[131.648,-82.56],[14.286,-29.675]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[7.775,-3.676],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[-94.937,-32.699],[-5.689,106.949],[12.345,107.428],[136.128,-65.269],[126.398,-73.31],[-90.464,-40.425]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,-3.797],[0,0],[-16.33,13.572],[0,0],[8.38,-3.676],[0,0]],"o":[[0,0],[7.865,6.015],[0,0],[3.592,-5.48],[0,0],[-3.981,1.845]],"v":[[-144.476,-47.699],[-17.449,106.949],[21,107.428],[143.908,-46.269],[133.42,-54.31],[-139.655,-55.425]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[8.475,1.06],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[-138.054,-68.199],[-9.439,106.699],[5.345,104.928],[80.006,-23.269],[73.275,-36.56],[-133.581,-75.925]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[6.926,1.268],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[1.995,-5.873],[0,0],[-3.693,1.845]],"v":[[-135.164,-75.799],[-16.039,106.264],[-0.58,103.755],[31.208,-21.677],[22.074,-34.718],[-130.691,-83.525]],"c":true}]},{"t":58,"s":[{"i":[[-3.903,-6.785],[0,0],[0.28,5.393],[0,0],[4.415,1.955],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[-0.074,-7.149],[0,0],[-4.376,-2.434]],"v":[[-140.722,-74.59],[-22.314,109.377],[-9.53,106.607],[-9.739,-19.601],[-16.102,-30.267],[-134.499,-82.942]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[332.103,270.405]},"a":{"a":0,"k":[76.103,14.405]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"R","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":0.905},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[-3.141,1.409],[0,0],[4.693,0],[0,0],[-4.282,-1.921],[0,0]],"o":[[0,0],[4.282,-1.921],[0,0],[-4.693,0],[0,0],[3.141,1.409]],"v":[[5.157,-47.3],[131.853,-103.149],[130.071,-112.474],[-129.633,-112.474],[-131.415,-103.149],[-4.719,-47.3]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.095},"t":8,"s":[{"i":[[-4.407,9.1],[0,0],[4.693,0],[0,0],[-4.282,-1.921],[0,0]],"o":[[0,0],[3.647,-4.152],[0,0],[-4.693,0],[0,0],[3.141,1.409]],"v":[[64.407,-48.1],[94.853,-116.598],[91.071,-125.923],[-133.133,-84.474],[-134.915,-75.149],[50.281,-40.1]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-3.141,1.409],[0,0],[4.693,0],[0,0],[-4.282,-1.921],[0,0]],"o":[[0,0],[4.282,-1.921],[0,0],[-4.693,0],[0,0],[3.141,1.409]],"v":[[5.157,-47.3],[131.853,-103.149],[130.071,-112.474],[-129.633,-112.474],[-131.415,-103.149],[-4.719,-47.3]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[-3.735,0.905],[0,0],[4.446,0.573],[0,0],[-0.281,-2.571],[0,0]],"o":[[0,0],[4.562,-1.329],[0,0],[-3.585,-0.274],[0,0],[0.147,1.766]],"v":[[-71.636,-55.66],[130.183,-92.501],[129.351,-102.532],[-80.466,-120.843],[-86.458,-115.393],[-78.274,-58.279]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[-3.883,0.779],[0,0],[4.384,0.717],[0,0],[0.719,-2.733],[0,0]],"o":[[0,0],[4.632,-1.181],[0,0],[-3.308,-0.343],[0,0],[-0.601,1.855]],"v":[[-85.834,-57.438],[129.765,-89.838],[129.171,-100.046],[-63.174,-122.623],[-70.219,-118.142],[-91.663,-60.712]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[-4.626,-0.1],[0,0],[4.076,1.204],[0,0],[1.978,-0.848],[0,0]],"o":[[0,0],[4.981,-0.064],[0,0],[-1.923,-0.576],[0,0],[-4.344,1.708]],"v":[[-130.384,-71.791],[129.552,-72.5],[130.145,-80.33],[2.522,-126.625],[-2.786,-126.422],[-132.166,-77.294]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[-4.626,-0.109],[0,0],[0.581,2.975],[0,0],[1.978,-0.93],[0,0]],"o":[[0,0],[6.476,1.395],[0,0],[-1.924,-0.632],[0,0],[-4.344,1.873]],"v":[[-130.187,-94.699],[80.4,-54.395],[86.669,-61.35],[66.994,-117.152],[63.936,-119.429],[-131.969,-100.731]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[-4.626,-0.111],[0,0],[-2.616,2.343],[0,0],[1.978,-0.943],[0,0]],"o":[[0,0],[5.878,0.829],[0,0],[-1.924,-0.641],[0,0],[-4.344,1.899]],"v":[[-125.399,-102.121],[37.027,-50.663],[46.116,-55.343],[93.31,-112.129],[91.152,-115.305],[-127.181,-108.239]],"c":true}]},{"t":58,"s":[{"i":[[-6.407,-2.769],[0,0],[-5.038,2.278],[0,0],[5.273,-0.726],[0,0]],"o":[[0,0],[3.157,1.572],[0,0],[6.591,-2.37],[0,0],[-7.125,0.298]],"v":[[-130.593,-103.106],[-4.907,-47.572],[7.288,-48.528],[131.034,-103.255],[128.727,-112.274],[-127.875,-113.298]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[256.219,176.641]},"a":{"a":0,"k":[0.219,-79.359]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Top","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/fragment_username.json b/TMessagesProj/src/main/res/raw/fragment_username.json new file mode 100644 index 000000000..2fb75b4d7 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/fragment_username.json @@ -0,0 +1 @@ +{"v":"5.12.1","fr":60,"ip":0,"op":180,"w":512,"h":512,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector 3","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.255,0],[0,4.418],[-4.418,0],[0,-4.418]],"o":[[-1.057,0.515],[-4.418,0],[0,-4.418],[4.418,0],[0,0]],"v":[[3.498,7.197],[0,8],[-8,0],[0,-8],[8,0]],"c":false},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[100]},{"t":46,"s":[0]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":4,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[1000,1000],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Vector 2","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0.548],[-4.418,0],[0,-4.418],[0,0],[1.105,0],[0,1.105],[0,0]],"o":[[-0.105,-0.517],[0,-4.418],[4.418,0],[0,0],[0,1.105],[-1.105,0],[0,0],[0,0]],"v":[[-7.84,1.601],[-8,0],[0,-8],[8,0],[8,2],[6,4],[4,2],[4,-3.2]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":9,"s":[100]},{"t":39,"s":[0]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[1000,1000],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[-38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[-38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[-38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[-38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[-38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[-38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[-38]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[-38]},{"i":{"x":[0.833],"y":[0.911]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[-38]},{"i":{"x":[0.833],"y":[0.692]},"o":{"x":[0.167],"y":[0.083]},"t":9,"s":[-38]},{"i":{"x":[0.833],"y":[0.86]},"o":{"x":[0.167],"y":[0.114]},"t":10,"s":[-36.938]},{"i":{"x":[0.833],"y":[0.718]},"o":{"x":[0.167],"y":[0.205]},"t":11,"s":[-34.069]},{"i":{"x":[0.833],"y":[0.822]},"o":{"x":[0.167],"y":[0.118]},"t":12,"s":[-32.109]},{"i":{"x":[0.833],"y":[0.873]},"o":{"x":[0.167],"y":[0.157]},"t":13,"s":[-27.432]},{"i":{"x":[0.833],"y":[0.75]},"o":{"x":[0.167],"y":[0.243]},"t":14,"s":[-22.119]},{"i":{"x":[0.833],"y":[0.837]},"o":{"x":[0.167],"y":[0.125]},"t":15,"s":[-19.351]},{"i":{"x":[0.833],"y":[0.878]},"o":{"x":[0.167],"y":[0.171]},"t":16,"s":[-13.82]},{"i":{"x":[0.833],"y":[0.766]},"o":{"x":[0.167],"y":[0.262]},"t":17,"s":[-8.544]},{"i":{"x":[0.833],"y":[0.847]},"o":{"x":[0.167],"y":[0.129]},"t":18,"s":[-6.079]},{"i":{"x":[0.833],"y":[0.882]},"o":{"x":[0.167],"y":[0.183]},"t":19,"s":[-1.611]},{"i":{"x":[0.833],"y":[0.782]},"o":{"x":[0.167],"y":[0.281]},"t":20,"s":[2.134]},{"i":{"x":[0.833],"y":[0.86]},"o":{"x":[0.167],"y":[0.135]},"t":21,"s":[3.711]},{"i":{"x":[0.833],"y":[0.889]},"o":{"x":[0.167],"y":[0.205]},"t":22,"s":[6.255]},{"i":{"x":[0.833],"y":[0.824]},"o":{"x":[0.167],"y":[0.331]},"t":23,"s":[8]},{"i":{"x":[0.833],"y":[0.912]},"o":{"x":[0.167],"y":[0.159]},"t":24,"s":[8.587]},{"i":{"x":[0.833],"y":[1.381]},"o":{"x":[0.167],"y":[1.749]},"t":25,"s":[9.237]},{"i":{"x":[0.833],"y":[0.602]},"o":{"x":[0.167],"y":[0.068]},"t":26,"s":[9.269]},{"i":{"x":[0.833],"y":[0.793]},"o":{"x":[0.167],"y":[0.105]},"t":27,"s":[9.088]},{"i":{"x":[0.833],"y":[0.868]},"o":{"x":[0.167],"y":[0.14]},"t":28,"s":[8.403]},{"i":{"x":[0.833],"y":[0.735]},"o":{"x":[0.167],"y":[0.225]},"t":29,"s":[7.388]},{"i":{"x":[0.833],"y":[0.829]},"o":{"x":[0.167],"y":[0.122]},"t":30,"s":[6.793]},{"i":{"x":[0.833],"y":[0.875]},"o":{"x":[0.167],"y":[0.163]},"t":31,"s":[5.494]},{"i":{"x":[0.833],"y":[0.757]},"o":{"x":[0.167],"y":[0.251]},"t":32,"s":[4.134]},{"i":{"x":[0.833],"y":[0.841]},"o":{"x":[0.167],"y":[0.127]},"t":33,"s":[3.458]},{"i":{"x":[0.833],"y":[0.879]},"o":{"x":[0.167],"y":[0.175]},"t":34,"s":[2.158]},{"i":{"x":[0.833],"y":[0.771]},"o":{"x":[0.167],"y":[0.268]},"t":35,"s":[0.978]},{"i":{"x":[0.833],"y":[0.851]},"o":{"x":[0.167],"y":[0.131]},"t":36,"s":[0.446]},{"i":{"x":[0.833],"y":[0.883]},"o":{"x":[0.167],"y":[0.189]},"t":37,"s":[-0.482]},{"i":{"x":[0.833],"y":[0.792]},"o":{"x":[0.167],"y":[0.293]},"t":38,"s":[-1.216]},{"i":{"x":[0.833],"y":[0.868]},"o":{"x":[0.167],"y":[0.139]},"t":39,"s":[-1.509]},{"i":{"x":[0.833],"y":[0.896]},"o":{"x":[0.167],"y":[0.227]},"t":40,"s":[-1.946]},{"i":{"x":[0.833],"y":[0.897]},"o":{"x":[0.167],"y":[0.417]},"t":41,"s":[-2.199]},{"i":{"x":[0.833],"y":[1.538]},"o":{"x":[0.167],"y":[0.437]},"t":42,"s":[-2.262]},{"i":{"x":[0.833],"y":[0.846]},"o":{"x":[0.167],"y":[0.072]},"t":43,"s":[-2.277]},{"i":{"x":[0.833],"y":[0.698]},"o":{"x":[0.167],"y":[0.182]},"t":44,"s":[-2.166]},{"i":{"x":[0.833],"y":[0.815]},"o":{"x":[0.167],"y":[0.115]},"t":45,"s":[-2.072]},{"i":{"x":[0.833],"y":[0.872]},"o":{"x":[0.167],"y":[0.152]},"t":46,"s":[-1.827]},{"i":{"x":[0.833],"y":[0.745]},"o":{"x":[0.167],"y":[0.238]},"t":47,"s":[-1.527]},{"i":{"x":[0.833],"y":[0.835]},"o":{"x":[0.167],"y":[0.124]},"t":48,"s":[-1.365]},{"i":{"x":[0.833],"y":[0.877]},"o":{"x":[0.167],"y":[0.168]},"t":49,"s":[-1.031]},{"i":{"x":[0.833],"y":[0.762]},"o":{"x":[0.167],"y":[0.258]},"t":50,"s":[-0.702]},{"i":{"x":[0.833],"y":[0.845]},"o":{"x":[0.167],"y":[0.128]},"t":51,"s":[-0.545]},{"i":{"x":[0.833],"y":[0.881]},"o":{"x":[0.167],"y":[0.18]},"t":52,"s":[-0.253]},{"i":{"x":[0.833],"y":[0.778]},"o":{"x":[0.167],"y":[0.276]},"t":53,"s":[-0.001]},{"i":{"x":[0.833],"y":[0.856]},"o":{"x":[0.167],"y":[0.133]},"t":54,"s":[0.108]},{"i":{"x":[0.833],"y":[0.886]},"o":{"x":[0.167],"y":[0.197]},"t":55,"s":[0.291]},{"i":{"x":[0.833],"y":[0.807]},"o":{"x":[0.167],"y":[0.311]},"t":56,"s":[0.424]},{"i":{"x":[0.833],"y":[0.886]},"o":{"x":[0.167],"y":[0.147]},"t":57,"s":[0.473]},{"i":{"x":[0.833],"y":[0.923]},"o":{"x":[0.167],"y":[0.311]},"t":58,"s":[0.538]},{"i":{"x":[0.833],"y":[-0.39]},"o":{"x":[0.167],"y":[-1.103]},"t":59,"s":[0.561]},{"i":{"x":[0.833],"y":[0.755]},"o":{"x":[0.167],"y":[0.089]},"t":60,"s":[0.559]},{"i":{"x":[0.833],"y":[0.864]},"o":{"x":[0.167],"y":[0.126]},"t":61,"s":[0.534]},{"i":{"x":[0.833],"y":[0.725]},"o":{"x":[0.167],"y":[0.214]},"t":62,"s":[0.483]},{"i":{"x":[0.833],"y":[0.825]},"o":{"x":[0.167],"y":[0.12]},"t":63,"s":[0.452]},{"i":{"x":[0.833],"y":[0.874]},"o":{"x":[0.167],"y":[0.159]},"t":64,"s":[0.378]},{"i":{"x":[0.833],"y":[0.753]},"o":{"x":[0.167],"y":[0.246]},"t":65,"s":[0.298]},{"i":{"x":[0.833],"y":[0.839]},"o":{"x":[0.167],"y":[0.126]},"t":66,"s":[0.257]},{"i":{"x":[0.833],"y":[0.878]},"o":{"x":[0.167],"y":[0.172]},"t":67,"s":[0.176]},{"i":{"x":[0.833],"y":[0.768]},"o":{"x":[0.167],"y":[0.264]},"t":68,"s":[0.1]},{"i":{"x":[0.833],"y":[0.848]},"o":{"x":[0.167],"y":[0.13]},"t":69,"s":[0.066]},{"i":{"x":[0.833],"y":[0.882]},"o":{"x":[0.167],"y":[0.185]},"t":70,"s":[0.003]},{"i":{"x":[0.833],"y":[0.785]},"o":{"x":[0.167],"y":[0.285]},"t":71,"s":[-0.048]},{"i":{"x":[0.833],"y":[0.862]},"o":{"x":[0.167],"y":[0.136]},"t":72,"s":[-0.069]},{"i":{"x":[0.833],"y":[0.891]},"o":{"x":[0.167],"y":[0.211]},"t":73,"s":[-0.103]},{"i":{"x":[0.833],"y":[0.84]},"o":{"x":[0.167],"y":[0.35]},"t":74,"s":[-0.125]},{"i":{"x":[0.833],"y":[0.948]},"o":{"x":[0.167],"y":[0.174]},"t":75,"s":[-0.131]},{"i":{"x":[0.833],"y":[0.779]},"o":{"x":[0.167],"y":[-0.138]},"t":76,"s":[-0.138]},{"i":{"x":[0.833],"y":[0.657]},"o":{"x":[0.167],"y":[0.134]},"t":77,"s":[-0.135]},{"i":{"x":[0.833],"y":[0.804]},"o":{"x":[0.167],"y":[0.11]},"t":78,"s":[-0.131]},{"i":{"x":[0.833],"y":[0.869]},"o":{"x":[0.167],"y":[0.145]},"t":79,"s":[-0.119]},{"i":{"x":[0.833],"y":[0.739]},"o":{"x":[0.167],"y":[0.23]},"t":80,"s":[-0.103]},{"i":{"x":[0.833],"y":[0.831]},"o":{"x":[0.167],"y":[0.122]},"t":81,"s":[-0.094]},{"i":{"x":[0.833],"y":[0.876]},"o":{"x":[0.167],"y":[0.165]},"t":82,"s":[-0.074]},{"i":{"x":[0.833],"y":[0.759]},"o":{"x":[0.167],"y":[0.254]},"t":83,"s":[-0.054]},{"i":{"x":[0.833],"y":[0.842]},"o":{"x":[0.167],"y":[0.127]},"t":84,"s":[-0.044]},{"i":{"x":[0.833],"y":[0.88]},"o":{"x":[0.167],"y":[0.177]},"t":85,"s":[-0.026]},{"i":{"x":[0.833],"y":[0.773]},"o":{"x":[0.167],"y":[0.271]},"t":86,"s":[-0.009]},{"i":{"x":[0.833],"y":[0.852]},"o":{"x":[0.167],"y":[0.132]},"t":87,"s":[-0.001]},{"i":{"x":[0.833],"y":[0.884]},"o":{"x":[0.167],"y":[0.191]},"t":88,"s":[0.011]},{"i":{"x":[0.833],"y":[0.797]},"o":{"x":[0.167],"y":[0.298]},"t":89,"s":[0.021]},{"i":{"x":[0.833],"y":[0.873]},"o":{"x":[0.167],"y":[0.141]},"t":90,"s":[0.025]},{"i":{"x":[0.833],"y":[0.901]},"o":{"x":[0.167],"y":[0.244]},"t":91,"s":[0.03]},{"i":{"x":[0.833],"y":[0.992]},"o":{"x":[0.167],"y":[0.529]},"t":92,"s":[0.033]},{"i":{"x":[0.833],"y":[0.536]},"o":{"x":[0.167],"y":[-0.009]},"t":93,"s":[0.034]},{"i":{"x":[0.833],"y":[0.856]},"o":{"x":[0.167],"y":[0.102]},"t":94,"s":[0.033]},{"i":{"x":[0.833],"y":[0.711]},"o":{"x":[0.167],"y":[0.197]},"t":95,"s":[0.031]},{"i":{"x":[0.833],"y":[0.819]},"o":{"x":[0.167],"y":[0.117]},"t":96,"s":[0.029]},{"i":{"x":[0.833],"y":[0.873]},"o":{"x":[0.167],"y":[0.155]},"t":97,"s":[0.026]},{"i":{"x":[0.833],"y":[0.748]},"o":{"x":[0.167],"y":[0.241]},"t":98,"s":[0.021]},{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.125]},"t":99,"s":[0.018]},{"i":{"x":[0.833],"y":[0.877]},"o":{"x":[0.167],"y":[0.17]},"t":100,"s":[0.014]},{"i":{"x":[0.833],"y":[0.764]},"o":{"x":[0.167],"y":[0.26]},"t":101,"s":[0.009]},{"i":{"x":[0.833],"y":[0.846]},"o":{"x":[0.167],"y":[0.129]},"t":102,"s":[0.006]},{"i":{"x":[0.833],"y":[0.881]},"o":{"x":[0.167],"y":[0.181]},"t":103,"s":[0.002]},{"i":{"x":[0.833],"y":[0.78]},"o":{"x":[0.167],"y":[0.279]},"t":104,"s":[-0.001]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.134]},"t":105,"s":[-0.003]},{"i":{"x":[0.833],"y":[0.887]},"o":{"x":[0.167],"y":[0.201]},"t":106,"s":[-0.005]},{"i":{"x":[0.833],"y":[0.816]},"o":{"x":[0.167],"y":[0.321]},"t":107,"s":[-0.007]},{"i":{"x":[0.833],"y":[0.899]},"o":{"x":[0.167],"y":[0.152]},"t":108,"s":[-0.007]},{"i":{"x":[0.833],"y":[0.974]},"o":{"x":[0.167],"y":[0.471]},"t":109,"s":[-0.008]},{"i":{"x":[0.833],"y":[0.511]},"o":{"x":[0.167],"y":[-0.039]},"t":110,"s":[-0.008]},{"i":{"x":[0.833],"y":[0.782]},"o":{"x":[0.167],"y":[0.1]},"t":111,"s":[-0.008]},{"i":{"x":[0.833],"y":[0.866]},"o":{"x":[0.167],"y":[0.135]},"t":112,"s":[-0.008]},{"i":{"x":[0.833],"y":[0.731]},"o":{"x":[0.167],"y":[0.221]},"t":113,"s":[-0.007]},{"i":{"x":[0.833],"y":[0.828]},"o":{"x":[0.167],"y":[0.121]},"t":114,"s":[-0.006]},{"i":{"x":[0.833],"y":[0.875]},"o":{"x":[0.167],"y":[0.161]},"t":115,"s":[-0.005]},{"i":{"x":[0.833],"y":[0.755]},"o":{"x":[0.167],"y":[0.249]},"t":116,"s":[-0.004]},{"i":{"x":[0.833],"y":[0.84]},"o":{"x":[0.167],"y":[0.126]},"t":117,"s":[-0.003]},{"i":{"x":[0.833],"y":[0.879]},"o":{"x":[0.167],"y":[0.174]},"t":118,"s":[-0.002]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.267]},"t":119,"s":[-0.001]},{"t":120,"s":[-0.001]}],"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":2,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":7,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.503,0.503,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.692,0.692,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.083,0.083,0]},"t":9,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.86,0.86,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.114,0.114,0]},"t":10,"s":[5.964,5.964,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.718,0.718,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.205,0.205,0]},"t":11,"s":[22.068,22.068,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.822,0.822,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.118,0.118,0]},"t":12,"s":[33.074,33.074,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.873,0.873,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.157,0.157,0]},"t":13,"s":[59.329,59.329,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.75,0.75,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.243,0.243,0]},"t":14,"s":[89.159,89.159,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.837,0.837,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.125,0.125,0]},"t":15,"s":[104.694,104.694,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.878,0.878,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.171,0.171,0]},"t":16,"s":[135.747,135.747,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.766,0.766,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.262,0.262,0]},"t":17,"s":[165.369,165.369,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.847,0.847,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.129,0.129,0]},"t":18,"s":[179.208,179.208,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.882,0.882,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.183,0.183,0]},"t":19,"s":[204.289,204.289,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.782,0.782,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.281,0.281,0]},"t":20,"s":[225.312,225.312,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.86,0.86,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.135,0.135,0]},"t":21,"s":[234.164,234.164,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.889,0.889,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.205,0.205,0]},"t":22,"s":[248.449,248.449,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.824,0.824,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.331,0.331,0]},"t":23,"s":[258.243,258.243,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.912,0.912,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.159,0.159,0]},"t":24,"s":[261.538,261.538,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1.381,1.381,1]},"o":{"x":[0.167,0.167,0.167],"y":[1.749,1.749,0]},"t":25,"s":[265.189,265.189,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.602,0.602,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.068,0.068,0]},"t":26,"s":[265.371,265.371,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.793,0.793,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.105,0.105,0]},"t":27,"s":[264.354,264.354,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.868,0.868,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.14,0.14,0]},"t":28,"s":[260.51,260.51,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.735,0.735,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.225,0.225,0]},"t":29,"s":[254.81,254.81,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.829,0.829,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.122,0.122,0]},"t":30,"s":[251.468,251.468,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.875,0.875,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.163,0.163,0]},"t":31,"s":[244.178,244.178,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.757,0.757,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.251,0.251,0]},"t":32,"s":[236.541,236.541,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.841,0.841,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.127,0.127,0]},"t":33,"s":[232.744,232.744,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.879,0.879,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.175,0.175,0]},"t":34,"s":[225.45,225.45,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.771,0.771,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.268,0.268,0]},"t":35,"s":[218.822,218.822,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.851,0.851,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.131,0.131,0]},"t":36,"s":[215.836,215.836,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.883,0.883,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.189,0.189,0]},"t":37,"s":[210.625,210.625,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.792,0.792,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.293,0.293,0]},"t":38,"s":[206.505,206.505,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.868,0.868,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.139,0.139,0]},"t":39,"s":[204.864,204.864,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.896,0.896,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.227,0.227,0]},"t":40,"s":[202.408,202.408,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.897,0.897,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.417,0.417,0]},"t":41,"s":[200.987,200.987,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1.538,1.538,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.437,0.437,0]},"t":42,"s":[200.632,200.632,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.846,0.846,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.072,0.072,0]},"t":43,"s":[200.549,200.549,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.698,0.698,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.182,0.182,0]},"t":44,"s":[201.172,201.172,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.815,0.815,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.115,0.115,0]},"t":45,"s":[201.698,201.698,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.872,0.872,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.152,0.152,0]},"t":46,"s":[203.078,203.078,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.745,0.745,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.238,0.238,0]},"t":47,"s":[204.763,204.763,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.835,0.835,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.124,0.124,0]},"t":48,"s":[205.673,205.673,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.877,0.877,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.168,0.168,0]},"t":49,"s":[207.546,207.546,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.762,0.762,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.258,0.258,0]},"t":50,"s":[209.392,209.392,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.845,0.845,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.128,0.128,0]},"t":51,"s":[210.275,210.275,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.881,0.881,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.18,0.18,0]},"t":52,"s":[211.911,211.911,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.778,0.778,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.276,0.276,0]},"t":53,"s":[213.327,213.327,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.856,0.856,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.133,0.133,0]},"t":54,"s":[213.941,213.941,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.886,0.886,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.197,0.197,0]},"t":55,"s":[214.965,214.965,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.807,0.807,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.311,0.311,0]},"t":56,"s":[215.716,215.716,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.886,0.886,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.147,0.147,0]},"t":57,"s":[215.99,215.99,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.923,0.923,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.311,0.311,0]},"t":58,"s":[216.351,216.351,100]},{"i":{"x":[0.833,0.833,0.833],"y":[-0.39,-0.39,1]},"o":{"x":[0.167,0.167,0.167],"y":[-1.103,-1.103,0]},"t":59,"s":[216.483,216.483,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.755,0.755,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.089,0.089,0]},"t":60,"s":[216.474,216.474,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.864,0.864,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.126,0.126,0]},"t":61,"s":[216.328,216.328,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.725,0.725,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.214,0.214,0]},"t":62,"s":[216.047,216.047,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.825,0.825,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.12,0.12,0]},"t":63,"s":[215.869,215.869,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.874,0.874,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.159,0.159,0]},"t":64,"s":[215.458,215.458,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.753,0.753,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.246,0.246,0]},"t":65,"s":[215.007,215.007,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.839,0.839,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.126,0.126,0]},"t":66,"s":[214.776,214.776,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.878,0.878,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.172,0.172,0]},"t":67,"s":[214.322,214.322,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.768,0.768,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.264,0.264,0]},"t":68,"s":[213.897,213.897,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.848,0.848,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.13,0.13,0]},"t":69,"s":[213.701,213.701,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.882,0.882,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.185,0.185,0]},"t":70,"s":[213.351,213.351,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.785,0.785,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.285,0.285,0]},"t":71,"s":[213.063,213.063,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.862,0.862,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.136,0.136,0]},"t":72,"s":[212.944,212.944,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.891,0.891,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.211,0.211,0]},"t":73,"s":[212.756,212.756,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.84,0.84,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.35,0.35,0]},"t":74,"s":[212.634,212.634,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.948,0.948,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.174,0.174,0]},"t":75,"s":[212.596,212.596,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.779,0.779,1]},"o":{"x":[0.167,0.167,0.167],"y":[-0.138,-0.138,0]},"t":76,"s":[212.561,212.561,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.657,0.657,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.134,0.134,0]},"t":77,"s":[212.574,212.574,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.804,0.804,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.11,0.11,0]},"t":78,"s":[212.596,212.596,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.869,0.869,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.145,0.145,0]},"t":79,"s":[212.663,212.663,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.739,0.739,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.23,0.23,0]},"t":80,"s":[212.755,212.755,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.831,0.831,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.122,0.122,0]},"t":81,"s":[212.807,212.807,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.876,0.876,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.165,0.165,0]},"t":82,"s":[212.917,212.917,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.759,0.759,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.254,0.254,0]},"t":83,"s":[213.03,213.03,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.842,0.842,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.127,0.127,0]},"t":84,"s":[213.085,213.085,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.88,0.88,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.177,0.177,0]},"t":85,"s":[213.19,213.19,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.773,0.773,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.271,0.271,0]},"t":86,"s":[213.284,213.284,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.852,0.852,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.132,0.132,0]},"t":87,"s":[213.325,213.325,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.884,0.884,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.191,0.191,0]},"t":88,"s":[213.397,213.397,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.797,0.797,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.298,0.298,0]},"t":89,"s":[213.452,213.452,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.873,0.873,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.141,0.141,0]},"t":90,"s":[213.473,213.473,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.901,0.901,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.244,0.244,0]},"t":91,"s":[213.504,213.504,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.992,0.992,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.529,0.529,0]},"t":92,"s":[213.52,213.52,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.536,0.536,1]},"o":{"x":[0.167,0.167,0.167],"y":[-0.009,-0.009,0]},"t":93,"s":[213.523,213.523,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.856,0.856,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.102,0.102,0]},"t":94,"s":[213.52,213.52,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.711,0.711,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.197,0.197,0]},"t":95,"s":[213.508,213.508,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.819,0.819,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.117,0.117,0]},"t":96,"s":[213.499,213.499,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.873,0.873,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.155,0.155,0]},"t":97,"s":[213.476,213.476,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.748,0.748,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.241,0.241,0]},"t":98,"s":[213.451,213.451,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.836,0.836,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.125,0.125,0]},"t":99,"s":[213.437,213.437,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.877,0.877,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.17,0.17,0]},"t":100,"s":[213.409,213.409,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.764,0.764,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.26,0.26,0]},"t":101,"s":[213.382,213.382,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.846,0.846,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.129,0.129,0]},"t":102,"s":[213.37,213.37,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.881,0.881,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.181,0.181,0]},"t":103,"s":[213.347,213.347,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.78,0.78,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.279,0.279,0]},"t":104,"s":[213.327,213.327,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.858,0.858,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.134,0.134,0]},"t":105,"s":[213.319,213.319,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.887,0.887,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.201,0.201,0]},"t":106,"s":[213.305,213.305,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.816,0.816,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.321,0.321,0]},"t":107,"s":[213.295,213.295,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.899,0.899,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.152,0.152,0]},"t":108,"s":[213.292,213.292,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.974,0.974,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.471,0.471,0]},"t":109,"s":[213.288,213.288,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.511,0.511,1]},"o":{"x":[0.167,0.167,0.167],"y":[-0.039,-0.039,0]},"t":110,"s":[213.287,213.287,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.782,0.782,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.1,0.1,0]},"t":111,"s":[213.287,213.287,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.866,0.866,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.135,0.135,0]},"t":112,"s":[213.29,213.29,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.731,0.731,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.221,0.221,0]},"t":113,"s":[213.295,213.295,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.828,0.828,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.121,0.121,0]},"t":114,"s":[213.298,213.298,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.875,0.875,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.161,0.161,0]},"t":115,"s":[213.304,213.304,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.755,0.755,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.249,0.249,0]},"t":116,"s":[213.311,213.311,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.84,0.84,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.126,0.126,0]},"t":117,"s":[213.314,213.314,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.879,0.879,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.174,0.174,0]},"t":118,"s":[213.321,213.321,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.267,0.267,0]},"t":119,"s":[213.327,213.327,100]},{"t":120,"s":[213.33,213.33,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,2.209],[2.209,0],[0,-2.209]],"o":[[2.209,0],[0,-2.209],[-2.209,0],[0,2.209]],"v":[[0,4],[4,0],[0,-4],[-4,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":29,"s":[100]}],"ix":2},"o":{"a":0,"k":90,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[1000,1000],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/hdr2sdr_hlg.glsl b/TMessagesProj/src/main/res/raw/hdr2sdr_hlg.glsl new file mode 100644 index 000000000..de3a686dc --- /dev/null +++ b/TMessagesProj/src/main/res/raw/hdr2sdr_hlg.glsl @@ -0,0 +1,75 @@ +#extension GL_OES_EGL_image_external : require + +precision highp float; + +uniform samplerExternalOES sTexture; + +vec3 HLG_OETF_inv(vec3 x) { + const float a = 0.17883277; + const float b = 0.28466892; + const float c = 0.55991073; + return mix((x * x) / 3.0, (b + exp((x - c) / a)) / 12.0, step(0.5, x)); +} + +vec3 HLG_OOTF(vec3 x) { + const float HLG_gamma = 1.2; + const vec3 Lvec = vec3(0.2627, 0.6780, 0.0593); + + float Y = dot(Lvec, x); + return pow(Y, HLG_gamma - 1.0) * x; +} + +vec3 HLG_EOTF(vec3 x) { + return HLG_OOTF(HLG_OETF_inv(x)); +} + +vec3 sRGB_EOTF(vec3 x) { + return mix(x / 12.92, pow((x + 0.055) / 1.055, vec3(2.4)), step(0.04045, x)); +} + +vec3 sRGB_OETF(vec3 x) { + return mix(12.92 * x, 1.055 * pow(x, vec3(1.0 / 2.4)) - 0.055, step(0.0031308, x)); +} + +//HDR to SDR conversion method A described in ITU-R BT.2446-1 +vec3 BT2446_tone_mapping_A(vec3 rgb_BT2020_linear) { + const float L_HDR = 1000.0; + const float rho_HDR = 1.0 + 32.0 * pow(L_HDR / 10000.0, 1.0 / 2.4); + const float L_SDR = 100.0; + const float rho_SDR = 1.0 + 32.0 * pow(L_SDR / 10000.0, 1.0 / 2.4); + const vec3 Lvec = vec3(0.2627, 0.6780, 0.0593); + + vec3 rgb_prime = sRGB_OETF(rgb_BT2020_linear); + + float Y_prime = dot(Lvec, rgb_prime); + + float Y_prime_p = log(1.0 + (rho_HDR - 1.0) * Y_prime) / log(rho_HDR); + float Y_prime_c = mix(1.0770 * Y_prime_p, mix((-1.1510 * Y_prime_p + 2.7811) * Y_prime_p - 0.6302, 0.5 * Y_prime_p + 0.5, step(0.9909, Y_prime_p)), step(0.7399, Y_prime_p)); + float Y_prime_SDR = (pow(rho_SDR, Y_prime_c) - 1.0) / (rho_SDR - 1.0); + + float f_Y_prime_SDR = Y_prime_SDR / (1.1 * Y_prime); + float Cb_prime_TMO = f_Y_prime_SDR * (rgb_prime.b - Y_prime) / 1.8814; + float Cr_prime_TMO = f_Y_prime_SDR * (rgb_prime.r - Y_prime) / 1.4746; + float Y_prime_TMO = Y_prime_SDR - max(0.1 * Cr_prime_TMO, .0); + + float R_prime_TMO = Cr_prime_TMO * 1.4746 + Y_prime_TMO; + float B_prime_TMO = Cb_prime_TMO * 1.8814 + Y_prime_TMO; + float G_prime_TMO = (Y_prime_TMO - Lvec.x * R_prime_TMO - Lvec.z * B_prime_TMO) / Lvec.y; + vec3 rgb_BT2020_prime_TMO = vec3(R_prime_TMO, G_prime_TMO, B_prime_TMO); + + return sRGB_EOTF(rgb_BT2020_prime_TMO); +} + +vec4 transform(vec3 rgb_BT2020_hlg) { + const mat3 BT2020_to_BT709 = mat3(1.6605, -0.1246, -0.0182, -0.5876, 1.1329, -0.1006, -0.0728, -0.0083, 1.1187); + + vec3 rgb_BT2020_linear = HLG_EOTF(rgb_BT2020_hlg); + vec3 rgb_BT2020_linear_TMO = BT2446_tone_mapping_A(rgb_BT2020_linear); + vec3 rgb_BT709_linear = clamp(BT2020_to_BT709 * rgb_BT2020_linear_TMO, 0.0, 1.0); + vec3 rgb_sRGB = sRGB_OETF(rgb_BT709_linear); + return vec4(rgb_sRGB, 1.0); +} + +vec4 TEX(vec2 uv) { + return transform(texture2D(sTexture, uv).rgb); +} diff --git a/TMessagesProj/src/main/res/raw/hdr2sdr_pq.glsl b/TMessagesProj/src/main/res/raw/hdr2sdr_pq.glsl new file mode 100644 index 000000000..588ed948f --- /dev/null +++ b/TMessagesProj/src/main/res/raw/hdr2sdr_pq.glsl @@ -0,0 +1,61 @@ +#extension GL_OES_EGL_image_external : require + +precision highp float; + +uniform samplerExternalOES sTexture; + +vec3 PQ_EOTF(vec3 x) { + vec3 pqexp = pow(x, vec3(1.0 / 78.84375)); + return 10.0 * pow(max(pqexp - 0.8359375, 0.0) / (18.8515625 - 18.6875 * pqexp), vec3(1.0 / 0.1593017578125)); +} + +vec3 sRGB_EOTF(vec3 x) { + return mix(x / 12.92, pow((x + 0.055) / 1.055, vec3(2.4)), step(0.04045, x)); +} + +vec3 sRGB_OETF(vec3 x) { + return mix(12.92 * x, 1.055 * pow(x, vec3(1.0 / 2.4)) - 0.055, step(0.0031308, x)); +} + +//HDR to SDR conversion method A described in ITU-R BT.2446-1 +vec3 BT2446_tone_mapping_A(vec3 rgb_BT2020_linear) { + const float L_HDR = 1000.0; + const float rho_HDR = 1.0 + 32.0 * pow(L_HDR / 10000.0, 1.0 / 2.4); + const float L_SDR = 100.0; + const float rho_SDR = 1.0 + 32.0 * pow(L_SDR / 10000.0, 1.0 / 2.4); + const vec3 Lvec = vec3(0.2627, 0.6780, 0.0593); + + vec3 rgb_prime = sRGB_OETF(rgb_BT2020_linear); + + float Y_prime = dot(Lvec, rgb_prime); + + float Y_prime_p = log(1.0 + (rho_HDR - 1.0) * Y_prime) / log(rho_HDR); + float Y_prime_c = mix(1.0770 * Y_prime_p, mix((-1.1510 * Y_prime_p + 2.7811) * Y_prime_p - 0.6302, 0.5 * Y_prime_p + 0.5, step(0.9909, Y_prime_p)), step(0.7399, Y_prime_p)); + float Y_prime_SDR = (pow(rho_SDR, Y_prime_c) - 1.0) / (rho_SDR - 1.0); + + float f_Y_prime_SDR = Y_prime_SDR / (1.1 * Y_prime); + float Cb_prime_TMO = f_Y_prime_SDR * (rgb_prime.b - Y_prime) / 1.8814; + float Cr_prime_TMO = f_Y_prime_SDR * (rgb_prime.r - Y_prime) / 1.4746; + float Y_prime_TMO = Y_prime_SDR - max(0.1 * Cr_prime_TMO, .0); + + float R_prime_TMO = Cr_prime_TMO * 1.4746 + Y_prime_TMO; + float B_prime_TMO = Cb_prime_TMO * 1.8814 + Y_prime_TMO; + float G_prime_TMO = (Y_prime_TMO - Lvec.x * R_prime_TMO - Lvec.z * B_prime_TMO) / Lvec.y; + vec3 rgb_BT2020_prime_TMO = vec3(R_prime_TMO, G_prime_TMO, B_prime_TMO); + + return sRGB_EOTF(rgb_BT2020_prime_TMO); +} + +vec4 transform(vec3 rgb_BT2020_pq) { + const mat3 BT2020_to_BT709 = mat3(1.6605, -0.1246, -0.0182, -0.5876, 1.1329, -0.1006, -0.0728, -0.0083, 1.1187); + + vec3 rgb_BT2020_linear = PQ_EOTF(rgb_BT2020_pq); + vec3 rgb_BT2020_linear_TMO = BT2446_tone_mapping_A(rgb_BT2020_linear); + vec3 rgb_BT709_linear = clamp(BT2020_to_BT709 * rgb_BT2020_linear_TMO, 0.0, 1.0); + vec3 rgb_sRGB = sRGB_OETF(rgb_BT709_linear); + return vec4(rgb_sRGB, 1.0); +} + +vec4 TEX(vec2 uv) { + return transform(texture2D(sTexture, uv).rgb); +} diff --git a/TMessagesProj/src/main/res/raw/monetize.json b/TMessagesProj/src/main/res/raw/monetize.json new file mode 100644 index 000000000..55cfad2a5 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/monetize.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":45,"w":512,"h":512,"nm":"Monetize 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Dollar 2","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":7,"s":[0],"h":1}]},"p":{"a":0,"k":[0.157,0.248,0]},"a":{"a":0,"k":[0.157,0.248,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-7.203,0],[0,9.395],[0,0],[0,36.013],[38.675,8.455],[0,0],[0,13.309],[-21.608,0],[-13.622,-15.188],[-7.203,0],[0,9.081],[8.768,8.612],[19.572,2.505],[0,0],[7.203,0],[0,-9.395],[0,0],[0,-34.76],[-35.7,-7.985],[0,0],[0,-13.779],[24.896,0],[14.092,15.188],[5.95,0],[0,-10.491],[-9.551,-8.299],[-21.764,-2.036],[0,0]],"o":[[7.046,0],[0,0],[42.119,-4.541],[0,-31.002],[0,0],[-19.885,-4.384],[0,-15.971],[17.537,0],[6.889,7.203],[8.768,0],[0,-8.768],[-11.587,-10.96],[0,0],[0,-9.238],[-7.046,0],[0,0],[-40.553,3.758],[0,30.376],[0,0],[23.173,5.48],[0,17.85],[-18.633,0],[-7.985,-7.985],[-9.551,0],[0,9.238],[12.526,11.43],[0,0],[0,9.395]],"v":[[0.391,134.67],[13.701,121.361],[13.701,108.835],[82.125,43.542],[24.817,-14.705],[-6.968,-21.907],[-36.561,-48.682],[-1.174,-76.24],[42.198,-55.102],[61.613,-45.237],[77.114,-60.425],[63.179,-87.357],[14.64,-108.025],[14.64,-121.021],[1.174,-134.173],[-12.135,-121.021],[-12.135,-108.494],[-78.523,-45.707],[-24.191,12.853],[7.594,20.212],[40.319,47.613],[1.487,76.736],[-46.738,54.502],[-65.058,44.795],[-81.812,61.392],[-66.937,88.48],[-13.074,108.991],[-13.074,121.361]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Path","bm":0,"hd":false}],"ip":0,"op":19,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Dollar","parent":4,"sr":1,"ks":{"p":{"a":0,"k":[0.157,0.248,0]},"a":{"a":0,"k":[0.157,0.248,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-109.802,0],[0,-109.802],[109.802,0],[0,109.802]],"o":[[109.802,0],[0,109.802],[-109.802,0],[0,-109.802]],"v":[[0,-198.373],[198.815,0.442],[0,199.256],[-198.815,0.442]],"c":true}},"nm":"Path 2","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[-7.758,0],[-8.294,-0.389],[0,0],[-15.505,35.555],[-5.189,20.685],[0,0],[-0.473,9.89],[1.265,9.144],[0.326,2.802],[1.564,7.598],[4.573,8.647],[24.58,21.387],[9.543,8.105],[0,0],[7.758,0],[22.225,-8.056],[0,0],[12.95,-27.243],[2.899,-10.613],[0,0],[1.667,-6.842],[0.325,-3.781],[-0.013,1.074],[-2.482,-5.909],[-6.005,-9.572],[-10.288,-8.938],[-15.538,-4.838],[0,0]],"o":[[7.589,0],[0,0],[54.716,-19.748],[11.175,-25.626],[0,0],[0.234,-3.6],[0.3,-6.263],[-0.98,-7.089],[-1.29,-7.43],[-2.276,-11.054],[-16.279,-30.778],[-12.48,-11.805],[0,0],[-12.537,-7.517],[-7.589,0],[0,0],[-33.783,19.92],[-5.342,11.237],[0,0],[-1.178,3.542],[-1.151,4.725],[-0.256,2.977],[-0.013,2.69],[12.987,30.918],[15.953,25.428],[13.492,12.311],[0,0],[8.697,1.766]],"v":[[0.161,201.029],[28.615,199.619],[64.698,193.667],[177.711,92.374],[196.229,40.138],[199.692,30.496],[201.477,12.697],[200.278,-8.368],[197.985,-30.569],[193.317,-51.988],[176.623,-90.966],[125.531,-156.056],[86.175,-179.394],[57.632,-189.084],[1.309,-202.173],[-63.298,-192.315],[-103.151,-171.822],[-176.812,-90.731],[-189.917,-57.276],[-192.842,-34.271],[-196.908,-11.758],[-195.918,3.454],[-195.084,16.127],[-188.158,57.91],[-163.12,113.485],[-108.323,168.511],[-60.54,193.835],[-27.689,201.234]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":4,"s":[{"i":[[-4.617,0],[-4.23,0.524],[0,0],[-9.228,25.062],[-2.072,13.274],[0,0],[-0.282,6.971],[0.753,6.445],[0.194,1.975],[0.931,5.356],[2.722,6.095],[14.63,15.076],[5.68,5.713],[0,0],[4.617,0],[13.228,-5.678],[0,0],[7.708,-19.203],[1.725,-7.481],[0,0],[0.205,-5.571],[0.193,-2.665],[-0.008,0.757],[-1.477,-4.165],[-3.574,-6.747],[-6.628,-5.77],[-9.248,-3.41],[0,0]],"o":[[4.517,0],[0,0],[32.566,-13.92],[6.651,-18.063],[0,0],[0.14,-2.538],[0.178,-4.414],[-0.584,-4.997],[-0.768,-5.237],[-1.355,-7.792],[-9.689,-21.695],[-7.428,-8.321],[0,0],[-7.462,-5.299],[-4.517,0],[0,0],[-20.107,14.041],[-3.179,7.921],[0,0],[-0.309,4.577],[-0.125,3.398],[-0.152,2.098],[-0.008,1.896],[7.73,21.794],[9.495,17.924],[9.39,7.705],[0,0],[4.874,0.657]],"v":[[-2.409,142.332],[13.891,140.829],[35.367,136.634],[102.631,65.235],[112.669,29.559],[113.713,21.618],[114.775,9.072],[114.062,-5.777],[112.697,-21.426],[109.919,-36.523],[101.983,-63.998],[71.574,-109.879],[48.15,-126.33],[31.797,-134.304],[-2.361,-142.386],[-40.814,-135.437],[-64.534,-120.992],[-108.376,-63.832],[-116.176,-40.251],[-119.06,-24.035],[-120.337,-8.166],[-120.637,2.557],[-120.395,11.236],[-115.129,40.942],[-100.226,80.115],[-68.883,119.411],[-39.173,136.753],[-19.62,141.968]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":7,"s":[{"i":[[-6.86,0],[-0.61,10.729],[0,0],[-3.262,33.618],[26.476,15.517],[0,0],[-1.01,14.967],[-19.272,-17.959],[-8.53,1.842],[-4.483,4.566],[0.962,8.41],[11.535,10.75],[16.213,3.523],[0,0],[6.86,0],[1.629,-10.005],[0,0],[2.725,-30.96],[-24.437,-10.108],[0,0],[0.351,-11.44],[22.204,9.105],[8.891,2.09],[6.646,-6.312],[-1.263,-9.628],[-9.097,-7.904],[-19.065,-2.495],[0,0]],"o":[[6.711,0],[0,0],[42.081,-7.45],[2.351,-27.893],[0,0],[-22.626,-11.54],[-0.498,-13.969],[11.456,9.696],[6.322,-1.487],[5.885,-2.326],[-3.425,-12.839],[-11.035,-10.439],[0,0],[0.541,-12.222],[-6.711,0],[0,0],[-36.541,6.918],[-1.124,24.411],[0,0],[16.571,4.723],[-0.242,13.949],[-11.34,-7.796],[-7.498,-3.031],[-4.2,6.505],[3.356,12.055],[11.93,10.886],[0,0],[-0.571,8.085]],"v":[[-0.184,146.71],[22.12,130.096],[23.565,119.753],[97.004,51.053],[65.964,-10.918],[43.879,-20.479],[-7.952,-45.962],[34.892,-46.837],[69.729,-35.397],[84.375,-44.267],[89.809,-64.771],[70.482,-96.987],[26.717,-117.154],[25.577,-128.881],[-0.655,-144.51],[-23.395,-131.098],[-24.097,-116.927],[-92.644,-54.295],[-61.345,11.122],[-41.963,20.279],[10.636,45.671],[-31.167,48.499],[-62.152,32.724],[-88.587,42.663],[-93.687,68.449],[-71.362,99.686],[-22.216,119.902],[-19.658,131.973]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.3,"y":0},"t":11,"s":[{"i":[[-7.998,0.17],[0.745,13.532],[0,0],[1.282,37.214],[40.493,7.416],[0,0],[0.231,7.978],[-20.145,0],[-10.207,-9.578],[-6.715,0],[0.668,13.241],[9.856,8.84],[14.437,2.004],[0,0],[6.715,0],[0,-8.759],[0,0],[2.469,-34.07],[-33.283,-7.445],[0,0],[-0.742,-9.276],[21.688,0.013],[13.974,10.952],[5.547,0],[0,-9.781],[-11.13,-9.537],[-20.291,-1.898],[0,0]],"o":[[7.443,-0.158],[0,0],[36.989,-1.477],[-0.995,-28.887],[0,0],[-15.53,-2.592],[-0.282,-9.733],[16.35,0],[6.423,6.715],[8.175,0],[-0.456,-9.043],[-9.607,-8.874],[0,0],[0,-8.613],[-6.569,0],[0,0],[-37.4,4.074],[-2.662,36.727],[0,0],[12.615,2.716],[1.101,13.774],[-17.372,-0.01],[-7.445,-7.445],[-8.905,0],[0,8.613],[11.678,10.657],[0,0],[-0.164,9.453]],"v":[[0.71,131.491],[17.43,113.722],[17.197,104.957],[82.738,40.86],[24.299,-14.183],[-6.093,-20.665],[-29.72,-42.014],[-1.216,-64.211],[37.006,-48.582],[58.487,-38.453],[76.436,-55.993],[60.763,-81.684],[17.84,-99.788],[17.257,-112.487],[1.557,-124.982],[-15.164,-112.37],[-14.931,-100.109],[-77.875,-42.387],[-22.092,19.201],[6.726,24.897],[35.138,44.722],[1.266,70.02],[-43.463,51.04],[-62.407,42.921],[-80.707,58.861],[-66.373,86.679],[-15.806,106.502],[-14.991,115.703]],"c":true}]},{"t":19,"s":[{"i":[[-8.578,0.183],[0.8,14.514],[0,0],[1.375,39.916],[43.433,7.955],[0,0],[0.248,8.557],[-21.608,0],[-10.948,-10.273],[-7.203,0],[0.716,14.203],[10.571,9.482],[15.485,2.15],[0,0],[7.203,0],[0,-9.395],[0,0],[2.648,-36.543],[-35.7,-7.985],[0,0],[-0.796,-9.949],[23.263,0.014],[14.988,11.748],[5.95,0],[0,-10.491],[-11.938,-10.23],[-21.764,-2.035],[0,0]],"o":[[7.984,-0.17],[0,0],[39.675,-1.585],[-1.068,-30.984],[0,0],[-16.657,-2.78],[-0.303,-10.439],[17.537,0],[6.889,7.203],[8.768,0],[-0.489,-9.7],[-10.304,-9.518],[0,0],[0,-9.238],[-7.046,0],[0,0],[-40.115,4.369],[-2.855,39.393],[0,0],[13.531,2.913],[1.181,14.774],[-18.633,-0.011],[-7.985,-7.986],[-9.551,0],[0,9.238],[12.526,11.43],[0,0],[-0.176,10.139]],"v":[[0.641,140.795],[18.575,121.736],[18.325,112.335],[88.625,43.584],[25.942,-15.455],[-6.655,-22.407],[-31.998,-45.307],[-1.424,-69.115],[39.573,-52.352],[62.613,-41.487],[81.864,-60.3],[65.054,-87.857],[19.015,-107.275],[18.39,-120.896],[1.549,-134.298],[-16.385,-120.771],[-16.135,-107.619],[-83.648,-45.707],[-23.816,20.353],[7.094,26.462],[37.569,47.726],[1.237,74.861],[-46.738,54.502],[-67.058,45.795],[-86.687,62.892],[-71.312,92.73],[-17.074,113.991],[-16.199,123.861]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Path","bm":0,"hd":false}],"ip":0,"op":19,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Circle Stroke","sr":1,"ks":{"p":{"a":0,"k":[256,256.442,0]},"a":{"a":0,"k":[0,0.442,0]},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.6,0.6,0.6],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":11,"s":[96,96,100]},{"t":19,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-109.802,0],[0,-109.802],[109.802,0],[0,109.802]],"o":[[109.802,0],[0,109.802],[-109.802,0],[0,-109.802]],"v":[[0,-198.373],[198.815,0.442],[0,199.256],[-198.815,0.442]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":32},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Mask","bm":0,"hd":false}],"ip":0,"op":19,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Dollar 4","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"t":19,"s":[0],"h":1},{"t":30,"s":[100],"h":1}]},"p":{"a":0,"k":[0.157,0.248,0]},"a":{"a":0,"k":[0.157,0.248,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":19,"s":[{"i":[[-7.203,0],[0,9.395],[0,0],[0,36.013],[38.675,8.455],[0,0],[0,13.309],[-21.608,0],[-13.622,-15.188],[-7.203,0],[0,9.081],[8.768,8.612],[19.572,2.505],[0,0],[7.203,0],[0,-9.395],[0,0],[0,-34.76],[-35.7,-7.985],[0,0],[0,-13.779],[24.896,0],[14.092,15.188],[5.95,0],[0,-10.491],[-9.551,-8.299],[-21.764,-2.036],[0,0]],"o":[[7.046,0],[0,0],[42.119,-4.541],[0,-31.002],[0,0],[-19.885,-4.384],[0,-15.971],[17.537,0],[6.889,7.203],[8.768,0],[0,-8.768],[-11.587,-10.96],[0,0],[0,-9.238],[-7.046,0],[0,0],[-40.553,3.758],[0,30.376],[0,0],[23.173,5.48],[0,17.85],[-18.633,0],[-7.985,-7.985],[-9.551,0],[0,9.238],[12.526,11.43],[0,0],[0,9.395]],"v":[[0.391,134.67],[13.701,121.361],[13.701,108.835],[82.125,43.542],[24.817,-14.705],[-6.968,-21.907],[-36.561,-48.682],[-1.174,-76.24],[42.198,-55.102],[61.613,-45.237],[77.114,-60.425],[63.179,-87.357],[14.64,-108.025],[14.64,-121.021],[1.174,-134.173],[-12.135,-121.021],[-12.135,-108.494],[-78.523,-45.707],[-24.191,12.853],[7.594,20.212],[40.319,47.613],[1.487,76.736],[-46.738,54.502],[-65.058,44.795],[-81.812,61.392],[-66.937,88.48],[-13.074,108.991],[-13.074,121.361]],"c":true}]},{"i":{"x":0.71,"y":1},"o":{"x":0.3,"y":0},"t":29,"s":[{"i":[[-6.62,0],[0,8.635],[0,0],[0,33.102],[35.549,7.772],[0,0],[0,12.233],[-19.861,0],[-12.521,-13.96],[-6.62,0],[0,8.348],[8.06,7.916],[17.99,2.303],[0,0],[6.62,0],[0,-8.635],[0,0],[0,-31.951],[-32.814,-7.34],[0,0],[0,-12.665],[22.884,0],[12.953,13.96],[5.469,0],[0,-9.643],[-8.779,-7.628],[-20.005,-1.871],[0,0]],"o":[[6.477,0],[0,0],[38.715,-4.174],[0,-28.497],[0,0],[-18.278,-4.03],[0,-14.68],[16.119,0],[6.333,6.62],[8.06,0],[0,-8.06],[-10.65,-10.075],[0,0],[0,-8.491],[-6.477,0],[0,0],[-37.276,3.454],[0,27.921],[0,0],[21.301,5.037],[0,16.407],[-17.127,0],[-7.34,-7.34],[-8.779,0],[0,8.491],[11.514,10.506],[0,0],[0,8.635]],"v":[[0.372,123.806],[12.606,111.572],[12.606,100.059],[75.5,40.043],[22.824,-13.496],[-6.392,-20.117],[-33.593,-44.727],[-1.067,-70.058],[38.8,-50.628],[56.646,-41.561],[70.894,-55.522],[58.085,-80.276],[13.469,-99.274],[13.469,-111.22],[1.092,-123.309],[-11.141,-111.22],[-11.141,-99.706],[-72.164,-41.993],[-22.223,11.834],[6.993,18.599],[37.073,43.785],[1.38,70.555],[-42.948,50.118],[-59.787,41.194],[-75.187,56.45],[-61.514,81.349],[-12.005,100.203],[-12.005,111.572]],"c":true}]},{"i":{"x":0.71,"y":1},"o":{"x":0.29,"y":0},"t":36,"s":[{"i":[[-7.42,0],[0,9.678],[0,0],[0,37.099],[39.841,8.71],[0,0],[0,13.71],[-22.259,0],[-14.033,-15.646],[-7.42,0],[0,9.355],[9.033,8.871],[20.162,2.581],[0,0],[7.42,0],[0,-9.678],[0,0],[0,-35.808],[-36.776,-8.226],[0,0],[0,-14.194],[25.647,0],[14.517,15.646],[6.129,0],[0,-10.807],[-9.839,-8.549],[-22.421,-2.097],[0,0]],"o":[[7.258,0],[0,0],[43.389,-4.678],[0,-31.937],[0,0],[-20.485,-4.516],[0,-16.452],[18.065,0],[7.097,7.42],[9.033,0],[0,-9.033],[-11.936,-11.291],[0,0],[0,-9.517],[-7.258,0],[0,0],[-41.776,3.871],[0,31.292],[0,0],[23.872,5.645],[0,18.388],[-19.195,0],[-8.226,-8.226],[-9.839,0],[0,9.517],[12.904,11.775],[0,0],[0,9.678]],"v":[[0.399,138.723],[14.109,125.013],[14.109,112.109],[84.596,44.847],[25.561,-15.156],[-7.183,-22.575],[-37.668,-50.157],[-1.214,-78.546],[43.465,-56.771],[63.466,-46.609],[79.435,-62.255],[65.079,-89.998],[15.077,-111.29],[15.077,-124.678],[1.205,-138.227],[-12.505,-124.678],[-12.505,-111.774],[-80.896,-47.093],[-24.925,13.233],[7.818,20.814],[41.53,49.041],[1.528,79.043],[-48.152,56.138],[-67.024,46.138],[-84.283,63.236],[-68.96,91.14],[-13.473,112.27],[-13.473,125.013]],"c":true}]},{"t":44,"s":[{"i":[[-7.203,0],[0,9.395],[0,0],[0,36.013],[38.675,8.455],[0,0],[0,13.309],[-21.608,0],[-13.622,-15.188],[-7.203,0],[0,9.081],[8.768,8.612],[19.572,2.505],[0,0],[7.203,0],[0,-9.395],[0,0],[0,-34.76],[-35.7,-7.985],[0,0],[0,-13.779],[24.896,0],[14.092,15.188],[5.95,0],[0,-10.491],[-9.551,-8.299],[-21.764,-2.036],[0,0]],"o":[[7.046,0],[0,0],[42.119,-4.541],[0,-31.002],[0,0],[-19.885,-4.384],[0,-15.971],[17.537,0],[6.889,7.203],[8.768,0],[0,-8.768],[-11.587,-10.96],[0,0],[0,-9.238],[-7.046,0],[0,0],[-40.553,3.758],[0,30.376],[0,0],[23.173,5.48],[0,17.85],[-18.633,0],[-7.985,-7.985],[-9.551,0],[0,9.238],[12.526,11.43],[0,0],[0,9.395]],"v":[[0.391,134.67],[13.701,121.361],[13.701,108.835],[82.125,43.542],[24.817,-14.705],[-6.968,-21.907],[-36.561,-48.682],[-1.174,-76.24],[42.198,-55.102],[61.613,-45.237],[77.114,-60.425],[63.179,-87.357],[14.64,-108.025],[14.64,-121.021],[1.174,-134.173],[-12.135,-121.021],[-12.135,-108.494],[-78.523,-45.707],[-24.191,12.853],[7.594,20.212],[40.319,47.613],[1.487,76.736],[-46.738,54.502],[-65.058,44.795],[-81.812,61.392],[-66.937,88.48],[-13.074,108.991],[-13.074,121.361]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Path","bm":0,"hd":false}],"ip":19,"op":165,"st":19,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Dollar 3","parent":7,"sr":1,"ks":{"p":{"a":0,"k":[0.157,0.248,0]},"a":{"a":0,"k":[0.157,0.248,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-109.802,0],[0,-109.802],[109.802,0],[0,109.802]],"o":[[109.802,0],[0,109.802],[-109.802,0],[0,-109.802]],"v":[[0,-198.373],[198.815,0.442],[0,199.256],[-198.815,0.442]],"c":true}},"nm":"Path 2","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":19,"s":[{"i":[[-8.578,0.183],[0.8,14.514],[0,0],[1.375,39.916],[43.433,7.955],[0,0],[0.248,8.557],[-21.608,0],[-10.948,-10.273],[-7.203,0],[0.716,14.203],[10.571,9.482],[15.485,2.15],[0,0],[7.203,0],[0,-9.395],[0,0],[2.648,-36.543],[-35.7,-7.985],[0,0],[-0.796,-9.949],[23.263,0.014],[14.988,11.748],[5.95,0],[0,-10.491],[-11.938,-10.23],[-21.764,-2.035],[0,0]],"o":[[7.984,-0.17],[0,0],[39.675,-1.585],[-1.068,-30.984],[0,0],[-16.657,-2.78],[-0.303,-10.439],[17.537,0],[6.889,7.203],[8.768,0],[-0.489,-9.7],[-10.304,-9.518],[0,0],[0,-9.238],[-7.046,0],[0,0],[-40.115,4.369],[-2.855,39.393],[0,0],[13.531,2.913],[1.181,14.774],[-18.633,-0.011],[-7.985,-7.986],[-9.551,0],[0,9.238],[12.526,11.43],[0,0],[-0.176,10.139]],"v":[[0.641,140.795],[18.575,121.736],[18.325,112.335],[88.625,43.584],[25.942,-15.455],[-6.655,-22.407],[-31.998,-45.307],[-1.424,-69.115],[39.573,-52.352],[62.613,-41.487],[81.864,-60.3],[65.054,-87.857],[19.015,-107.275],[18.39,-120.896],[1.549,-134.298],[-16.385,-120.771],[-16.135,-107.619],[-83.648,-45.707],[-23.816,20.353],[7.094,26.462],[37.569,47.726],[1.237,74.861],[-46.738,54.502],[-67.058,45.795],[-86.687,62.892],[-71.312,92.73],[-17.074,113.991],[-16.199,123.861]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.3,"y":0},"t":27,"s":[{"i":[[-7.998,0.17],[0.745,13.532],[0,0],[1.282,37.214],[40.493,7.416],[0,0],[0.231,7.978],[-20.145,0],[-10.207,-9.578],[-6.715,0],[0.668,13.241],[9.856,8.84],[14.437,2.004],[0,0],[6.715,0],[0,-8.759],[0,0],[2.469,-34.07],[-33.283,-7.445],[0,0],[-0.742,-9.276],[21.688,0.013],[13.974,10.952],[5.547,0],[0,-9.781],[-11.13,-9.537],[-20.291,-1.898],[0,0]],"o":[[7.443,-0.158],[0,0],[36.989,-1.477],[-0.995,-28.887],[0,0],[-15.53,-2.592],[-0.282,-9.733],[16.35,0],[6.423,6.715],[8.175,0],[-0.456,-9.043],[-9.607,-8.874],[0,0],[0,-8.613],[-6.569,0],[0,0],[-37.4,4.074],[-2.662,36.727],[0,0],[12.615,2.716],[1.101,13.774],[-17.372,-0.01],[-7.445,-7.445],[-8.905,0],[0,8.613],[11.678,10.657],[0,0],[-0.164,9.453]],"v":[[0.71,131.491],[17.43,113.722],[17.197,104.957],[82.738,40.86],[24.299,-14.183],[-6.093,-20.665],[-29.72,-42.014],[-1.216,-64.211],[37.006,-48.582],[58.487,-38.453],[76.436,-55.993],[60.763,-81.684],[17.84,-99.788],[17.257,-112.487],[1.557,-124.982],[-15.164,-112.37],[-14.931,-100.109],[-77.875,-42.387],[-22.092,19.201],[6.726,24.897],[35.138,44.722],[1.266,70.02],[-43.463,51.04],[-62.407,42.921],[-80.707,58.861],[-66.373,86.679],[-15.806,106.502],[-14.991,115.703]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[-6.775,0],[-1.13,7.406],[0,0],[-2.113,33.436],[22.399,12.065],[10.066,2.947],[1.564,14.881],[-11.011,-7.209],[-12.115,-0.746],[-3.858,4.579],[0.623,8.388],[10.311,9.751],[16.839,3.093],[0,0],[6.775,0],[3.028,-8.556],[0,0],[1.765,-31.309],[-34.272,-14.97],[0,0],[0.227,-11.872],[17.864,8.577],[16.071,12.348],[7.66,-8.417],[-0.818,-9.633],[-8.985,-7.806],[-19.397,-2.275],[0,0]],"o":[[6.628,0],[0,0],[40.895,-6.296],[1.523,-28.106],[0,0],[-11.706,-3.427],[-1.414,-13.459],[8.186,6.868],[9.129,1.301],[7.148,-4.636],[-2.218,-11.155],[-10.9,-10.31],[0,0],[-1.708,-8.359],[-6.628,0],[0,0],[-36.8,5.698],[-2.136,16.373],[0,0],[17.676,8.303],[-0.157,14.815],[-9.05,-4.345],[-9.013,-8.384],[-5.813,4.213],[2.174,10.799],[11.783,10.752],[0,0],[1.185,7.699]],"v":[[-0.68,135.608],[19.394,123.825],[19.704,112.813],[89.427,47.173],[58.482,-12.843],[30.647,-23.714],[-12.825,-45.093],[24.832,-46.295],[52.299,-31.514],[75.524,-37.095],[85.301,-60.351],[67.275,-90.602],[23.376,-110.191],[21.534,-121.829],[1.122,-134.055],[-20.552,-122.525],[-23.678,-109.532],[-86.423,-48.634],[-52.751,14.959],[-27.914,24.704],[14.917,44.151],[-14.753,52.709],[-47.297,34.992],[-81.374,36.817],[-87.936,63.454],[-67.892,93.225],[-21.434,113.217],[-19.517,124.045]],"c":true}]},{"i":{"x":0.71,"y":1},"o":{"x":0.167,"y":0},"t":30,"s":[{"i":[[-4.617,0],[-4.23,0.524],[0,0],[-9.228,25.062],[-2.072,13.274],[0,0],[-0.282,6.971],[0.753,6.445],[0.194,1.975],[0.931,5.356],[2.722,6.095],[14.63,15.076],[5.68,5.713],[0,0],[4.617,0],[13.228,-5.678],[0,0],[7.708,-19.203],[1.725,-7.481],[0,0],[0.205,-5.571],[0.193,-2.665],[-0.008,0.757],[-1.477,-4.165],[-3.574,-6.747],[-6.628,-5.77],[-9.248,-3.41],[0,0]],"o":[[4.517,0],[0,0],[32.566,-13.92],[6.651,-18.063],[0,0],[0.14,-2.538],[0.178,-4.414],[-0.584,-4.997],[-0.768,-5.237],[-1.355,-7.792],[-9.689,-21.695],[-7.428,-8.321],[0,0],[-7.462,-5.299],[-4.517,0],[0,0],[-20.107,14.041],[-3.179,7.921],[0,0],[-0.309,4.577],[-0.125,3.398],[-0.152,2.098],[-0.008,1.896],[7.73,21.794],[9.495,17.924],[9.39,7.705],[0,0],[4.874,0.657]],"v":[[-2.409,142.332],[13.891,140.829],[35.367,136.634],[102.631,65.235],[112.669,29.559],[113.713,21.618],[114.775,9.072],[114.062,-5.777],[112.697,-21.426],[109.919,-36.523],[101.983,-63.998],[71.574,-109.879],[48.15,-126.33],[31.797,-134.304],[-2.361,-142.386],[-40.814,-135.437],[-64.534,-120.992],[-108.376,-63.832],[-116.176,-40.251],[-119.06,-24.035],[-120.337,-8.166],[-120.637,2.557],[-120.395,11.236],[-115.129,40.942],[-100.226,80.115],[-68.883,119.411],[-39.173,136.753],[-19.62,141.968]],"c":true}]},{"t":36,"s":[{"i":[[-7.758,0],[-8.294,-0.389],[0,0],[-15.505,35.555],[-5.189,20.685],[0,0],[-0.473,9.89],[1.265,9.144],[0.326,2.802],[1.564,7.598],[4.573,8.647],[24.58,21.387],[9.543,8.105],[0,0],[7.758,0],[22.225,-8.056],[0,0],[12.95,-27.243],[2.899,-10.613],[0,0],[1.667,-6.842],[0.325,-3.781],[-0.013,1.074],[-2.482,-5.909],[-6.005,-9.572],[-10.288,-8.938],[-15.538,-4.838],[0,0]],"o":[[7.589,0],[0,0],[54.716,-19.748],[11.175,-25.626],[0,0],[0.234,-3.6],[0.3,-6.263],[-0.98,-7.089],[-1.29,-7.43],[-2.276,-11.054],[-16.279,-30.778],[-12.48,-11.805],[0,0],[-12.537,-7.517],[-7.589,0],[0,0],[-33.783,19.92],[-5.342,11.237],[0,0],[-1.178,3.542],[-1.151,4.725],[-0.256,2.977],[-0.013,2.69],[12.987,30.918],[15.953,25.428],[13.492,12.311],[0,0],[8.697,1.766]],"v":[[0.161,201.029],[28.615,199.619],[64.698,193.667],[177.711,92.374],[196.229,40.138],[199.692,30.496],[201.477,12.697],[200.278,-8.368],[197.985,-30.569],[193.317,-51.988],[176.623,-90.966],[125.531,-156.056],[86.175,-179.394],[57.632,-189.084],[1.309,-202.173],[-63.298,-192.315],[-103.151,-171.822],[-176.812,-90.731],[-189.917,-57.276],[-192.842,-34.271],[-196.908,-11.758],[-195.918,3.454],[-195.084,16.127],[-188.158,57.91],[-163.12,113.485],[-108.323,168.511],[-60.54,193.835],[-27.689,201.234]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Path","bm":0,"hd":false}],"ip":19,"op":165,"st":19,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Circle Stroke 2","sr":1,"ks":{"p":{"a":0,"k":[256,256.442,0]},"a":{"a":0,"k":[0,0.442,0]},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"i":{"x":[0.71,0.71,0.71],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":27,"s":[96,96,100]},{"i":{"x":[0.71,0.71,0.71],"y":[1,1,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":36,"s":[102,102,100]},{"t":44,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-109.802,0],[0,-109.802],[109.802,0],[0,109.802]],"o":[[109.802,0],[0,109.802],[-109.802,0],[0,-109.802]],"v":[[0,-198.373],[198.815,0.442],[0,199.256],[-198.815,0.442]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":32},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Mask","bm":0,"hd":false}],"ip":19,"op":165,"st":19,"bm":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/speed_limit.json b/TMessagesProj/src/main/res/raw/speed_limit.json new file mode 100644 index 000000000..5882f494b --- /dev/null +++ b/TMessagesProj/src/main/res/raw/speed_limit.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":51,"w":512,"h":512,"nm":"SPEED LOW 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL PANEL 2","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[248,356,0]},"a":{"a":0,"k":[0,100,0]},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,4.302]},"t":0,"s":[25.714,15,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":13,"s":[117.236,124,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0,0,0]},"t":37,"s":[96.96,95,100]},{"t":50,"s":[100,100,100]}]}},"ao":0,"ip":1,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Arrow 2","parent":1,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":2,"s":[63]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.05],"y":[0]},"t":37,"s":[-71]},{"t":50,"s":[-60]}]},"p":{"a":0,"k":[5,60,0]},"a":{"a":0,"k":[-7.787,69.299,0]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,4.167]},"t":3,"s":[48.75,15,100]},{"t":16,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":2,"s":[{"i":[[-0.807,0.302],[-5.808,-0.264],[-6.012,-2.01],[-1.065,2.968],[0,0],[6.278,-0.597],[0.47,-5.497],[0,0],[-3.141,-0.274]],"o":[[6.203,-2.374],[5.783,0.263],[2.993,0.992],[0.685,-1.908],[-0.597,-6.278],[-5.492,0.522],[0,0],[-0.28,3.141],[0.858,0.075]],"v":[[-23.465,-9.777],[-5.449,-12.942],[12.243,-9.532],[19.463,-13.151],[6.541,-103.282],[-5.906,-113.568],[-16.202,-103.174],[-31.181,-15.611],[-25.995,-9.429]],"c":true}]},{"i":{"x":0.462,"y":1},"o":{"x":0.518,"y":0},"t":13,"s":[{"i":[[-0.807,0.302],[-5.808,-0.265],[-6.012,-2.01],[-1.065,2.968],[0,0],[6.278,-0.597],[0.47,-5.497],[0,0],[-3.141,-0.274]],"o":[[6.203,-2.374],[5.783,0.263],[2.993,0.992],[0.685,-1.908],[-0.597,-6.278],[-5.492,0.522],[0,0],[-0.28,3.141],[0.858,0.075]],"v":[[-23.078,-8.893],[-5.062,-12.058],[12.63,-8.648],[19.85,-12.267],[7.593,-149.498],[-4.855,-159.784],[-15.151,-149.39],[-30.794,-14.727],[-25.608,-8.545]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.05,"y":0},"t":37,"s":[{"i":[[-0.807,0.302],[-5.808,-0.264],[-6.012,-2.01],[-1.065,2.968],[0,0],[6.278,-0.597],[0.47,-5.497],[0,0],[-3.141,-0.274]],"o":[[6.203,-2.374],[5.783,0.263],[2.993,0.992],[0.685,-1.908],[-0.597,-6.278],[-5.492,0.522],[0,0],[-0.28,3.141],[0.858,0.075]],"v":[[-22.179,22.109],[-4.163,18.944],[13.53,22.354],[20.75,18.735],[7.133,-150.626],[-5.314,-160.912],[-15.61,-150.518],[-29.895,16.275],[-24.708,22.457]],"c":true}]},{"t":50,"s":[{"i":[[-0.807,0.302],[-5.808,-0.264],[-6.012,-2.01],[-1.065,2.968],[0,0],[6.278,-0.597],[0.47,-5.497],[0,0],[-3.141,-0.274]],"o":[[6.203,-2.374],[5.783,0.263],[2.993,0.992],[0.685,-1.908],[-0.597,-6.278],[-5.492,0.522],[0,0],[-0.28,3.141],[0.858,0.075]],"v":[[-21.224,11.095],[-3.208,7.931],[14.484,11.341],[21.705,7.722],[7.133,-150.626],[-5.314,-160.912],[-15.61,-150.518],[-28.94,5.261],[-23.753,11.444]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Path","bm":0,"hd":false}],"ip":4,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Center 2","parent":1,"sr":1,"ks":{"p":{"a":0,"k":[4.867,59.638,0]},"a":{"a":0,"k":[-3.133,59.638,0]},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.256]},"t":1,"s":[30,30,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.7],"y":[0,0,0]},"t":13,"s":[132,132,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0,0,0]},"t":37,"s":[80,80,100]},{"t":50,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-23.527,0],[0,-23.854],[23.527,0],[0,23.854]],"o":[[23.527,0],[0,23.854],[-23.527,0],[0,-23.854]],"v":[[-3.133,16.446],[39.465,59.638],[-3.133,102.83],[-45.732,59.638]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Oval","bm":0,"hd":false}],"ip":3,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"R 2","parent":1,"sr":1,"ks":{"p":{"a":0,"k":[3.387,92.129,0]},"a":{"a":0,"k":[-4.613,92.129,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[{"i":[[-12.181,-22.878],[1.489,-32.247],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.629,13.803],[-95.443,0],[-27.193,-21.405]],"o":[[14.326,26.81],[-0.416,9.018],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.379,-96.112],[37.342,0],[17.477,15.397]],"v":[[140.097,-14.089],[162.167,79.978],[147.237,88.265],[110.997,88.421],[93.299,89.36],[52.421,88.725],[-11.915,89.467],[-126.122,91.21],[-171.718,79.738],[-4.613,-104.244],[93.624,-69.99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[{"i":[[-12.181,-22.878],[0.872,-32.261],[8.788,0.236],[2.459,9.024],[1.846,6.538],[9.385,4.501],[25.431,-0.945],[14.765,-28.287],[0.505,14.952],[-95.443,0],[-27.193,-21.405]],"o":[[14.326,26.81],[-0.244,9.564],[-8.789,-0.236],[-1.916,-7.032],[-5.633,-13.773],[-7.091,-4.936],[-48.278,1.794],[-2.977,5.704],[-3.568,-105.902],[37.342,0],[17.477,15.397]],"v":[[140.097,-14.089],[162.301,78.289],[135.829,89.606],[94.533,81.738],[86.593,63.601],[53.608,35.002],[-9.399,24.486],[-109.611,89.706],[-172.033,84.274],[-4.613,-104.244],[93.624,-69.99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[-12.181,-22.878],[0.564,-32.268],[13.183,0.354],[2.782,9.119],[2.77,9.807],[13.249,11.647],[38.148,-1.388],[-1.708,-49.31],[0.443,15.527],[-95.443,0],[-27.194,-21.405]],"o":[[14.326,26.81],[-0.158,9.837],[-13.183,-0.354],[-3.19,-10.456],[-7.131,-30.613],[-10.636,-7.404],[-67.184,2.444],[0.334,9.645],[-3.162,-110.797],[37.342,0],[17.477,15.397]],"v":[[140.097,-14.089],[162.367,77.445],[130.125,90.276],[95.284,79.484],[91.565,50.721],[57.889,-3.344],[-4.562,-22.478],[-102.149,86.238],[-172.19,86.542],[-4.613,-104.244],[93.624,-69.99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[{"i":[[-1.676,1.444],[-1.065,-5.369],[-0.994,-7.637],[-0.431,-9.662],[3.793,-2.828],[10.609,0.285],[3.797,2.409],[0.144,5.166],[0.503,5.219],[0.335,1.576],[-10.45,5.837]],"o":[[0.644,2.858],[1.065,5.369],[0.994,7.637],[0.231,5.163],[-3.793,2.828],[-10.609,-0.285],[-3.797,-2.409],[-0.286,-10.276],[-0.503,-5.219],[2.491,-1.569],[10.45,-5.837]],"v":[[154.331,17.92],[157.017,30.321],[160.229,49.892],[162.489,75.902],[157.844,88.084],[136.939,92.094],[116.119,88.212],[110.997,77.008],[109.718,54.119],[108.365,44.28],[131.959,31.006]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[{"i":[[-1.676,1.444],[-1.981,-6.643],[-1.571,-9.148],[-0.198,-11.366],[3.758,-2.827],[10.609,0.285],[3.797,2.409],[0.144,5.166],[0.501,6.379],[0.428,0.751],[-9.057,7.991]],"o":[[1.427,3.851],[1.981,6.643],[1.571,9.148],[0.09,5.168],[-3.758,2.827],[-10.609,-0.285],[-3.797,-2.409],[-0.286,-10.276],[-0.501,-6.379],[2.491,-1.569],[9.057,-7.991]],"v":[[148.673,5.487],[154.026,21.301],[159.595,45.06],[162.489,75.902],[157.738,88.087],[136.939,92.094],[116.119,88.212],[110.997,77.008],[109.744,51.593],[108.278,40.464],[129.087,22.882]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[-2.652,3.422],[-4.697,-10.756],[-2.302,-11.829],[0.53,-13.356],[3.684,-2.828],[10.609,0.285],[3.833,2.408],[0,5.169],[1.624,10.337],[2.513,8.504],[-5.883,8.889]],"o":[[6.656,10.137],[4.697,10.756],[2.302,11.829],[-0.205,5.164],[-3.684,2.828],[-10.609,-0.285],[-3.833,-2.408],[0,-8.797],[-1.624,-10.337],[3.803,-6.13],[5.883,-8.889]],"v":[[131.976,-26.751],[149.115,4.474],[159.722,38.238],[162.489,75.902],[157.517,88.085],[136.939,92.094],[116.011,88.214],[110.997,77.008],[108.377,47.462],[101.988,18.357],[117.845,-6.228]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-1.391,3.474],[-8.399,-15.088],[-3.623,-15.23],[0.801,-13.925],[3.663,-2.83],[10.609,0.285],[3.833,2.408],[0,5.169],[3.395,16.808],[9.027,11.539],[-4.372,10.232]],"o":[[13.527,13.497],[8.399,15.088],[3.623,15.23],[-0.288,5.158],[-3.663,2.83],[-10.609,-0.285],[-3.833,-2.408],[0,-8.797],[-3.395,-16.808],[0.326,-2.309],[4.372,-10.232]],"v":[[107.598,-57.271],[140.4,-14.032],[158.345,31.807],[162.489,75.902],[157.455,88.081],[136.939,92.094],[116.011,88.214],[110.997,77.008],[106.465,35.28],[88.392,-10.561],[97.196,-33.042]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0.678,3.558],[-15.275,-19.793],[-6.606,-20.792],[1.248,-14.859],[3.629,-2.832],[10.609,0.285],[3.833,2.408],[0,5.169],[7.253,23.842],[24.731,18.56],[-1.498,9.722]],"o":[[24.761,11.863],[15.275,19.793],[6.606,20.792],[-0.424,5.15],[-3.629,2.832],[-10.609,-0.285],[-3.833,-2.408],[0,-8.797],[-7.253,-23.842],[-0.377,-2.974],[1.498,-9.722]],"v":[[62.189,-91.136],[122.039,-41.919],[154.656,20.693],[162.489,75.902],[157.352,88.074],[136.939,92.094],[116.011,88.214],[110.997,77.008],[102.673,22.967],[57.253,-45.717],[59.946,-67.988]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[-12.181,-22.878],[0,-32.281],[21.218,0.57],[0,10.337],[4.458,15.785],[21.324,18.746],[0.261,0.455],[0.241,-0.196],[0,0],[0.178,1.784],[-27.194,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,-17.595],[-9.963,-32.649],[-13.566,-9.645],[0.136,-0.564],[0.391,0.706],[0,0],[18.219,3.831],[17.477,15.397]],"v":[[140.097,-14.089],[162.489,75.902],[136.939,92.094],[110.997,77.008],[104.251,26.591],[56.286,-44.964],[40.19,-56.906],[40.069,-56.335],[35.419,-88.208],[32.766,-100.15],[93.624,-69.99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[-12.181,-22.878],[0,-32.281],[21.218,0.57],[0,10.337],[4.458,15.785],[21.324,18.746],[0.261,0.455],[0.241,-0.196],[0,0],[0.178,1.784],[-27.194,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,-17.595],[-9.963,-32.649],[-13.566,-9.645],[0.136,-0.564],[0.391,0.706],[0,0],[30.73,5.745],[17.477,15.397]],"v":[[140.097,-14.089],[162.489,75.902],[136.939,92.094],[110.997,77.008],[104.251,26.591],[56.286,-44.964],[23.725,-63.482],[23.604,-64.139],[15.488,-87.797],[11.099,-103.437],[93.625,-69.99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[-12.181,-22.878],[0,-32.281],[21.218,0.57],[0,10.337],[4.458,15.785],[21.324,18.746],[12.308,-0.227],[2.548,-0.349],[0.928,0.577],[-10.156,-0.437],[-27.194,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,-17.595],[-9.963,-32.649],[-15.343,-10.781],[-3.822,-0.314],[-0.577,-0.113],[2.643,-1.832],[34.035,3.04],[17.477,15.397]],"v":[[140.097,-14.089],[162.489,75.902],[136.939,92.094],[110.997,77.008],[104.251,26.591],[56.286,-44.964],[8.804,-63.634],[-0.851,-63.744],[-20.406,-101.894],[3.243,-103.84],[93.624,-69.99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[-12.181,-22.878],[0,-32.281],[21.218,0.57],[0,10.337],[4.458,15.785],[21.324,18.746],[24.355,-0.908],[4.855,-0.501],[1.855,1.155],[-16.93,-0.152],[-27.194,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,-17.595],[-9.963,-32.648],[-17.119,-11.917],[-7.781,-0.063],[-1.545,-0.932],[5.286,-3.664],[37.341,0.335],[17.477,15.397]],"v":[[140.097,-14.089],[162.489,75.902],[136.939,92.094],[110.997,77.008],[104.251,26.591],[56.286,-44.964],[-6.117,-63.786],[-25.306,-63.348],[-52.386,-96.989],[-4.613,-104.244],[93.624,-69.99]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[-12.181,-22.878],[0,-32.281],[21.218,0.57],[0,10.337],[4.458,15.785],[21.324,18.746],[24.355,-0.908],[11.352,-5.257],[1.828,1.191],[-27.402,0.048],[-27.194,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,-17.595],[-9.962,-32.648],[-17.119,-11.917],[-16.049,0.258],[-1.545,-0.932],[12.268,-10.541],[37.341,0.157],[17.477,15.397]],"v":[[140.097,-14.089],[162.489,75.902],[136.939,92.094],[110.997,77.008],[104.251,26.591],[56.286,-44.964],[-6.117,-63.786],[-50.865,-55.931],[-79.881,-83.32],[-4.613,-104.244],[93.624,-69.99]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[-12.182,-22.878],[0,-32.281],[21.218,0.57],[0,10.337],[4.458,15.785],[21.324,18.746],[24.355,-0.908],[17.848,-10.012],[1.8,1.226],[-37.875,0.249],[-27.194,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,-17.595],[-9.962,-32.648],[-17.119,-11.917],[-24.318,0.58],[-1.545,-0.932],[19.249,-17.418],[37.341,-0.021],[17.477,15.397]],"v":[[140.097,-14.089],[162.489,75.902],[136.939,92.094],[110.997,77.008],[104.251,26.591],[56.286,-44.964],[-6.117,-63.786],[-66.677,-48.514],[-100.287,-69.652],[-4.613,-104.244],[93.624,-69.99]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.05,"y":0},"t":37,"s":[{"i":[[-12.182,-22.878],[0,-32.281],[21.218,0.57],[0,10.337],[4.458,15.785],[21.324,18.746],[24.355,-0.908],[27.019,-25.101],[1.739,1.305],[-60.911,0.689],[-27.194,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,-17.595],[-9.962,-32.649],[-17.119,-11.917],[-42.508,1.286],[-1.545,-0.932],[32.416,-42.215],[37.34,-0.412],[17.477,15.397]],"v":[[140.097,-14.089],[162.49,75.902],[136.939,92.094],[110.997,77.008],[104.251,26.591],[56.286,-44.964],[-6.117,-63.786],[-97.89,-23.899],[-138.683,-31.285],[-4.613,-104.244],[93.624,-69.99]],"c":true}]},{"t":50,"s":[{"i":[[-12.181,-22.878],[0,-32.281],[21.218,0.57],[0,10.337],[4.458,15.785],[21.324,18.746],[24.355,-0.908],[11.198,-8.201],[4.14,2.9],[-60.911,0.689],[-27.194,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,-17.595],[-9.963,-32.649],[-17.119,-11.917],[-42.508,1.286],[-1.545,-0.932],[15.91,-16.792],[37.34,-0.412],[17.477,15.397]],"v":[[140.097,-14.089],[162.489,75.902],[136.939,92.094],[110.997,77.008],[104.251,26.591],[56.286,-44.964],[-6.117,-63.786],[-83.823,-37.924],[-119.91,-54.083],[-4.613,-104.244],[93.624,-69.99]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":1,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"L 2","parent":1,"sr":1,"ks":{"p":{"a":0,"k":[3.387,92.129,0]},"a":{"a":0,"k":[-4.613,92.129,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[{"i":[[-12.181,-22.878],[0,-32.281],[21.218,0.57],[0,0],[0,0],[0,0],[0,0],[0,0],[9.189,-0.044],[0,0],[0,15.533],[-95.443,0],[-27.193,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-9.331,-0.044],[0,-96.212],[37.342,0],[17.477,15.397]],"v":[[140.097,-14.089],[162.489,75.902],[136.939,92.094],[110.997,88.421],[93.299,89.36],[52.421,88.725],[-11.915,89.467],[-126.122,91.21],[-153.699,92.127],[-156.779,92.127],[-171.716,75.721],[-4.613,-104.244],[93.624,-69.99]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.167,"y":0.167},"t":3,"s":[{"i":[[-12.181,-22.878],[0.564,-32.268],[13.183,0.354],[2.782,9.119],[5.055,6.567],[10.465,4.464],[36.254,-0.673],[19.809,-32.607],[9.189,-0.044],[0,0],[0,15.533],[-95.443,0],[-27.193,-21.405]],"o":[[14.326,26.81],[-0.158,9.837],[-13.183,-0.354],[-3.19,-10.456],[-5.01,-6.509],[-11.731,-6.041],[-43.973,0.817],[-5.011,8.248],[0,0],[-9.331,-0.044],[0,-96.212],[37.342,0],[17.477,15.397]],"v":[[140.097,-14.089],[162.367,77.445],[130.125,90.276],[95.989,79.484],[80.158,53.619],[49.885,33.589],[-11.489,24.599],[-107.786,84.789],[-132.341,92.047],[-154.705,92.078],[-171.838,74.95],[-4.613,-104.244],[93.624,-69.99]],"c":true}]},{"t":5,"s":[{"i":[[-12.181,-22.878],[0,-32.281],[21.218,0.57],[0,10.337],[4.458,15.785],[21.324,18.746],[24.375,0],[0,-75.538],[9.189,-0.044],[0,0],[0,15.533],[-95.443,0],[-27.193,-21.405]],"o":[[14.326,26.81],[0,10.337],[-21.218,-0.57],[0,-17.595],[-9.963,-32.648],[-17.119,-11.917],[-74.935,0],[0,15.533],[0,0],[-9.331,-0.044],[0,-96.212],[37.342,0],[17.477,15.397]],"v":[[140.097,-14.089],[162.489,75.902],[136.939,92.094],[110.997,77.008],[104.251,26.591],[56.286,-44.964],[-6.117,-63.786],[-140.295,75.721],[-153.699,92.127],[-156.779,92.127],[-171.716,75.721],[-4.613,-104.244],[93.624,-69.99]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[12]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.4],"y":[0]},"t":6,"s":[19.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[23.5]},{"i":{"x":[0.27],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[41]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.05],"y":[0]},"t":37,"s":[45.8]},{"t":50,"s":[43.5]}]},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[98.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.4],"y":[0]},"t":6,"s":[90.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[85.5]},{"i":{"x":[0.27],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[62]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.05],"y":[0]},"t":37,"s":[56]},{"t":50,"s":[58.8]}]},"o":{"a":0,"k":21},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":1,"op":180,"st":0,"bm":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/yuv_hlg2rgb.glsl b/TMessagesProj/src/main/res/raw/yuv_hlg2rgb.glsl deleted file mode 100644 index 77f9c21a1..000000000 --- a/TMessagesProj/src/main/res/raw/yuv_hlg2rgb.glsl +++ /dev/null @@ -1,141 +0,0 @@ -#version 320 es - -#extension GL_OES_EGL_image_external : require -#extension GL_EXT_YUV_target : require - -precision mediump float; - -uniform __samplerExternal2DY2YEXT sTexture; - -const mat4 YUV_RGB2020 = mat4(1.167808, 1.167808, 1.167808, 0, 0, -0.187877, 2.148072, 0, 1.683611, -0.652337, 0, 0, -0.914865, 0.347048, -1.147095, 1); -const mat3 BT2020_BT709 = mat3(1.6605, -0.1246, -0.0182, -0.5876, 1.1329, -0.1006, -0.0728, -0.0083, 1.1187); -const highp vec3 Lvec = vec3(0.2627, 0.6780, 0.0593); - -const float sRGB_Lw = 80.0; // sRGB Lw -const float HLG_Lw = 1000.0; // HLG Lw -const float HLG_gamma = 1.2; // HLG gamma - -const float a = .17883277; -const float b = 1. - 4. * a; -const float c = .5 - a * log(4. * a); - -highp vec3 HLG_OOTF_norm(highp vec3 x) { - return pow(dot(Lvec, mix((x * x) / 3., (b + exp((x - c) / a)) / 12., step(.5, x))), HLG_gamma - 1.0) * x; -} - -highp vec3 sRGB_EOTF_Inv(highp vec3 x) { - return mix(12.92 * x, 1.055 * pow(x, vec3(1. / 2.4)) - .055, step(.0031308, x)); -} - -highp vec3 sRGB_EOTF(highp vec3 x) { - return mix(x / 12.92, pow((x + 0.055) / 1.055, vec3(2.4)), step(.04045, x)); -} - -const float L_HDR = HLG_Lw; -const float rho_HDR = 1. + 32. * pow(L_HDR / 10000., 1. / 2.4); -const float L_SDR = sRGB_Lw; -const float rho_SDR = 1. + 32. * pow(L_SDR / 10000., 1. / 2.4); - -highp vec3 BT2446_tone_mapping(highp vec3 rgb_BT2020) { - highp vec3 rgb_BT2020_prime = sRGB_EOTF_Inv(rgb_BT2020); - - float Y_prime = dot(Lvec, rgb_BT2020_prime); - - float Y_prime_p = log(1. + (rho_HDR - 1.) * Y_prime) / log(rho_HDR); - float Y_prime_c = mix(1.0770 * Y_prime_p, mix((-1.1510 * Y_prime_p + 2.7811) * Y_prime_p - .6302, .5 * Y_prime_p + .5, step(.9909, Y_prime_p)), step(.7399, Y_prime_p)); - float Y_prime_SDR = (pow(rho_SDR, Y_prime_c) - 1.) / (rho_SDR - 1.); - - float f_Y_prime_SDR = Y_prime_SDR / (1.1 * Y_prime); - float Cb_prime_TMO = f_Y_prime_SDR * (rgb_BT2020_prime.b - Y_prime) / 1.8814; - float Cr_prime_TMO = f_Y_prime_SDR * (rgb_BT2020_prime.r - Y_prime) / 1.4746; - float Y_prime_TMO = Y_prime_SDR - max(.1 * Cr_prime_TMO, .0); - - float R_prime_TMO = Cr_prime_TMO * 1.4746 + Y_prime_TMO; - float B_prime_TMO = Cb_prime_TMO * 1.8814 + Y_prime_TMO; - float G_prime_TMO = (Y_prime_TMO - Lvec.x * R_prime_TMO - Lvec.z * B_prime_TMO) / Lvec.y; - highp vec3 rgb_BT2020_prime_TMO = vec3(R_prime_TMO, G_prime_TMO, B_prime_TMO); - - return sRGB_EOTF(rgb_BT2020_prime_TMO); -} - -uniform vec2 texSize; - -vec4 at(vec2 uv) { - highp vec4 srcYuv = texture(sTexture, uv); - highp vec3 rgb_BT2020 = clamp((YUV_RGB2020 * srcYuv).rgb, 0., 1.); - highp vec3 rgb_BT2020_displayLinear = HLG_OOTF_norm(rgb_BT2020); - highp vec3 rgb_BT2020_displayLinear_TMO = BT2446_tone_mapping(rgb_BT2020_displayLinear); - highp vec3 rgb_BT709_displayLinear = BT2020_BT709 * rgb_BT2020_displayLinear_TMO; - rgb_BT709_displayLinear = clamp(rgb_BT709_displayLinear, 0., 1.); - highp vec3 rgb_BT709_sRGB = sRGB_EOTF_Inv(rgb_BT709_displayLinear); - return vec4(rgb_BT709_sRGB, 1.0); -} - -// vec4 BilinearTextureSample(vec2 P) { -// vec2 onePixel = 1.0 / texSize, twoPixels = 2.0 / texSize; -// vec2 pixel = P * texSize + .5; -// vec2 frac = fract(pixel); -// pixel = (floor(pixel) / texSize) - onePixel / 2.; -// return mix( -// mix(at(pixel + vec2(0., 0.) * onePixel), at(pixel + vec2(1., 0.) * onePixel), frac.x), -// mix(at(pixel + vec2(0., 1.) * onePixel), at(pixel + vec2(1., 1.) * onePixel), frac.x), -// frac.y -// ); -// } - -// vec3 NearestTextureSample(vec2 P) { -// vec2 onePixel = 1.0 / texSize, twoPixels = 2.0 / texSize; -// vec2 pixel = P * texSize; -// vec2 frac = fract(pixel); -// pixel = floor(pixel) / texSize; -// return at(pixel + onePixel / 2.).xyz; -// } - -// vec3 CubicHermite (vec3 A, vec3 B, vec3 C, vec3 D, float t) { -// float t2 = t*t; -// float t3 = t*t*t; -// vec3 a = -A/2.0 + (3.0*B)/2.0 - (3.0*C)/2.0 + D/2.0; -// vec3 b = A - (5.0*B)/2.0 + 2.0*C - D / 2.0; -// vec3 c = -A/2.0 + C/2.0; -// vec3 d = B; -// return a*t3 + b*t2 + c*t + d; -// } - -// vec3 BicubicHermiteTextureSample (vec2 P) -// { -// vec2 pixel = P * texSize + .5; -// vec2 onePixel = 1.0 / texSize, twoPixels = 2.0 / texSize; -// vec2 frac = fract(pixel); -// pixel = floor(pixel) / texSize - onePixel / 2.; -// -// vec3 C00 = at(pixel + vec2(-1., -1.) * onePixel).xyz; -// vec3 C10 = at(pixel + vec2( 0., -1.) * onePixel).xyz; -// vec3 C20 = at(pixel + vec2(-1., -1.) * onePixel).xyz; -// vec3 C30 = at(pixel + vec2(twoPixels.x, -onePixel.y)).xyz; -// -// vec3 C01 = at(pixel + vec2(-onePixel.x , 0.0)).xyz; -// vec3 C11 = at(pixel + vec2( 0.0 , 0.0)).xyz; -// vec3 C21 = at(pixel + vec2( onePixel.x , 0.0)).xyz; -// vec3 C31 = at(pixel + vec2( twoPixels.x, 0.0)).xyz; -// -// vec3 C02 = at(pixel + vec2(-onePixel.x , onePixel.y)).xyz; -// vec3 C12 = at(pixel + vec2( 0.0 , onePixel.y)).xyz; -// vec3 C22 = at(pixel + vec2( onePixel.x , onePixel.y)).xyz; -// vec3 C32 = at(pixel + vec2( twoPixels.x, onePixel.y)).xyz; -// -// vec3 C03 = at(pixel + vec2(-onePixel.x , twoPixels.y)).xyz; -// vec3 C13 = at(pixel + vec2( 0.0 , twoPixels.y)).xyz; -// vec3 C23 = at(pixel + vec2( onePixel.x , twoPixels.y)).xyz; -// vec3 C33 = at(pixel + vec2( twoPixels.y, twoPixels.y)).xyz; -// -// vec3 CP0X = CubicHermite(C00, C10, C20, C30, frac.x); -// vec3 CP1X = CubicHermite(C01, C11, C21, C31, frac.x); -// vec3 CP2X = CubicHermite(C02, C12, C22, C32, frac.x); -// vec3 CP3X = CubicHermite(C03, C13, C23, C33, frac.x); -// -// return CubicHermite(CP0X, CP1X, CP2X, CP3X, frac.y); -// } - -vec4 TEX(vec2 uv) { - return at(uv); -} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/yuv_pq2rgb.glsl b/TMessagesProj/src/main/res/raw/yuv_pq2rgb.glsl deleted file mode 100644 index c8840088c..000000000 --- a/TMessagesProj/src/main/res/raw/yuv_pq2rgb.glsl +++ /dev/null @@ -1,105 +0,0 @@ -#version 320 es - -#extension GL_OES_EGL_image_external : require -#extension GL_EXT_YUV_target : require - -precision mediump float; - -uniform __samplerExternal2DY2YEXT sTexture; - -const mat4 YUV_TO_RGB_REC2020 = mat4(1.167808, 1.167808, 1.167808, 0, 0, -0.187877, 2.148072, 0, 1.683611, -0.652337, 0, 0, -0.914865, 0.347048, -1.147095, 1); - -const mat3 REC709_XYZ = mat3(0.4124564, 0.3575761, 0.1804375, 0.2126729, 0.7151522, 0.0721750, 0.0193339, 0.1191920, 0.9503041); -const mat3 XYZ_REC709 = mat3(3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252); -const mat3 REC2020_XYZ = mat3(0.6370, 0.1446, 0.1689, 0.2627, 0.6780, 0.0593, 0.0, 0.0281, 1.0610); -const mat3 XYZ_REC2020 = mat3(1.7167, -0.3557, -0.2534, -0.6667, 1.6165, 0.0158, 0.0176, -0.0428, 0.9421); - -highp vec3 sRGB_EOTF_Inv(highp vec3 x) { - return mix(12.92 * x, 1.055 * pow(x, vec3(1.0 / 2.4)) - .055, step(.0031308, x)); -} - -uniform vec2 texSize; - -vec4 at(vec2 uv) { - highp vec4 srcYuv = texture(sTexture, uv); - highp vec3 rgb_BT2020 = clamp((YUV_TO_RGB_REC2020 * srcYuv).rgb, 0., 1.); - highp vec3 rgb_BT2020_pqexp = pow(rgb_BT2020, vec3(1.0 / 78.84375)); - highp vec3 rgb_BT2020_sceneLinear = 5000.0 * pow(max(rgb_BT2020_pqexp - 0.8359375, 0.0) / (18.8515625 - 18.6875 * rgb_BT2020_pqexp), vec3(1.0 / 0.1593017578125)); - highp vec3 rgb_BT2020_displayLinear = rgb_BT2020_sceneLinear / 100.; - highp vec3 xyz_displayLinear = rgb_BT2020_displayLinear*REC2020_XYZ; // REC709_XYZ - highp vec3 xyz_tonemap = xyz_displayLinear / (xyz_displayLinear.y + 1.); - highp vec3 rgb_BT709_displayLinear = clamp( xyz_tonemap*XYZ_REC709, 0., 1.); // XYZ_REC2020 - highp vec3 rgb_BT709_sRGB = sRGB_EOTF_Inv(rgb_BT709_displayLinear); - return vec4(rgb_BT709_sRGB, 1.); -} - -// vec4 BilinearTextureSample(vec2 P) { -// vec2 onePixel = 1. / texSize; -// vec2 pixel = P * texSize + .5; -// vec2 frac = fract(pixel); -// pixel = (floor(pixel) / texSize) - onePixel / 2.; -// return mix( -// mix(at(pixel + vec2(0., 0.) * onePixel), at(pixel + vec2(1., 0.) * onePixel), frac.x), -// mix(at(pixel + vec2(0., 1.) * onePixel), at(pixel + vec2(1., 1.) * onePixel), frac.x), -// frac.y -// ); -// } - -// vec4 NearestTextureSample (vec2 P) { -// vec2 onePixel = 1. / texSize; -// vec2 pixel = P * texSize; -// vec2 frac = fract(pixel); -// pixel = floor(pixel) / texSize; -// return at(pixel + onePixel / 2.); -// } - -//vec3 CubicHermite (vec3 A, vec3 B, vec3 C, vec3 D, float t) { -// float t2 = t*t; -// float t3 = t*t*t; -// vec3 a = -A/2.0 + (3.0*B)/2.0 - (3.0*C)/2.0 + D/2.0; -// vec3 b = A - (5.0*B)/2.0 + 2.0*C - D / 2.0; -// vec3 c = -A/2.0 + C/2.0; -// vec3 d = B; -// return a * t3 + b * t2 + c*t + d; -//} - -//vec3 BicubicHermiteTextureSample (vec2 P) -//{ -// vec2 pixel = P * texSize + .5; -// vec2 onePixel = 1. / texSize; -// vec2 twoPixels = 2. / texSize; -// -// vec2 frac = fract(pixel); -// pixel = floor(pixel) / texSize - onePixel / 2.; -// -// vec3 C00 = at(pixel + vec2(-1., -1.) * onePixel).xyz; -// vec3 C10 = at(pixel + vec2( 0., -1.) * onePixel).xyz; -// vec3 C20 = at(pixel + vec2(-1., -1.) * onePixel).xyz; -// vec3 C30 = at(pixel + vec2(twoPixels.x, -onePixel.y)).xyz; -// -// vec3 C01 = at(pixel + vec2(-onePixel.x , 0.0)).xyz; -// vec3 C11 = at(pixel + vec2( 0.0 , 0.0)).xyz; -// vec3 C21 = at(pixel + vec2( onePixel.x , 0.0)).xyz; -// vec3 C31 = at(pixel + vec2( twoPixels.x, 0.0)).xyz; -// -// vec3 C02 = at(pixel + vec2(-onePixel.x , onePixel.y)).xyz; -// vec3 C12 = at(pixel + vec2( 0.0 , onePixel.y)).xyz; -// vec3 C22 = at(pixel + vec2( onePixel.x , onePixel.y)).xyz; -// vec3 C32 = at(pixel + vec2( twoPixels.x, onePixel.y)).xyz; -// -// vec3 C03 = at(pixel + vec2(-onePixel.x , twoPixels.y)).xyz; -// vec3 C13 = at(pixel + vec2( 0.0 , twoPixels.y)).xyz; -// vec3 C23 = at(pixel + vec2( onePixel.x , twoPixels.y)).xyz; -// vec3 C33 = at(pixel + vec2( twoPixels.y, twoPixels.y)).xyz; -// -// vec3 CP0X = CubicHermite(C00, C10, C20, C30, frac.x); -// vec3 CP1X = CubicHermite(C01, C11, C21, C31, frac.x); -// vec3 CP2X = CubicHermite(C02, C12, C22, C32, frac.x); -// vec3 CP3X = CubicHermite(C03, C13, C23, C33, frac.x); -// -// return CubicHermite(CP0X, CP1X, CP2X, CP3X, frac.y); -//} - -vec4 TEX(vec2 uv) { - return at(uv); -} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/ids.xml b/TMessagesProj/src/main/res/values/ids.xml index 135e3b8e0..1572fa7b5 100644 --- a/TMessagesProj/src/main/res/values/ids.xml +++ b/TMessagesProj/src/main/res/values/ids.xml @@ -33,6 +33,7 @@ + diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 0aae7bf79..6d0190609 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -659,6 +659,7 @@ Security Check You can transfer this group to **%1$s** only if you: You can transfer this channel to **%1$s** only if you have: + You can withdraw only if you have: Enabled **2-Step Verification** more than **7 days** ago. Logged in on this device more than **24 hours** ago. Please come back later. @@ -1117,6 +1118,8 @@ recommended Sponsored Recommended + Ad + what\'s this? Advertiser Info What are sponsored\nmessages? Unlike other apps, Telegram never uses your private data to target ads. [Learn more in the Privacy Policy](https://telegram.org/privacy#5-6-no-ads-based-on-user-data) @@ -1127,6 +1130,18 @@ See https://telegram.org LEARN MORE https://telegram.org + Telegram Ads are very different from ads on other platforms. Ads such as this one: + Respect Your Privacy + Ads on Telegram do not use your personal information and are based on the channel in which you see them. + Help the Channel Creator + 50% of the revenue from Telegram Ads goes to the owner of the channel where they are displayed. + Can Be Removed + You can turn off ads by subscribing to **Telegram Premium**, and Level %1$s channels can remove them for their subscribers. + Can I Launch an Ad? + Anyone can create an ad to display in this channel โ€” with minimal budgets. Check out the **Telegram Ad Platform** for details. %1$s + **Learn More >** + Understood + https://ads.telegram.org The dark theme will turn automatically during night time Reference %1$s is playing a game... @@ -1852,6 +1867,7 @@ Username copied to clipboard. Hashtag copied to clipboard. Bio copied to clipboard. + Birthday copied to clipboard. %s deleted from your contacts Username @@ -1921,8 +1937,14 @@ Remove %1$d masks Remove %1$d masks Remove %1$d masks + Edit Sticker + Edit Stickers + Delete Sticker + New Sticker Pack + Edit Sticker Pack Add Masks Add to Stickers + Add to Sticker Pack Add to Favorites Sticker was added to Favorites Sticker was removed from Favorites @@ -1938,6 +1960,14 @@ Add to Masks Stickers not found Emoji pack not found. + Create a New Sticker + Replace Sticker + Add an Existing Sticker + Delete Sticker Set + This will delete the sticker set for all users. + Set emoji that corresponds to your sticker + Choose a name for your pack. + Sticker added to %1$s sticker set. Stickers removed. %1$s is no longer in your stickers. Masks removed. @@ -1968,6 +1998,9 @@ %1$d emoji packs have been added to your emoji. %1$d emoji packs have been added to your emoji. %1$d emoji packs have been added to your emoji. + Delete for everyone + Check **@stickers** bot for more options + Remove for me Archive Share Copy link @@ -2500,8 +2533,11 @@ Other Paste Flip + Tap on an object to crop it Cut Out + Cut an Object Undo Cut + edit Paste from clipboard Proxy Settings Proxy Details @@ -3350,6 +3386,7 @@ You entered the wrong password. Back to Settings Please enter your password to complete the transfer. + Please enter your password to withdraw. Enter a password Enter a new password Enter your new password @@ -3568,12 +3605,18 @@ Delete All Cloud Drafts Everybody My Contacts + Contacts & Premium Nobody + Premium users Everybody (-%1$d) My Contacts (+%1$d) My Contacts (-%1$d) My Contacts (-%1$d, +%2$d) + Contacts & Premium (+%1$d) + Contacts & Premium (-%1$d) + Contacts & Premium (-%1$d, +%2$d) Nobody (+%1$d) + Premium (+%1$d) Everybody Contacts & Premium My Contacts @@ -3605,7 +3648,8 @@ Add Users Sorry, too many requests. Unable to change privacy settings now, please wait. Tap and hold on user to delete. - Groups + Invites + You can restrict which users are allowed to add you to groups and channels. Who can add me to group chats? You can restrict who can add you to groups and channels with granular precision. Always Allow @@ -3662,6 +3706,8 @@ Choose a file Settings Open bot + Terms of Use + https://telegram.org/tos/mini-apps Reload page Delete bot Allow @@ -3687,6 +3733,7 @@ Call Video Call Copy + Rename Delete Start Delete and stop @@ -6107,6 +6154,12 @@ This pack contains premium stickers like this one. View Hide + Remove Ads + About These Ads + Report Ad + Learn more about our [Ad Policies and Guidelines.](https://ads.telegram.org/guidelines) + We will review this ad to ensure it matches our **Ad Policies and Guidelines.** + You will no longer see ads from Telegram. Bio Add more symbols and use links in your bio. App Icon @@ -7932,6 +7985,7 @@ This channel need %1$s to be able post **%2$s** per day. Help make it possible! This channel need %s more boosts to enable stories. **%1$s** needs %2$s to unlock new features. + Your channel needs to reach **Level %d** to switch off ads.\n\nAsk your **Premium** subscribers to boost your channel with this link: Help upgrade channel This channel reached **Level 1** and can now post stories. This channel reached **Level %1$d** and can now post **%2$s** per day. @@ -8137,6 +8191,7 @@ Custom Emoji Pack Real-Time Translations Voice-to-Text Conversion + Switch Off Ads Level %d Unlocks: Level %1$d Required Reply Logo @@ -8303,7 +8358,12 @@ Away Messages Define messages that are automatically sent when you are off. Chatbots + Chatbots Add any third party chatbots that will process customer interactions. + Links to Chat + Create links that start a chat with you, suggesting the first message. + Custom Intro + Customize the message people see before they start a chat with you. Show Folder Tags Display folder names for each chat in the chat list. Subscribe to **Telegram Premium** to display folder names for each chat in the chat list. @@ -8329,6 +8389,7 @@ %s (Next day) Business hours open 24 hours + open 24/7 closed Open Closed @@ -8343,7 +8404,7 @@ You have changed the business working hours. Apply changes? Chatbots Add a bot to your account to help you automatically process and respond to the messages you receive. **Learn more >** - https://telegram.org/privacy + https://core.telegram.org/bots/api Bot Username or URL Chatbot not found Enter the link to the Telegram bot that you want to automatically process your chats. @@ -8358,8 +8419,10 @@ Select chats Bot permissions Reply to Messages - The bot will be able to view all new incoming messages, but not the messages that had been sent before you added the bot. + The bot can only reply on your behalf in chats that were active during the last 24h. Remove Bot + Oops + This bot doesnโ€™t support **Telegram Business** yet. Greeting Message Greet customers when they message you the first time or after a period of no activity. Send Greeting Message @@ -8434,6 +8497,41 @@ Business hours copied Business address copied in %1$s + Intro + Customize your intro + Enter Title + Enter Message + Choose Sticker + Random + You can customize the message people see before they start a chat with you. + Reset to Default + You have changed your intro message. Apply changes? + Link to Chat + Links to Chat + Give your customers short links that start a chat with you โ€” and suggest the first message from them to you. + Create a Link to Chat + You can also use a simple link for a chat with you โ€” %1$s. + You can also use a simple link for a chat with you โ€” %1$s or %2$s. + Add Preset Message + Add a message that will be entered in the message field for anyone who starts a chat with you using the link: + Link Name + Add a name for this link that only you will see. + Link Name + Preset message saved. + Invalid link to chat + Share link to chat + Delete chat link + Are you sure you want to delete this chat link? + Chat link deleted. + Discard changes + You have unsaved changes to preset message, do you want to discard it? + no clicks + %d clicks + %d click + %d clicks + %d clicks + %d clicks + %d clicks Time Zone Detect automatically The time zone for your business is set to %s. @@ -8441,4 +8539,136 @@ Select your time zone Existing chats New chats - + Only you can see that this message is sent by **bot**. + **%s** is a collectible username that belongs to + This username was bought on **Fragment** on %1$s for **%2$s** %3$s + Learn More + Copy Link + **%s** is a collectible phone number that belongs to + This phone number was bought on **Fragment** on %1$s for **%2$s** %3$s + Copy Phone Number + The **%1$s** username was acquired on **Fragment** on %2$s for **%3$s** %4$s. + Learn More > + Monetization + Earn From Your Channel + Telegram Ads + Telegram can display ads in your channel. + 50:50 revenue split + You can receive 50% of the ad revenue in TON. + Flexible withdrawals + You can withdraw your TON any time. + What is ๐Ÿ’Ž TON? + **TON** is a blockchain platform and cryptocurrency that Telegram uses for its high speed and low commisions on transactions. + https://telegram.org/privacy + Telegram shares %1$d%% of the revenue from ads displayed in your channel. **Learn more >** + Available balance + You can collect your reward using Fragment, a third-party platform used by advertisers to pay for ads. **Learn more >** + In the coming weeks you will be able to collect your reward using Fragment, a third-party platform used by advertisers to pay ads. **Learn more >** + Transaction history + Show %d more transaction + Show %d more transactions + Switch Off Ads + You will not be eligible for any rewards if you switch off ads. + Proceeds overview + Balance available to withdraw + Proceeds since last withdrawal + Total lifetime proceeds + Withdrawal via Fragment + Proceeds from ads + Refund + Pending + Not Completed + Balance withdrawal + View in Blockchain Explorer + Proceeds from ads displayed in + Refunded back + Ad impressions + Ad revenue + Withdraw via Fragment + Allow biometry + Do you want to allow **%s** to use biometry? + Download speed limited + Subscribe to **Telegram Premium** and increase download speeds %d times. + Upload speed limited + Subscribe to **Telegram Premium** and increase upload speeds %d times. + Bots with biometry access + Bots with biometry + Web-apps can request permission for fingerprint check. + %s added the message above for all empty chats **how?** + %s set the sticker above for all empty chats **how?** + Edit Info + Profile Info + Your name + First name + Last name + Your bio + Your channel + Personal channel + Select your channel + Hide Personal Channel + Add + Start a Channel + Personal channel added. + Write about yourself... + You can add a few lines about yourself. Choose who can see your bio in **Settings**. + Your birthday + Date of Birth + Remove Date of Birth + Add + Only your contacts can see your birthday. **Change >** + Choose who can see your birthday in **Settings.** + **Remove date of birth.** + Date of Birth + Save + %1$s + %2$s (%1$d years old) + ๐ŸŽ‚ %1$s + ๐ŸŽ‚ %2$s (%1$d years old) + Date of Birth + Birthday today + Date of Birth + Who can see my birthday? + You can restrict who can see you birthday with granular precision. + You can add users or entire groups as exception that will override the settings above. + You havenโ€™t entered your date of birth yet.\n**Add my birthday >** + Date of birth added. + Oops + Sorry, you canโ€™t change your birthday so often. + Add your birthday! ๐ŸŽ‚ + Let your contacts know when youโ€™re celebrating + You can always set your birthday in profile settings. + Itโ€™s %sโ€™s **birthday** today! ๐ŸŽ‚ + Gift them Telegram Premium. + %d contacts have **birthdays** today! ๐ŸŽ‚ + Gift them Telegram Premium. + ๐ŸŽ‚ Birthday today + Birthday yesterday + Birthday tomorrow + ๐ŸŽ‚ %1$sโ€™s having a birthday today. You can give %1$s **Telegram Premium** as a birthday gift. + User Types + Premium Users + all Telegram Premium subscribers + Premium & %s + bot manages this chat + bot stopped + Start + Stop + Manage bot + Remove bot\nfrom this chat + Add to Group + available only to Premium users + Upgrade to Premium + **%1$s** only accepts invitations to groups from Contacts and **Premium** users. + **%1$s** and **%2$s** only accept invitations to groups from Contacts and **Premium** users. + **%1$s**, **%2$s** and **%3$s** only accept invitations to groups from Contacts and **Premium** users. + **%2$s**, **%3$s** and **%1$d** more people only accept invitations to groups from Contacts and **Premium** users. + **%1$s** only accepts messages and invitations to groups from Contacts and **Premium** users. + **%1$s** and **%2$s** only accept messages and invitations to groups from Contacts and **Premium** users. + **%1$s**, **%2$s** and **%3$s** only accept invitations to groups from Contacts and **Premium** users. + **%2$s**, **%3$s** and **%1$d** more people only accept messages and invitations to groups from Contacts and **Premium** users. + Subscribe to Telegram Premium + or + Invite via Link + You can send an invite link to the group in a private message instead. + You can send these people an invite link to the group in a private message instead. + \ No newline at end of file diff --git a/TMessagesProj_AppHockeyApp/build.gradle b/TMessagesProj_AppHockeyApp/build.gradle index 8a2a3f385..1f0edd1bd 100644 --- a/TMessagesProj_AppHockeyApp/build.gradle +++ b/TMessagesProj_AppHockeyApp/build.gradle @@ -16,6 +16,7 @@ configurations.all { dependencies { implementation project(':TMessagesProj') + implementation 'androidx.fragment:fragment:1.2.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.core:core:1.10.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/TMessagesProj_AppHuawei/build.gradle b/TMessagesProj_AppHuawei/build.gradle index 384c31343..1e79f4a48 100644 --- a/TMessagesProj_AppHuawei/build.gradle +++ b/TMessagesProj_AppHuawei/build.gradle @@ -18,6 +18,7 @@ configurations.all { dependencies { implementation project(':TMessagesProj') + implementation 'androidx.fragment:fragment:1.2.0' implementation 'androidx.multidex:multidex:2.0.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' implementation files('../TMessagesProj/libs/libgsaverification-client.aar') diff --git a/TMessagesProj_AppStandalone/build.gradle b/TMessagesProj_AppStandalone/build.gradle index 0bb97f7de..7f3f7b3af 100644 --- a/TMessagesProj_AppStandalone/build.gradle +++ b/TMessagesProj_AppStandalone/build.gradle @@ -16,6 +16,7 @@ configurations.all { dependencies { implementation project(':TMessagesProj') + implementation 'androidx.fragment:fragment:1.2.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.core:core:1.10.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' diff --git a/TMessagesProj_AppStandalone/src/main/java/org/telegram/messenger/SMSJobController.java b/TMessagesProj_AppStandalone/src/main/java/org/telegram/messenger/SMSJobController.java index 1555083e9..fa9302567 100644 --- a/TMessagesProj_AppStandalone/src/main/java/org/telegram/messenger/SMSJobController.java +++ b/TMessagesProj_AppStandalone/src/main/java/org/telegram/messenger/SMSJobController.java @@ -620,7 +620,7 @@ public class SMSJobController implements NotificationCenter.NotificationCenterDe } else if (delivered) { pending.whenDelivered(success, reason); } - if (pending.received[0] && pending.received[1]) { + if (pending.received[0] || pending.received[1]) { SMSJobController.pending.remove(id); savePending(); } diff --git a/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/Components/UpdateLayout.java b/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/Components/UpdateLayout.java index 6c41192a7..2068c7258 100644 --- a/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/Components/UpdateLayout.java +++ b/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/Components/UpdateLayout.java @@ -197,14 +197,18 @@ public class UpdateLayout extends IUpdateLayout { updateLayout.animate().translationY(0).setInterpolator(CubicBezierInterpolator.EASE_OUT).setListener(null).setDuration(180).withEndAction(() -> { if (prevUpdateLayout != null) { ViewGroup parent = (ViewGroup) prevUpdateLayout.getParent(); - parent.removeView(prevUpdateLayout); + if (parent != null) { + parent.removeView(prevUpdateLayout); + } } }).start(); } else { updateLayout.setTranslationY(0); if (prevUpdateLayout != null) { ViewGroup parent = (ViewGroup) prevUpdateLayout.getParent(); - parent.removeView(prevUpdateLayout); + if (parent != null) { + parent.removeView(prevUpdateLayout); + } } } sideMenu.setPadding(0, 0, 0, AndroidUtilities.dp(44)); diff --git a/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/SMSStatsActivity.java b/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/SMSStatsActivity.java index 62b320dfa..2eedb6136 100644 --- a/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/SMSStatsActivity.java +++ b/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/SMSStatsActivity.java @@ -2,13 +2,11 @@ package org.telegram.ui; import static org.telegram.messenger.AndroidUtilities.dp; import static org.telegram.messenger.AndroidUtilities.dpf2; -import static org.telegram.messenger.AndroidUtilities.quietSleep; import static org.telegram.messenger.LocaleController.formatPluralString; import static org.telegram.messenger.LocaleController.formatString; import static org.telegram.messenger.LocaleController.getString; import android.Manifest; -import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.pm.PackageManager; @@ -19,14 +17,12 @@ import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; -import android.graphics.RectF; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.text.SpannableString; -import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextPaint; import android.text.TextUtils; @@ -34,7 +30,6 @@ import android.text.style.ImageSpan; import android.text.style.URLSpan; import android.util.TypedValue; import android.view.Gravity; -import android.view.PixelCopy; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -49,20 +44,17 @@ import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.BuildVars; import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.LocationController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.SMSJobController; -import org.telegram.messenger.SharedConfig; import org.telegram.messenger.browser.Browser; import org.telegram.messenger.web.R; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.tgnet.TL_smsjobs; -import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; @@ -83,7 +75,6 @@ import org.telegram.ui.Components.Premium.boosts.GiftInfoBottomSheet; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Stories.recorder.ButtonWithCounterView; -import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.Locale; @@ -1112,7 +1103,7 @@ public class SMSStatsActivity extends GradientHeaderActivity implements Notifica public static final int VIEW_TYPE_BUTTON_PAD = 3; @Override - protected RecyclerListView.SelectionAdapter createAdapter() { + protected RecyclerListView.SelectionAdapter createAdapter(RecyclerListView listView) { return new RecyclerListView.SelectionAdapter() { @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { diff --git a/Tools/EmojiTextureMaker.html b/Tools/EmojiTextureMaker.html new file mode 100644 index 000000000..b3360d811 --- /dev/null +++ b/Tools/EmojiTextureMaker.html @@ -0,0 +1,54 @@ + + +
+ + \ No newline at end of file diff --git a/Tools/EmojiTextureMaker.m b/Tools/EmojiTextureMaker.m deleted file mode 100644 index 0d13bacb9..000000000 --- a/Tools/EmojiTextureMaker.m +++ /dev/null @@ -1,263 +0,0 @@ -// -// AppDelegate.m -// texmaker -// -// Created by Nikolay Kudashov on 16.04.14. -// Copyright (c) 2014 telegram. All rights reserved. -// - -#import "AppDelegate.h" - -@implementation AppDelegate - -- (NSData *)reversedData:(NSData *)data { - NSData *myData = data; - - NSMutableData *reversedData = [[NSMutableData alloc] init]; - const char *bytes = [myData bytes]; - int datalength = (int)[myData length]; - - for (int i = datalength - 1; i >= 0; i--) { - [reversedData appendBytes:&bytes[i] length:1]; - } - - return reversedData; -} - -void CGImageWriteToFile(CGImageRef image, NSString *path) { - CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path]; - CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL); - CGImageDestinationAddImage(destination, image, nil); - if (!CGImageDestinationFinalize(destination)) { - NSLog(@"Failed to write image to %@", path); - } - CFRelease(destination); -} - -NSInteger sortFunc(id obj1, id obj2, void *context) { - NSNumber *ov1 = (NSNumber *)obj1; - NSNumber *ov2 = (NSNumber *)obj2; - return [ov1 compare:ov2]; -} - -- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - NSArray *array2 = @[ - @[@0x00000000D83DDE04, @0x00000000D83DDE03, @0x00000000D83DDE00, @0x00000000D83DDE0A, @0x000000000000263A, @0x00000000D83DDE09, @0x00000000D83DDE0D, - @0x00000000D83DDE18, @0x00000000D83DDE1A, @0x00000000D83DDE17, @0x00000000D83DDE19, @0x00000000D83DDE1C, @0x00000000D83DDE1D, @0x00000000D83DDE1B, - @0x00000000D83DDE33, @0x00000000D83DDE01, @0x00000000D83DDE14, @0x00000000D83DDE0C, @0x00000000D83DDE12, @0x00000000D83DDE1E, @0x00000000D83DDE23, - @0x00000000D83DDE22, @0x00000000D83DDE02, @0x00000000D83DDE2D, @0x00000000D83DDE2A, @0x00000000D83DDE25, @0x00000000D83DDE30, @0x00000000D83DDE05, - @0x00000000D83DDE13, @0x00000000D83DDE29, @0x00000000D83DDE2B, @0x00000000D83DDE28, @0x00000000D83DDE31, @0x00000000D83DDE20, @0x00000000D83DDE21, - @0x00000000D83DDE24, @0x00000000D83DDE16, @0x00000000D83DDE06, @0x00000000D83DDE0B, @0x00000000D83DDE37, @0x00000000D83DDE0E, @0x00000000D83DDE34, - @0x00000000D83DDE35, @0x00000000D83DDE32, @0x00000000D83DDE1F, @0x00000000D83DDE26, @0x00000000D83DDE27, @0x00000000D83DDE08, @0x00000000D83DDC7F, - @0x00000000D83DDE2E, @0x00000000D83DDE2C, @0x00000000D83DDE10, @0x00000000D83DDE15, @0x00000000D83DDE2F, @0x00000000D83DDE36, @0x00000000D83DDE07, - @0x00000000D83DDE0F, @0x00000000D83DDE11, @0x00000000D83DDC72, @0x00000000D83DDC73, @0x00000000D83DDC6E, @0x00000000D83DDC77, @0x00000000D83DDC82, - @0x00000000D83DDC76, @0x00000000D83DDC66, @0x00000000D83DDC67, @0x00000000D83DDC68, @0x00000000D83DDC69, @0x00000000D83DDC74, @0x00000000D83DDC75, - @0x00000000D83DDC71, @0x00000000D83DDC7C, @0x00000000D83DDC78, @0x00000000D83DDE3A, @0x00000000D83DDE38, @0x00000000D83DDE3B, @0x00000000D83DDE3D, - @0x00000000D83DDE3C, @0x00000000D83DDE40, @0x00000000D83DDE3F, @0x00000000D83DDE39, @0x00000000D83DDE3E, @0x00000000D83DDC79, @0x00000000D83DDC7A, - @0x00000000D83DDE48, @0x00000000D83DDE49, @0x00000000D83DDE4A, @0x00000000D83DDC80, @0x00000000D83DDC7D, @0x00000000D83DDCA9, @0x00000000D83DDD25, - @0x0000000000002728, @0x00000000D83CDF1F, @0x00000000D83DDCAB, @0x00000000D83DDCA5, @0x00000000D83DDCA2, @0x00000000D83DDCA6, @0x00000000D83DDCA7, - @0x00000000D83DDCA4, @0x00000000D83DDCA8, @0x00000000D83DDC42, @0x00000000D83DDC40, @0x00000000D83DDC43, @0x00000000D83DDC45, @0x00000000D83DDC44, - @0x00000000D83DDC4D, @0x00000000D83DDC4E, @0x00000000D83DDC4C, @0x00000000D83DDC4A, @0x000000000000270A, @0x000000000000270C, @0x00000000D83DDC4B, - @0x000000000000270B, @0x00000000D83DDC50, @0x00000000D83DDC46, @0x00000000D83DDC47, @0x00000000D83DDC49, @0x00000000D83DDC48, @0x00000000D83DDE4C, - @0x00000000D83DDE4F, @0x000000000000261D, @0x00000000D83DDC4F, @0x00000000D83DDCAA, @0x00000000D83DDEB6, @0x00000000D83CDFC3, @0x00000000D83DDC83, - @0x00000000D83DDC6B, @0x00000000D83DDC6A, @0x00000000D83DDC6C, @0x00000000D83DDC6D, @0x00000000D83DDC8F, @0x00000000D83DDC91, @0x00000000D83DDC6F, - @0x00000000D83DDE46, @0x00000000D83DDE45, @0x00000000D83DDC81, @0x00000000D83DDE4B, @0x00000000D83DDC86, @0x00000000D83DDC87, @0x00000000D83DDC85, - @0x00000000D83DDC70, @0x00000000D83DDE4E, @0x00000000D83DDE4D, @0x00000000D83DDE47, @0x00000000D83CDFA9, @0x00000000D83DDC51, @0x00000000D83DDC52, - @0x00000000D83DDC5F, @0x00000000D83DDC5E, @0x00000000D83DDC61, @0x00000000D83DDC60, @0x00000000D83DDC62, @0x00000000D83DDC55, @0x00000000D83DDC54, - @0x00000000D83DDC5A, @0x00000000D83DDC57, @0x00000000D83CDFBD, @0x00000000D83DDC56, @0x00000000D83DDC58, @0x00000000D83DDC59, @0x00000000D83DDCBC, - @0x00000000D83DDC5C, @0x00000000D83DDC5D, @0x00000000D83DDC5B, @0x00000000D83DDC53, @0x00000000D83CDF80, @0x00000000D83CDF02, @0x00000000D83DDC84, - @0x00000000D83DDC9B, @0x00000000D83DDC99, @0x00000000D83DDC9C, @0x00000000D83DDC9A, @0x0000000000002764, @0x00000000D83DDC94, @0x00000000D83DDC97, - @0x00000000D83DDC93, @0x00000000D83DDC95, @0x00000000D83DDC96, @0x00000000D83DDC9E, @0x00000000D83DDC98, @0x00000000D83DDC8C, @0x00000000D83DDC8B, - @0x00000000D83DDC8D, @0x00000000D83DDC8E, @0x00000000D83DDC64, @0x00000000D83DDC65, @0x00000000D83DDCAC, @0x00000000D83DDC63, @0x00000000D83DDCAD], - - @[@0x00000000D83DDC36, @0x00000000D83DDC3A, @0x00000000D83DDC31, @0x00000000D83DDC2D, @0x00000000D83DDC39, @0x00000000D83DDC30, @0x00000000D83DDC38, - @0x00000000D83DDC2F, @0x00000000D83DDC28, @0x00000000D83DDC3B, @0x00000000D83DDC37, @0x00000000D83DDC3D, @0x00000000D83DDC2E, @0x00000000D83DDC17, - @0x00000000D83DDC35, @0x00000000D83DDC12, @0x00000000D83DDC34, @0x00000000D83DDC11, @0x00000000D83DDC18, @0x00000000D83DDC3C, @0x00000000D83DDC27, - @0x00000000D83DDC26, @0x00000000D83DDC24, @0x00000000D83DDC25, @0x00000000D83DDC23, @0x00000000D83DDC14, @0x00000000D83DDC0D, @0x00000000D83DDC22, - @0x00000000D83DDC1B, @0x00000000D83DDC1D, @0x00000000D83DDC1C, @0x00000000D83DDC1E, @0x00000000D83DDC0C, @0x00000000D83DDC19, @0x00000000D83DDC1A, - @0x00000000D83DDC20, @0x00000000D83DDC1F, @0x00000000D83DDC2C, @0x00000000D83DDC33, @0x00000000D83DDC0B, @0x00000000D83DDC04, @0x00000000D83DDC0F, - @0x00000000D83DDC00, @0x00000000D83DDC03, @0x00000000D83DDC05, @0x00000000D83DDC07, @0x00000000D83DDC09, @0x00000000D83DDC0E, @0x00000000D83DDC10, - @0x00000000D83DDC13, @0x00000000D83DDC15, @0x00000000D83DDC16, @0x00000000D83DDC01, @0x00000000D83DDC02, @0x00000000D83DDC32, @0x00000000D83DDC21, - @0x00000000D83DDC0A, @0x00000000D83DDC2B, @0x00000000D83DDC2A, @0x00000000D83DDC06, @0x00000000D83DDC08, @0x00000000D83DDC29, @0x00000000D83DDC3E, - @0x00000000D83DDC90, @0x00000000D83CDF38, @0x00000000D83CDF37, @0x00000000D83CDF40, @0x00000000D83CDF39, @0x00000000D83CDF3B, @0x00000000D83CDF3A, - @0x00000000D83CDF41, @0x00000000D83CDF43, @0x00000000D83CDF42, @0x00000000D83CDF3F, @0x00000000D83CDF3E, @0x00000000D83CDF44, @0x00000000D83CDF35, - @0x00000000D83CDF34, @0x00000000D83CDF32, @0x00000000D83CDF33, @0x00000000D83CDF30, @0x00000000D83CDF31, @0x00000000D83CDF3C, @0x00000000D83CDF10, - @0x00000000D83CDF1E, @0x00000000D83CDF1D, @0x00000000D83CDF1A, @0x00000000D83CDF11, @0x00000000D83CDF12, @0x00000000D83CDF13, @0x00000000D83CDF14, - @0x00000000D83CDF15, @0x00000000D83CDF16, @0x00000000D83CDF17, @0x00000000D83CDF18, @0x00000000D83CDF1C, @0x00000000D83CDF1B, @0x00000000D83CDF19, - @0x00000000D83CDF0D, @0x00000000D83CDF0E, @0x00000000D83CDF0F, @0x00000000D83CDF0B, @0x00000000D83CDF0C, @0x00000000D83CDF20, @0x0000000000002B50, - @0x0000000000002600, @0x00000000000026C5, @0x0000000000002601, @0x00000000000026A1, @0x0000000000002614, @0x0000000000002744, @0x00000000000026C4, - @0x00000000D83CDF00, @0x00000000D83CDF01, @0x00000000D83CDF08, @0x00000000D83CDF0A], - - @[@0x00000000D83CDF8D, @0x00000000D83DDC9D, @0x00000000D83CDF8E, @0x00000000D83CDF92, @0x00000000D83CDF93, @0x00000000D83CDF8F, @0x00000000D83CDF86, @0x00000000D83CDF87, - @0x00000000D83CDF90, @0x00000000D83CDF91, @0x00000000D83CDF83, @0x00000000D83DDC7B, @0x00000000D83CDF85, @0x00000000D83CDF84, @0x00000000D83CDF81, - @0x00000000D83CDF8B, @0x00000000D83CDF89, @0x00000000D83CDF8A, @0x00000000D83CDF88, @0x00000000D83CDF8C, @0x00000000D83DDD2E, @0x00000000D83CDFA5, - @0x00000000D83DDCF7, @0x00000000D83DDCF9, @0x00000000D83DDCFC, @0x00000000D83DDCBF, @0x00000000D83DDCC0, @0x00000000D83DDCBD, @0x00000000D83DDCBE, - @0x00000000D83DDCBB, @0x00000000D83DDCF1, @0x000000000000260E, @0x00000000D83DDCDE, @0x00000000D83DDCDF, @0x00000000D83DDCE0, @0x00000000D83DDCE1, - @0x00000000D83DDCFA, @0x00000000D83DDCFB, @0x00000000D83DDD0A, @0x00000000D83DDD09, @0x00000000D83DDD08, @0x00000000D83DDD07, @0x00000000D83DDD14, @0x00000000D83DDD15, - @0x00000000D83DDCE2, @0x00000000D83DDCE3, @0x00000000000023F3, @0x000000000000231B, @0x00000000000023F0, @0x000000000000231A, - @0x00000000D83DDD13, @0x00000000D83DDD12, @0x00000000D83DDD0F, @0x00000000D83DDD10, @0x00000000D83DDD11, @0x00000000D83DDD0E, @0x00000000D83DDCA1, - @0x00000000D83DDD26, @0x00000000D83DDD06, @0x00000000D83DDD05, @0x00000000D83DDD0C, @0x00000000D83DDD0B, @0x00000000D83DDD0D, @0x00000000D83DDEC1, @0x00000000D83DDEC0, - @0x00000000D83DDEBF, @0x00000000D83DDEBD, @0x00000000D83DDD27, @0x00000000D83DDD29, @0x00000000D83DDD28, @0x00000000D83DDEAA, @0x00000000D83DDEAC, - @0x00000000D83DDCA3, @0x00000000D83DDD2B, @0x00000000D83DDD2A, @0x00000000D83DDC8A, @0x00000000D83DDC89, @0x00000000D83DDCB0, @0x00000000D83DDCB4, - @0x00000000D83DDCB5, @0x00000000D83DDCB7, @0x00000000D83DDCB6, @0x00000000D83DDCB3, @0x00000000D83DDCB8, @0x00000000D83DDCF2, @0x00000000D83DDCE7, - @0x00000000D83DDCE5, @0x00000000D83DDCE4, @0x0000000000002709, @0x00000000D83DDCE9, @0x00000000D83DDCE8, @0x00000000D83DDCEF, @0x00000000D83DDCEB, - @0x00000000D83DDCEA, @0x00000000D83DDCEC, @0x00000000D83DDCED, @0x00000000D83DDCEE, @0x00000000D83DDCE6, @0x00000000D83DDCDD, @0x00000000D83DDCC4, - @0x00000000D83DDCC3, @0x00000000D83DDCD1, @0x00000000D83DDCCA, @0x00000000D83DDCC8, @0x00000000D83DDCC9, @0x00000000D83DDCDC, @0x00000000D83DDCCB, - @0x00000000D83DDCC5, @0x00000000D83DDCC6, @0x00000000D83DDCC7, @0x00000000D83DDCC1, @0x00000000D83DDCC2, @0x0000000000002702, @0x00000000D83DDCCC, - @0x00000000D83DDCCE, @0x0000000000002712, @0x000000000000270F, @0x00000000D83DDCCF, @0x00000000D83DDCD0, @0x00000000D83DDCD5, @0x00000000D83DDCD7, - @0x00000000D83DDCD8, @0x00000000D83DDCD9, @0x00000000D83DDCD3, @0x00000000D83DDCD4, @0x00000000D83DDCD2, @0x00000000D83DDCDA, @0x00000000D83DDCD6, - @0x00000000D83DDD16, @0x00000000D83DDCDB, @0x00000000D83DDD2C, @0x00000000D83DDD2D, @0x00000000D83DDCF0, @0x00000000D83CDFA8, @0x00000000D83CDFAC, - @0x00000000D83CDFA4, @0x00000000D83CDFA7, @0x00000000D83CDFBC, @0x00000000D83CDFB5, @0x00000000D83CDFB6, @0x00000000D83CDFB9, @0x00000000D83CDFBB, - @0x00000000D83CDFBA, @0x00000000D83CDFB7, @0x00000000D83CDFB8, @0x00000000D83DDC7E, @0x00000000D83CDFAE, @0x00000000D83CDCCF, @0x00000000D83CDFB4, - @0x00000000D83CDC04, @0x00000000D83CDFB2, @0x00000000D83CDFAF, @0x00000000D83CDFC8, @0x00000000D83CDFC0, @0x00000000000026BD, @0x00000000000026BE, - @0x00000000D83CDFBE, @0x00000000D83CDFB1, @0x00000000D83CDFC9, @0x00000000D83CDFB3, @0x00000000000026F3, @0x00000000D83DDEB5, @0x00000000D83DDEB4, - @0x00000000D83CDFC1, @0x00000000D83CDFC7, @0x00000000D83CDFC6, @0x00000000D83CDFBF, @0x00000000D83CDFC2, @0x00000000D83CDFCA, @0x00000000D83CDFC4, - @0x00000000D83CDFA3, @0x0000000000002615, @0x00000000D83CDF75, @0x00000000D83CDF76, @0x00000000D83CDF7C, @0x00000000D83CDF7A, @0x00000000D83CDF7B, - @0x00000000D83CDF78, @0x00000000D83CDF79, @0x00000000D83CDF77, @0x00000000D83CDF74, @0x00000000D83CDF55, @0x00000000D83CDF54, @0x00000000D83CDF5F, - @0x00000000D83CDF57, @0x00000000D83CDF56, @0x00000000D83CDF5D, @0x00000000D83CDF5B, @0x00000000D83CDF64, @0x00000000D83CDF71, @0x00000000D83CDF63, - @0x00000000D83CDF65, @0x00000000D83CDF59, @0x00000000D83CDF58, @0x00000000D83CDF5A, @0x00000000D83CDF5C, @0x00000000D83CDF72, @0x00000000D83CDF62, - @0x00000000D83CDF61, @0x00000000D83CDF73, @0x00000000D83CDF5E, @0x00000000D83CDF69, @0x00000000D83CDF6E, @0x00000000D83CDF66, @0x00000000D83CDF68, - @0x00000000D83CDF67, @0x00000000D83CDF82, @0x00000000D83CDF70, @0x00000000D83CDF6A, @0x00000000D83CDF6B, @0x00000000D83CDF6C, @0x00000000D83CDF6D, - @0x00000000D83CDF6F, @0x00000000D83CDF4E, @0x00000000D83CDF4F, @0x00000000D83CDF4A, @0x00000000D83CDF4B, @0x00000000D83CDF52, @0x00000000D83CDF47, - @0x00000000D83CDF49, @0x00000000D83CDF53, @0x00000000D83CDF51, @0x00000000D83CDF48, @0x00000000D83CDF4C, @0x00000000D83CDF50, @0x00000000D83CDF4D, - @0x00000000D83CDF60, @0x00000000D83CDF46, @0x00000000D83CDF45, @0x00000000D83CDF3D], - - @[@0x00000000D83CDFE0, @0x00000000D83CDFE1, @0x00000000D83CDFEB, @0x00000000D83CDFE2, @0x00000000D83CDFE3, @0x00000000D83CDFE5, @0x00000000D83CDFE6, @0x00000000D83CDFEA, - @0x00000000D83CDFE9, @0x00000000D83CDFE8, @0x00000000D83DDC92, @0x00000000000026EA, @0x00000000D83CDFEC, @0x00000000D83CDFE4, @0x00000000D83CDF07, - @0x00000000D83CDF06, @0x00000000D83CDFEF, @0x00000000D83CDFF0, @0x00000000000026FA, @0x00000000D83CDFED, @0x00000000D83DDDFC, @0x00000000D83DDDFE, - @0x00000000D83DDDFB, @0x00000000D83CDF04, @0x00000000D83CDF05, @0x00000000D83CDF03, @0x00000000D83DDDFD, @0x00000000D83CDF09, @0x00000000D83CDFA0, - @0x00000000D83CDFA1, @0x00000000000026F2, @0x00000000D83CDFA2, @0x00000000D83DDEA2, @0x00000000000026F5, @0x00000000D83DDEA4, @0x00000000D83DDEA3, - @0x0000000000002693, @0x00000000D83DDE80, @0x0000000000002708, @0x00000000D83DDCBA, @0x00000000D83DDE81, @0x00000000D83DDE82, @0x00000000D83DDE8A, - @0x00000000D83DDE89, @0x00000000D83DDE9E, @0x00000000D83DDE86, @0x00000000D83DDE84, @0x00000000D83DDE85, @0x00000000D83DDE88, @0x00000000D83DDE87, - @0x00000000D83DDE9D, @0x00000000D83DDE8B, @0x00000000D83DDE83, @0x00000000D83DDE8E, @0x00000000D83DDE8C, @0x00000000D83DDE8D, @0x00000000D83DDE99, - @0x00000000D83DDE98, @0x00000000D83DDE97, @0x00000000D83DDE95, @0x00000000D83DDE96, @0x00000000D83DDE9B, @0x00000000D83DDE9A, @0x00000000D83DDEA8, - @0x00000000D83DDE93, @0x00000000D83DDE94, @0x00000000D83DDE92, @0x00000000D83DDE91, @0x00000000D83DDE90, @0x00000000D83DDEB2, @0x00000000D83DDEA1, - @0x00000000D83DDE9F, @0x00000000D83DDEA0, @0x00000000D83DDE9C, @0x00000000D83DDC88, @0x00000000D83DDE8F, @0x00000000D83CDFAB, @0x00000000D83DDEA6, - @0x00000000D83DDEA5, @0x00000000000026A0, @0x00000000D83DDEA7, @0x00000000D83DDD30, @0x00000000000026FD, @0x00000000D83CDFEE, @0x00000000D83CDFB0, - @0x0000000000002668, @0x00000000D83DDDFF, @0x00000000D83CDFAA, @0x00000000D83CDFAD, @0x00000000D83DDCCD, @0x00000000D83DDEA9, @0xD83CDDEFD83CDDF5, - @0xD83CDDF0D83CDDF7, @0xD83CDDE9D83CDDEA, @0xD83CDDE8D83CDDF3, @0xD83CDDFAD83CDDF8, @0xD83CDDEBD83CDDF7, @0xD83CDDEAD83CDDF8, @0xD83CDDEED83CDDF9, - @0xD83CDDF7D83CDDFA, @0xD83CDDECD83CDDE7], - - @[@0x00000000003120E3, @0x00000000003220E3, @0x00000000003320E3, @0x00000000003420E3, @0x00000000003520E3, @0x00000000003620E3, @0x00000000003720E3, @0x00000000003820E3, - @0x00000000003920E3, @0x00000000003020E3, @0x00000000D83DDD1F, @0x00000000D83DDD22, @0x00000000002320E3, @0x00000000D83DDD23, @0x0000000000002B06, - @0x0000000000002B07, @0x0000000000002B05, @0x00000000000027A1, @0x00000000D83DDD20, @0x00000000D83DDD21, @0x00000000D83DDD24, @0x0000000000002197, - @0x0000000000002196, @0x0000000000002198, @0x0000000000002199, @0x0000000000002194, @0x0000000000002195, @0x00000000D83DDD04, @0x00000000000025C0, - @0x00000000000025B6, @0x00000000D83DDD3C, @0x00000000D83DDD3D, @0x00000000000021A9, @0x00000000000021AA, @0x0000000000002139, @0x00000000000023EA, - @0x00000000000023E9, @0x00000000000023EB, @0x00000000000023EC, @0x0000000000002935, @0x0000000000002934, @0x00000000D83CDD97, @0x00000000D83DDD00, - @0x00000000D83DDD01, @0x00000000D83DDD02, @0x00000000D83CDD95, @0x00000000D83CDD99, @0x00000000D83CDD92, @0x00000000D83CDD93, @0x00000000D83CDD96, - @0x00000000D83DDCF6, @0x00000000D83CDFA6, @0x00000000D83CDE01, @0x00000000D83CDE2F, @0x00000000D83CDE33, @0x00000000D83CDE35, @0x00000000D83CDE32, - @0x00000000D83CDE34, @0x00000000D83CDE50, @0x00000000D83CDE39, @0x00000000D83CDE3A, @0x00000000D83CDE36, @0x00000000D83CDE1A, - @0x00000000D83DDEBB, @0x00000000D83DDEB9, @0x00000000D83DDEBA, @0x00000000D83DDEBC, @0x00000000D83DDEBE, @0x00000000D83DDEB0, @0x00000000D83DDEAE, - @0x00000000D83CDD7F, @0x000000000000267F, @0x00000000D83DDEAD, @0x00000000D83CDE37, @0x00000000D83CDE38, @0x00000000D83CDE02, @0x00000000000024C2, - @0x00000000D83DDEC2, @0x00000000D83DDEC4, @0x00000000D83DDEC5, @0x00000000D83DDEC3, - @0x00000000D83CDE51, @0x0000000000003299, @0x0000000000003297, @0x00000000D83CDD91, @0x00000000D83CDD98, @0x00000000D83CDD94, @0x00000000D83DDEAB, - @0x00000000D83DDD1E, @0x00000000D83DDCF5, @0x00000000D83DDEAF, @0x00000000D83DDEB1, @0x00000000D83DDEB3, @0x00000000D83DDEB7, @0x00000000D83DDEB8, - @0x00000000000026D4, @0x0000000000002733, @0x0000000000002747, @0x000000000000274E, @0x0000000000002705, @0x0000000000002734, @0x00000000D83DDC9F, - @0x00000000D83CDD9A, @0x00000000D83DDCF3, @0x00000000D83DDCF4, @0x00000000D83CDD70, @0x00000000D83CDD71, @0x00000000D83CDD8E, @0x00000000D83CDD7E, - @0x00000000D83DDCA0, @0x00000000000027BF, @0x000000000000267B, @0x0000000000002648, @0x0000000000002649, @0x000000000000264A, @0x000000000000264B, - @0x000000000000264C, @0x000000000000264D, @0x000000000000264E, @0x000000000000264F, @0x0000000000002650, @0x0000000000002651, @0x0000000000002652, - @0x0000000000002653, @0x00000000000026CE, @0x00000000D83DDD2F, @0x00000000D83CDFE7, @0x00000000D83DDCB9, @0x00000000D83DDCB2, @0x00000000D83DDCB1, - @0x00000000000000A9, @0x00000000000000AE, @0x0000000000002122, @0x000000000000303D, @0x0000000000003030, @0x00000000D83DDD1D, @0x00000000D83DDD1A, - @0x00000000D83DDD19, @0x00000000D83DDD1B, @0x00000000D83DDD1C, @0x000000000000274C, @0x0000000000002B55, @0x0000000000002757, @0x000000000000203C, @0x0000000000002049, @0x0000000000002753, - @0x0000000000002755, @0x0000000000002754, @0x00000000D83DDD03, @0x00000000D83DDD5B, @0x00000000D83DDD67, @0x00000000D83DDD50, @0x00000000D83DDD5C, - @0x00000000D83DDD51, @0x00000000D83DDD5D, @0x00000000D83DDD52, @0x00000000D83DDD5E, @0x00000000D83DDD53, @0x00000000D83DDD5F, @0x00000000D83DDD54, - @0x00000000D83DDD60, @0x00000000D83DDD55, @0x00000000D83DDD56, @0x00000000D83DDD57, @0x00000000D83DDD58, @0x00000000D83DDD59, @0x00000000D83DDD5A, - @0x00000000D83DDD61, @0x00000000D83DDD62, @0x00000000D83DDD63, @0x00000000D83DDD64, @0x00000000D83DDD65, @0x00000000D83DDD66, @0x0000000000002716, - @0x0000000000002795, @0x0000000000002796, @0x0000000000002797, @0x0000000000002660, @0x0000000000002665, @0x0000000000002663, @0x0000000000002666, - @0x00000000D83DDCAE, @0x00000000D83DDCAF, @0x0000000000002714, @0x0000000000002611, @0x00000000D83DDD18, @0x00000000D83DDD17, @0x00000000000027B0, - @0x00000000D83DDD31, @0x00000000D83DDD32, @0x00000000D83DDD33, @0x00000000000025FC, @0x00000000000025FB, @0x00000000000025FE, @0x00000000000025FD, - @0x00000000000025AA, @0x00000000000025AB, @0x00000000D83DDD3A, @0x0000000000002B1C, @0x0000000000002B1B, @0x00000000000026AB, @0x00000000000026AA, - @0x00000000D83DDD34, @0x00000000D83DDD35, @0x00000000D83DDD3B, @0x00000000D83DDD36, @0x00000000D83DDD37, @0x00000000D83DDD38, @0x00000000D83DDD39]]; - - float scales[] = {1.0f, 1.5f, 2.0f, 3.0f}; - - for (int s = 0; s < 4; s++) { - float scale = scales[s]; - - CTFontRef font = CTFontCreateWithName(CFSTR("AppleColorEmoji"), 30.0f * scale, nil); - NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(font), kCTFontAttributeName, nil]; - - for (int b = 0; b < array2.count; b++) { - NSArray *array = [array2 objectAtIndex:b]; - int countPerRow = sqrt(array.count); - int rowsCount = ceil(array.count / (float)countPerRow); - - // On iOS 4.0 and Mac OS X v10.6 you can pass null for data - size_t width = countPerRow * 30 * scale; - size_t height = rowsCount * 30 * scale; - char *data = malloc(width * height * 4); - char *dataGray = malloc(width * height); - memset(data, 0, width * height * 4); - memset(dataGray, 0, width * height); - - CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); - CGBitmapInfo bitmapInfo = (CGBitmapInfo)kCGImageAlphaPremultipliedLast; - CGContextRef ctx = CGBitmapContextCreate(data, width, height, 8, width * 4, space, bitmapInfo); - CGColorSpaceRelease(space); - CGContextSetRGBFillColor(ctx, 0.0, 0.0, 0.0, 0.0); - CGContextFillRect(ctx, CGRectMake(0.0, 0.0, width, height)); - - CGColorSpaceRef spaceGray = CGColorSpaceCreateDeviceGray(); - CGBitmapInfo bitmapInfoGray = (CGBitmapInfo)kCGImageAlphaNone; - CGContextRef ctxGray = CGBitmapContextCreate(dataGray, width, height, 8, width, spaceGray, bitmapInfoGray); - CGColorSpaceRelease(spaceGray); - CGContextSetRGBFillColor(ctxGray, 0.0, 0.0, 0.0, 0.0); - CGContextFillRect(ctxGray, CGRectMake(0.0, 0.0, width, height)); - - - for (int a = 0; a < array.count; a++) { - unsigned long long val = [[array objectAtIndex:a] unsignedLongLongValue]; - NSData *buff = [NSData dataWithBytes:&val length:sizeof(unsigned long long)]; - buff = [self reversedData:buff]; - NSString *str = [[NSString alloc] initWithData:buff encoding:NSUnicodeStringEncoding]; - NSLog(@"%llu %@", val, str); - - NSAttributedString *as = [[NSAttributedString alloc] initWithString:str attributes:attributes]; - CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)as); - CGFloat ascent, descent, leading; - size_t fWidth = CTLineGetTypographicBounds(line, &ascent, &descent, &leading); - CGRect rect = CTLineGetImageBounds(line, NULL); - - CGFloat x = a % countPerRow * 30 * scale + (30 * scale - fWidth); - CGFloat y = height - (a / countPerRow * 30 * scale) - rect.origin.y - 30 * scale; - CGContextSetTextPosition(ctx, x, y); - CTLineDraw(line, ctx); - - CFRelease(line); - } - - // Save as JPEG - CGImageRef imageRef = CGBitmapContextCreateImage(ctx); - NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithCGImage:imageRef]; - NSAssert(imageRep, @"imageRep must not be nil"); - NSData *imageData = [imageRep representationUsingType:NSJPEGFileType properties:@{NSImageCompressionFactor:@0.4f, NSImageFallbackBackgroundColor:[NSColor blackColor]}]; - NSString *fileName = [NSString stringWithFormat:@"Desktop/emoji/emoji%.01fx_%d.jpg", scale, b]; - NSString *fileDirectory = NSHomeDirectory(); - NSString *filePath = [fileDirectory stringByAppendingPathComponent:fileName]; - [imageData writeToFile:filePath atomically:YES]; - CGImageRelease(imageRef); - - for (int a = 0; a < width * height; a++) { - char alpha = data[a * 4 + 3]; - if (alpha == 0) { - dataGray[a] = 0; - } else { - dataGray[a] = alpha; - } - } - - imageRef = CGBitmapContextCreateImage(ctxGray); - imageRep = [[NSBitmapImageRep alloc] initWithCGImage:imageRef]; - NSAssert(imageRep, @"imageRep must not be nil"); - imageData = [imageRep representationUsingType:NSJPEGFileType properties:@{NSImageCompressionFactor:@0.01f, NSImageColorSyncProfileData:[NSColorSpace deviceGrayColorSpace]}]; - fileName = [NSString stringWithFormat:@"Desktop/emoji/emoji%.01fx_a_%d.jpg", scale, b]; - filePath = [fileDirectory stringByAppendingPathComponent:fileName]; - [imageData writeToFile:filePath atomically:YES]; - CGImageRelease(imageRef); - free(data); - } - CFRelease(font); - } -} - -@end diff --git a/gradle.properties b/gradle.properties index 1d8c9c146..6887017ab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Sat Mar 12 05:53:50 MSK 2016 -APP_VERSION_CODE=4464 -APP_VERSION_NAME=10.9.1 +APP_VERSION_CODE=4571 +APP_VERSION_NAME=10.10.0 APP_PACKAGE=org.telegram.messenger RELEASE_KEY_PASSWORD=android RELEASE_KEY_ALIAS=androidkey